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, 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);