Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 1 Aug 2015 10:10:14 +0000 (UTC)
From:      Baptiste Daroussin <bapt@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r286151 - head/usr.sbin/pw
Message-ID:  <201508011010.t71AAEM5074809@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bapt
Date: Sat Aug  1 10:10:13 2015
New Revision: 286151
URL: https://svnweb.freebsd.org/changeset/base/286151

Log:
  Validate the max_uid/max_gid boundaries and entry type in pw.conf

Modified:
  head/usr.sbin/pw/pw_conf.c

Modified: head/usr.sbin/pw/pw_conf.c
==============================================================================
--- head/usr.sbin/pw/pw_conf.c	Sat Aug  1 09:55:47 2015	(r286150)
+++ head/usr.sbin/pw/pw_conf.c	Sat Aug  1 10:10:13 2015	(r286151)
@@ -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))



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201508011010.t71AAEM5074809>