mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-09 14:50:05 +00:00
(_nss_hesiod_initgroups_dyn): Correctly handle numeric group member information. Complete test for strtol overflow.
This commit is contained in:
parent
aab0963999
commit
521a2f6584
@ -174,6 +174,7 @@ _nss_hesiod_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
char *p;
|
||||
void *context;
|
||||
gid_t *groups = *groupsp;
|
||||
int save_errno;
|
||||
|
||||
context = _nss_hesiod_init ();
|
||||
if (context == NULL)
|
||||
@ -214,6 +215,8 @@ _nss_hesiod_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
groups[(*start)++] = group;
|
||||
}
|
||||
|
||||
save_errno = errno;
|
||||
|
||||
p = *list;
|
||||
while (*p != '\0')
|
||||
{
|
||||
@ -224,17 +227,24 @@ _nss_hesiod_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
status = NSS_STATUS_NOTFOUND;
|
||||
|
||||
q = p;
|
||||
while (*q != '\0' && *q != ':')
|
||||
while (*q != '\0' && *q != ':' && *q != ',')
|
||||
++q;
|
||||
|
||||
if (*q != '\0')
|
||||
*q++ = '\0';
|
||||
|
||||
__set_errno (0);
|
||||
val = strtol (p, &endp, 10);
|
||||
if (sizeof (gid_t) == sizeof (long int) || (gid_t) val == val)
|
||||
/* Test whether the number is representable in a variable of
|
||||
type `gid_t'. If not ignore the number. */
|
||||
if ((sizeof (gid_t) == sizeof (long int) || (gid_t) val == val)
|
||||
&& errno == 0)
|
||||
{
|
||||
if (*endp == '\0' && endp != p)
|
||||
status = NSS_STATUS_SUCCESS;
|
||||
{
|
||||
group = val;
|
||||
status = NSS_STATUS_SUCCESS;
|
||||
}
|
||||
else
|
||||
status = internal_gid_from_group (context, p, &group);
|
||||
|
||||
@ -270,6 +280,8 @@ _nss_hesiod_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
p = q;
|
||||
}
|
||||
|
||||
__set_errno (save_errno);
|
||||
|
||||
done:
|
||||
hesiod_free_list (context, list);
|
||||
hesiod_end (context);
|
||||
|
Loading…
Reference in New Issue
Block a user