From: Ulrich Drepper Date: Fri, 20 Oct 2000 06:33:30 +0000 (+0000) Subject: (_nss_hesiod_initgroups_dyn): Correctly handle numeric group member information.... X-Git-Tag: cvs/glibc-2_1_96~78 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=521a2f6584a8deb317f42dbe780a1c373b6e4e6a;p=platform%2Fupstream%2Fglibc.git (_nss_hesiod_initgroups_dyn): Correctly handle numeric group member information. Complete test for strtol overflow. --- diff --git a/hesiod/nss_hesiod/hesiod-grp.c b/hesiod/nss_hesiod/hesiod-grp.c index 5551d7d..cb7c087 100644 --- a/hesiod/nss_hesiod/hesiod-grp.c +++ b/hesiod/nss_hesiod/hesiod-grp.c @@ -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);