diff options
Diffstat (limited to 'nslcd/hackers_parse.c')
-rw-r--r-- | nslcd/hackers_parse.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/nslcd/hackers_parse.c b/nslcd/hackers_parse.c index 2a98fc1..c26feae 100644 --- a/nslcd/hackers_parse.c +++ b/nslcd/hackers_parse.c @@ -47,10 +47,23 @@ /* Get a string value from a YAML scalar node */ #define STR_VALUE(node) \ - ({ \ + (__extension__ ({ \ ASSERT((node)->type == YAML_SCALAR_NODE); \ ((char*)(node)->data.scalar.value); \ - }) + })) + +#define MALLOC(size) REALLOC(NULL, size) + +#define REALLOC(ptr, size) \ + (__extension__ ({ \ + errno = 0; \ + void *ret = realloc(ptr, size); \ + if (ret == (ptr)) { \ + error(0, errno, "could not (re)allocate memory"); \ + goto error; \ + }; \ + ret; \ + })) /* Bitmask flags for the completion of the fields in * 'struct passwd' (which is defined in <pwd.h>) */ @@ -66,28 +79,25 @@ static gid_t name2gid(const char *name) { - gid_t gid; + gid_t gid = 0; + char *buf = NULL; ssize_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX); if (buflen < 1) buflen = 256; - char *buf = malloc(buflen); + buf = MALLOC(buflen); struct group grp; struct group *ret; while (getgrnam_r(name, &grp, buf, (size_t)buflen, &ret) < 0) { if (errno == ERANGE) { buflen += 256; - buf = realloc(buf, buflen); + buf = REALLOC(buf, buflen); } else { - gid = 0; - goto end; + goto error; } } - if (ret == NULL) { - gid = 0; - goto end; - } - gid = ret->gr_gid; - end: + if (ret != NULL) + gid = ret->gr_gid; + error: free(buf); return gid; } |