diff options
author | 2015-08-01 10:10:13 +0000 | |
---|---|---|
committer | 2015-08-01 10:10:13 +0000 | |
commit | b3591c99a329ccaa6eb1c750cd56e5302278b288 (patch) | |
tree | 59d6d494664d271d3884d6c160775cfa965eb1c0 | |
parent | b5923de9cf2bb5b9ce6184a3692c9776b05a4a39 (diff) | |
download | pw-darwin-b3591c99a329ccaa6eb1c750cd56e5302278b288.tar.gz pw-darwin-b3591c99a329ccaa6eb1c750cd56e5302278b288.tar.zst pw-darwin-b3591c99a329ccaa6eb1c750cd56e5302278b288.zip |
Validate the max_uid/max_gid boundaries and entry type in pw.conf
-rw-r--r-- | pw/pw_conf.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/pw/pw_conf.c b/pw/pw_conf.c index d351a8f..c6a86b7 100644 --- a/pw/pw_conf.c +++ b/pw/pw_conf.c @@ -230,6 +230,7 @@ read_userconfig(char const * file) char *buf, *p; size_t linecap; ssize_t linelen; + const char *errstr; buf = NULL; linecap = 0; @@ -323,20 +324,35 @@ read_userconfig(char const * file) ? NULL : newstr(q); break; case _UC_MINUID: - if ((q = unquote(q)) != NULL && isdigit(*q)) - config.min_uid = (uid_t) atol(q); + if ((q = unquote(q)) != NULL) { + errstr = NULL; + config.min_uid = strtounum(q, 0, UID_MAX, &errstr); + if (errstr) + warnx("Invalid min_uid: '%s', ignoring", q); + } break; case _UC_MAXUID: - if ((q = unquote(q)) != NULL && isdigit(*q)) - config.max_uid = (uid_t) atol(q); + if ((q = unquote(q)) != NULL) { + errstr = NULL; + config.max_uid = strtounum(q, 0, UID_MAX, &errstr); + if (errstr) + warnx("Invalid max_uid: '%s', ignoring", q); + } break; case _UC_MINGID: if ((q = unquote(q)) != NULL && isdigit(*q)) - config.min_gid = (gid_t) atol(q); + errstr = NULL; + config.min_gid = strtounum(q, 0, GID_MAX, &errstr); + if (errstr) + warnx("Invalid min_gid: '%s', ignoring", q); break; case _UC_MAXGID: - if ((q = unquote(q)) != NULL && isdigit(*q)) - config.max_gid = (gid_t) atol(q); + if ((q = unquote(q)) != NULL) { + errstr = NULL; + config.max_gid = strtounum(q, 0, GID_MAX, &errstr); + if (errstr) + warnx("Invalid max_gid: '%s', ignoring", q); + } break; case _UC_EXPIRE: if ((q = unquote(q)) != NULL && isdigit(*q)) |