diff options
Diffstat (limited to 'nslcd/hackers_parse.c')
-rw-r--r-- | nslcd/hackers_parse.c | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/nslcd/hackers_parse.c b/nslcd/hackers_parse.c index c26feae..7eb0e4f 100644 --- a/nslcd/hackers_parse.c +++ b/nslcd/hackers_parse.c @@ -31,8 +31,7 @@ #include <unistd.h> /* for sysconf(3) */ #include "hackers_parse.h" - -/* None of the malloc-ish calls are error checked. Bite me. */ +#include "hackers.h" #define DEFAULT_PASSWORD "!" @@ -40,7 +39,8 @@ do { \ errno = 0; \ if (!(expr)) { \ - error(0, errno, "ASSERT(%s) failed", #expr); \ + error(0, errno, "%s:%d: ASSERT(%s) failed", \ + __FILE__, __LINE__, #expr); \ goto error; \ } \ } while(0) @@ -76,10 +76,11 @@ #define PW_SHELL (1 << 6) #define PW_ALL ((1 << 7) - 1) +/* Returns GID_INVALID on error */ static gid_t name2gid(const char *name) { - gid_t gid = 0; + gid_t gid = GID_INVALID; char *buf = NULL; ssize_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX); if (buflen < 1) @@ -107,16 +108,17 @@ bool is_numeric(const char *str) { size_t i; for (i = 0; str[i] != '\0'; i++) { - if ('0' > str[i] || str[i] > '9') + if ('0' > str[i] || str[i] > '9') return false; } return (i > 0); } +/* Returns UID_INVALID on error */ uid_t filename2uid(const char *filename) { if (filename == NULL) - return 0; + return UID_INVALID; char *tmp = strdupa(filename); char *bname = basename(tmp); @@ -124,7 +126,7 @@ filename2uid(const char *filename) { if ((strcmp(ext, ".yml") != 0) || (ext != &bname[4])) return 0; ext[0] = '\0'; - uid_t uid = is_numeric(bname) ? atoi(bname) : 0; + uid_t uid = is_numeric(bname) ? (uid_t)atoi(bname) : UID_INVALID; return uid; } @@ -136,19 +138,22 @@ load_user_password(struct passwd *user) { ssize_t line_len; size_t line_cap = 0; + errno = 0; if (asprintf(&filename, "%s/.password", user->pw_dir) < 0) - goto nopassword; + goto error; if ((file = fopen(filename, "r")) == NULL) goto nopassword; // TODO: check permissions on 'file' if ((line_len = getline(&line, &line_cap, file)) < 1) - goto nopassword; + goto error; if (line[line_len-1] == '\n') line[--line_len] = '\0'; free(filename); fclose(file); user->pw_passwd = line; return 0; + error: + error(0, errno, "unexpected error in %s", __func__); nopassword: free(filename); free(line); @@ -159,6 +164,7 @@ load_user_password(struct passwd *user) { #define NODE(id) yaml_document_get_node(&yaml_document, id) int load_user_yaml(const char *filename, struct passwd *user) { + errno = 0; int ret = -1; unsigned char flags = 0; @@ -168,8 +174,7 @@ load_user_yaml(const char *filename, struct passwd *user) { yaml_parser_t yaml_parser; ZERO(yaml_parser); yaml_document_t yaml_document; ZERO(yaml_document); - uid_t uid; - ASSERT((uid = user->pw_uid = filename2uid(filename)) > 0); + ASSERT((user->pw_uid = filename2uid(filename)) != UID_INVALID); flags |= PW_UID; ASSERT((yaml_file = fopen(filename, "r")) != NULL); @@ -191,11 +196,11 @@ load_user_yaml(const char *filename, struct passwd *user) { flags |= PW_NAME | PW_DIR; } if (strcmp("fullname", STR_VALUE(key))==0) { - user->pw_gecos = strdup(STR_VALUE(val)); + ASSERT((user->pw_gecos = strdup(STR_VALUE(val))) != NULL); flags |= PW_GECOS; } if (strcmp("shell", STR_VALUE(key))==0) { - user->pw_shell = strdup(STR_VALUE(val)); + ASSERT((user->pw_shell = strdup(STR_VALUE(val))) != NULL); flags |= PW_SHELL; } if (strcmp("groups", STR_VALUE(key))==0) { @@ -208,7 +213,7 @@ load_user_yaml(const char *filename, struct passwd *user) { if (itemp == val->data.sequence.items.start) { /* primary group */ char *grp_name = STR_VALUE(item); - ASSERT((user->pw_gid = name2gid(grp_name)) > 0); + ASSERT((user->pw_gid = name2gid(grp_name)) != GID_INVALID); flags |= PW_GID; } else { /* secondary group */ @@ -226,8 +231,9 @@ load_user_yaml(const char *filename, struct passwd *user) { ret = 0; goto end; error: + error(0, errno, "error when parsing %s", filename); PASSWD_FREE(*user); - user->pw_uid = uid; + user->pw_uid = UID_INVALID; end: yaml_document_delete(&yaml_document); yaml_parser_delete(&yaml_parser); |