diff options
author | Eric Andersen <andersen@codepoet.org> | 2002-04-13 15:13:59 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2002-04-13 15:13:59 +0000 |
commit | 929686ba6a01168aee43cb3b854d24133f4ef38e (patch) | |
tree | 50b87b9891d721ea194f97d013dc30267c04019f | |
parent | 520204fff130a917266f452ed672a0885b8e0d8f (diff) |
Patch from Jim Treadway <jim@stardot-tech.com>:
The internal __getgrent function doesn't allocate enough memory to hold
the trailing NULL pointer in the gr_mem member of the returned 'struct
group *'.
-rw-r--r-- | libc/pwd_grp/__getgrent.c | 28 |
1 files changed, 9 insertions, 19 deletions
diff --git a/libc/pwd_grp/__getgrent.c b/libc/pwd_grp/__getgrent.c index d1bf8e61e..2da45973f 100644 --- a/libc/pwd_grp/__getgrent.c +++ b/libc/pwd_grp/__getgrent.c @@ -145,26 +145,16 @@ struct group *__getgrent(int grp_fd) } #else /* !GR_SCALE_DYNAMIC */ if (members != NULL) - free(members); - members = (char **) malloc(1 * sizeof(char *)); - - while ((ptr = strchr(ptr, ',')) != NULL) { - *ptr = '\0'; - ptr++; - members[member_num] = field_begin; - field_begin = ptr; - member_num++; - members = - (char **) realloc((void *) members, - - (member_num + 1) * sizeof(char *)); - } - if (*field_begin == '\0') - members[member_num] = NULL; - else { - members[member_num] = field_begin; - members[member_num + 1] = NULL; + free(members); + members = (char **) malloc((member_num + 1) * sizeof(char *)); + for ( ; field_begin && *field_begin != '\0'; field_begin = ptr) { + if ((ptr = strchr(field_begin, ',')) != NULL) + *ptr++ = '\0'; + members[member_num++] = field_begin; + members = (char **) realloc(members, + (member_num + 1) * sizeof(char *)); } + members[member_num] = NULL; #endif /* GR_SCALE_DYNAMIC */ group.gr_mem = members; |