X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fpasswd%2Fgetgr_r.c;h=3fe2e2b20b17ca4e182b8707ae68a4d1ebd8918c;hb=7cbb6f70c8fe711644ec0dbede1973cc6641a283;hp=1dc5f7e0e38df9398eaadbdb5e0291a546b599b8;hpb=4948a24df21c1e80bedc1f302547c9cb26e4dbfe;p=musl diff --git a/src/passwd/getgr_r.c b/src/passwd/getgr_r.c index 1dc5f7e0..3fe2e2b2 100644 --- a/src/passwd/getgr_r.c +++ b/src/passwd/getgr_r.c @@ -16,7 +16,7 @@ static int getgr_r(const char *name, gid_t gid, struct group *gr, char *buf, siz pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); - f = fopen("/etc/group", "rb"); + f = fopen("/etc/group", "rbe"); if (!f) { rv = errno; goto done; @@ -26,14 +26,14 @@ static int getgr_r(const char *name, gid_t gid, struct group *gr, char *buf, siz while (__getgrent_a(f, gr, &line, &len, &mem, &nmem)) { if (name && !strcmp(name, gr->gr_name) || !name && gr->gr_gid == gid) { - if (size < len + nmem*sizeof(char *) + 32) { + if (size < len + (nmem+1)*sizeof(char *) + 32) { rv = ERANGE; break; } *res = gr; buf += (16-(uintptr_t)buf)%16; gr->gr_mem = (void *)buf; - buf += nmem*sizeof(char *); + buf += (nmem+1)*sizeof(char *); memcpy(buf, line, len); FIX(name); FIX(passwd);