summaryrefslogtreecommitdiff
path: root/nslcd/hackers_parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'nslcd/hackers_parse.c')
-rw-r--r--nslcd/hackers_parse.c36
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;
}