2004-07-30  Guido Guenther  <agx@sigxcpu.org>

	* nss/getent.c (passwd_keys): Use strtoul instead of isdigit to
	test if the key is numeric or not.
	(group_keys): Likewise.
This commit is contained in:
Ulrich Drepper 2004-08-06 09:25:59 +00:00
parent a55bda85ba
commit 9030e7c44a
6 changed files with 128 additions and 44 deletions

View File

@ -1,3 +1,9 @@
2004-07-30 Guido Guenther <agx@sigxcpu.org>
* nss/getent.c (passwd_keys): Use strtoul instead of isdigit to
test if the key is numeric or not.
(group_keys): Likewise.
2004-08-05 Ulrich Drepper <drepper@redhat.com> 2004-08-05 Ulrich Drepper <drepper@redhat.com>
* inet/netinet/in.h: Define struct ip_msfilter, IP_MSFILTER_SIZE, * inet/netinet/in.h: Define struct ip_msfilter, IP_MSFILTER_SIZE,

View File

@ -206,16 +206,13 @@ group_keys (int number, char *key[])
for (i = 0; i < number; ++i) for (i = 0; i < number; ++i)
{ {
if (isdigit (key[i][0])) errno = 0;
{ char *ep;
char *ep; gid_t arg_gid = strtoul(key[i], &ep, 10);
gid_t arg_gid = strtoul (key[i], &ep, 10);
if (*key[i] != '\0' && *ep == '\0') /* valid numeric uid */ if (errno != EINVAL && *key[i] != '\0' && *ep == '\0')
grp = getgrgid (arg_gid); /* Valid numeric gid. */
else grp = getgrgid (arg_gid);
grp = NULL;
}
else else
grp = getgrnam (key[i]); grp = getgrnam (key[i]);
@ -481,16 +478,13 @@ passwd_keys (int number, char *key[])
for (i = 0; i < number; ++i) for (i = 0; i < number; ++i)
{ {
if (isdigit (key[i][0])) errno = 0;
{ char *ep;
char *ep; uid_t arg_uid = strtoul(key[i], &ep, 10);
uid_t arg_uid = strtoul (key[i], &ep, 10);
if (*key[i] != '\0' && *ep == '\0') /* valid numeric uid */ if (errno != EINVAL && *key[i] != '\0' && *ep == '\0')
pwd = getpwuid (arg_uid); /* Valid numeric uid. */
else pwd = getpwuid (arg_uid);
pwd = NULL;
}
else else
pwd = getpwnam (key[i]); pwd = getpwnam (key[i]);

View File

@ -23,6 +23,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <sys/param.h>
#include <sys/socket.h> #include <sys/socket.h>
@ -33,20 +34,21 @@ getipv4sourcefilter (int s, struct in_addr interface, struct in_addr group,
/* We have to create an struct ip_msfilter object which we can pass /* We have to create an struct ip_msfilter object which we can pass
to the kernel. */ to the kernel. */
socklen_t needed = IP_MSFILTER_SIZE (*numsrc); socklen_t needed = IP_MSFILTER_SIZE (*numsrc);
int use_malloc = __libc_use_alloca (needed); int use_alloca = __libc_use_alloca (needed);
struct ip_msfilter *imsf; struct ip_msfilter *imsf;
if (use_malloc) if (use_alloca)
imsf = (struct ip_msfilter *) alloca (needed);
else
{ {
imsf = (struct ip_msfilter *) malloc (needed); imsf = (struct ip_msfilter *) malloc (needed);
if (imsf == NULL) if (imsf == NULL)
return -1; return -1;
} }
else
imsf = (struct ip_msfilter *) alloca (needed);
imsf->imsf_multiaddr = group; imsf->imsf_multiaddr = group;
imsf->imsf_interface = interface; imsf->imsf_interface = interface;
imsf->imsf_numsrc = *numsrc;
int result = __getsockopt (s, SOL_IP, IP_MSFILTER, imsf, &needed); int result = __getsockopt (s, SOL_IP, IP_MSFILTER, imsf, &needed);
@ -55,12 +57,12 @@ getipv4sourcefilter (int s, struct in_addr interface, struct in_addr group,
if (result == 0) if (result == 0)
{ {
*fmode = imsf->imsf_fmode; *fmode = imsf->imsf_fmode;
*numsrc = imsf->imsf_numsrc;
memcpy (slist, imsf->imsf_slist, memcpy (slist, imsf->imsf_slist,
imsf->imsf_numsrc * sizeof (struct in_addr)); MIN (*numsrc, imsf->imsf_numsrc) * sizeof (struct in_addr));
*numsrc = imsf->imsf_numsrc;
} }
if (use_malloc) if (! use_alloca)
{ {
int save_errno = errno; int save_errno = errno;
free (imsf); free (imsf);

View File

@ -19,13 +19,74 @@
02111-1307 USA. */ 02111-1307 USA. */
#include <alloca.h> #include <alloca.h>
#include <assert.h>
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <netatalk/at.h>
#include <netax25/ax25.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <netipx/ipx.h>
#include <netpacket/packet.h>
#include <netrose/rose.h>
#include <sys/param.h>
#include <sys/socket.h> #include <sys/socket.h>
static const struct
{
int sol;
int af;
socklen_t size;
} sol_map[] =
{
/* Sort the array according to importance of the protocols. Add
more protocols when they become available. */
{ SOL_IP, AF_INET, sizeof (struct sockaddr_in) },
{ SOL_IPV6, AF_INET6, sizeof (struct sockaddr_in6) },
{ SOL_AX25, AF_AX25, sizeof (struct sockaddr_ax25) },
{ SOL_IPX, AF_IPX, sizeof (struct sockaddr_ipx) },
{ SOL_ATALK, AF_APPLETALK, sizeof (struct sockaddr_at) },
{ SOL_ROSE, AF_ROSE, sizeof (struct sockaddr_rose) },
{ SOL_PACKET, AF_PACKET, sizeof (struct sockaddr_ll) }
};
#define NSOL_MAP (sizeof (sol_map) / sizeof (sol_map[0]))
/* Try to determine the socket level value. Ideally both side and
family are set. But sometimes only the size is correct and the
family value might be bogus. Loop over the array entries and look
for a perfect match or the first match based on size. */
int
__get_sol (int af, socklen_t len)
{
int first_size_sol = -1;
for (size_t cnt = 0; cnt < NSOL_MAP; ++cnt)
{
/* Just a test so that we make sure the special value used to
signal the "we have so far no socket level value" is OK. */
assert (sol_map[cnt].sol != -1);
if (len == sol_map[cnt].size)
{
/* The size matches, which is a requirement. If the family
matches, too, we have a winner. Otherwise we remember the
socket level value for this protocol if it is the first
match. */
if (af == sol_map[cnt].af)
/* Bingo! */
return sol_map[cnt].sol;
if (first_size_sol == -1)
first_size_sol = sol_map[cnt].sol;
}
}
return first_size_sol;
}
int int
getsourcefilter (int s, uint32_t interface, struct sockaddr *group, getsourcefilter (int s, uint32_t interface, struct sockaddr *group,
socklen_t grouplen, uint32_t *fmode, uint32_t *numsrc, socklen_t grouplen, uint32_t *fmode, uint32_t *numsrc,
@ -34,34 +95,43 @@ getsourcefilter (int s, uint32_t interface, struct sockaddr *group,
/* We have to create an struct ip_msfilter object which we can pass /* We have to create an struct ip_msfilter object which we can pass
to the kernel. */ to the kernel. */
socklen_t needed = GROUP_FILTER_SIZE (*numsrc); socklen_t needed = GROUP_FILTER_SIZE (*numsrc);
int use_malloc = __libc_use_alloca (needed); int use_alloca = __libc_use_alloca (needed);
struct group_filter *gf; struct group_filter *gf;
if (use_malloc) if (use_alloca)
gf = (struct group_filter *) alloca (needed);
else
{ {
gf = (struct group_filter *) malloc (needed); gf = (struct group_filter *) malloc (needed);
if (gf == NULL) if (gf == NULL)
return -1; return -1;
} }
else
gf = (struct group_filter *) alloca (needed);
gf->gf_interface = interface; gf->gf_interface = interface;
memcpy (&gf->gf_group, group, grouplen); memcpy (&gf->gf_group, group, grouplen);
gf->gf_numsrc = *numsrc;
int result = __getsockopt (s, SOL_IP, MCAST_MSFILTER, gf, &needed); /* We need to provide the appropriate socket level value. */
int sol = __get_sol (group->sa_family, grouplen);
if (sol == -1)
{
__set_errno (EINVAL);
return -1;
}
int result = __getsockopt (s, sol, MCAST_MSFILTER, gf, &needed);
/* If successful, copy the results to the places the caller wants /* If successful, copy the results to the places the caller wants
them in. */ them in. */
if (result == 0) if (result == 0)
{ {
*fmode = gf->gf_fmode; *fmode = gf->gf_fmode;
*numsrc = gf->gf_numsrc;
memcpy (slist, gf->gf_slist, memcpy (slist, gf->gf_slist,
gf->gf_numsrc * sizeof (struct sockaddr_storage)); MIN (*numsrc, gf->gf_numsrc) * sizeof (struct sockaddr_storage));
*numsrc = gf->gf_numsrc;
} }
if (use_malloc) if (! use_alloca)
{ {
int save_errno = errno; int save_errno = errno;
free (gf); free (gf);

View File

@ -33,17 +33,17 @@ setipv4sourcefilter (int s, struct in_addr interface, struct in_addr group,
/* We have to create an struct ip_msfilter object which we can pass /* We have to create an struct ip_msfilter object which we can pass
to the kernel. */ to the kernel. */
size_t needed = IP_MSFILTER_SIZE (numsrc); size_t needed = IP_MSFILTER_SIZE (numsrc);
int use_malloc = __libc_use_alloca (needed); int use_alloca = __libc_use_alloca (needed);
struct ip_msfilter *imsf; struct ip_msfilter *imsf;
if (use_malloc) if (use_alloca)
imsf = (struct ip_msfilter *) alloca (needed);
else
{ {
imsf = (struct ip_msfilter *) malloc (needed); imsf = (struct ip_msfilter *) malloc (needed);
if (imsf == NULL) if (imsf == NULL)
return -1; return -1;
} }
else
imsf = (struct ip_msfilter *) alloca (needed);
imsf->imsf_multiaddr = group; imsf->imsf_multiaddr = group;
imsf->imsf_interface = interface; imsf->imsf_interface = interface;
@ -53,7 +53,7 @@ setipv4sourcefilter (int s, struct in_addr interface, struct in_addr group,
int result = __setsockopt (s, SOL_IP, IP_MSFILTER, imsf, needed); int result = __setsockopt (s, SOL_IP, IP_MSFILTER, imsf, needed);
if (use_malloc) if (! use_alloca)
{ {
int save_errno = errno; int save_errno = errno;
free (imsf); free (imsf);

View File

@ -26,6 +26,10 @@
#include <sys/socket.h> #include <sys/socket.h>
/* Defined in getsourcefilter.c. */
extern int __get_sol (int af, socklen_t len);
int int
setsourcefilter (int s, uint32_t interface, struct sockaddr *group, setsourcefilter (int s, uint32_t interface, struct sockaddr *group,
socklen_t grouplen, uint32_t fmode, uint32_t numsrc, socklen_t grouplen, uint32_t fmode, uint32_t numsrc,
@ -34,17 +38,17 @@ setsourcefilter (int s, uint32_t interface, struct sockaddr *group,
/* We have to create an struct ip_msfilter object which we can pass /* We have to create an struct ip_msfilter object which we can pass
to the kernel. */ to the kernel. */
size_t needed = GROUP_FILTER_SIZE (numsrc); size_t needed = GROUP_FILTER_SIZE (numsrc);
int use_malloc = __libc_use_alloca (needed); int use_alloca = __libc_use_alloca (needed);
struct group_filter *gf; struct group_filter *gf;
if (use_malloc) if (use_alloca)
gf = (struct group_filter *) alloca (needed);
else
{ {
gf = (struct group_filter *) malloc (needed); gf = (struct group_filter *) malloc (needed);
if (gf == NULL) if (gf == NULL)
return -1; return -1;
} }
else
gf = (struct group_filter *) alloca (needed);
gf->gf_interface = interface; gf->gf_interface = interface;
memcpy (&gf->gf_group, group, grouplen); memcpy (&gf->gf_group, group, grouplen);
@ -52,9 +56,17 @@ setsourcefilter (int s, uint32_t interface, struct sockaddr *group,
gf->gf_numsrc = numsrc; gf->gf_numsrc = numsrc;
memcpy (gf->gf_slist, slist, numsrc * sizeof (struct sockaddr_storage)); memcpy (gf->gf_slist, slist, numsrc * sizeof (struct sockaddr_storage));
int result = __setsockopt (s, SOL_IP, MCAST_MSFILTER, gf, needed); /* We need to provide the appropriate socket level value. */
int sol = __get_sol (group->sa_family, grouplen);
if (sol == -1)
{
__set_errno (EINVAL);
return -1;
}
if (use_malloc) int result = __setsockopt (s, sol, MCAST_MSFILTER, gf, needed);
if (! use_alloca)
{ {
int save_errno = errno; int save_errno = errno;
free (gf); free (gf);