diff options
author | Ulrich Drepper <drepper@redhat.com> | 2000-10-20 06:33:30 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2000-10-20 06:33:30 +0000 |
commit | 521a2f6584a8deb317f42dbe780a1c373b6e4e6a (patch) | |
tree | 2b563261dc4edea0553d06d2ea7e49b76c859930 /hesiod | |
parent | aab0963999b40fac0b8df76a889097e8bd703e1f (diff) | |
download | glibc-521a2f6584a8deb317f42dbe780a1c373b6e4e6a.tar.gz |
(_nss_hesiod_initgroups_dyn): Correctly handle numeric group member information. Complete test for strtol overflow.
Diffstat (limited to 'hesiod')
-rw-r--r-- | hesiod/nss_hesiod/hesiod-grp.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/hesiod/nss_hesiod/hesiod-grp.c b/hesiod/nss_hesiod/hesiod-grp.c index 5551d7d012..cb7c0870e2 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); |