Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 1 Aug 2015 10:25:55 +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: r286152 - head/usr.sbin/pw
Message-ID:  <201508011025.t71APunU081369@repo.freebsd.org>

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

Log:
  Validate expiration days and password days from commmand line and pw.conf

Modified:
  head/usr.sbin/pw/pw.c
  head/usr.sbin/pw/pw_conf.c
  head/usr.sbin/pw/pw_user.c
  head/usr.sbin/pw/pwupd.h

Modified: head/usr.sbin/pw/pw.c
==============================================================================
--- head/usr.sbin/pw/pw.c	Sat Aug  1 10:10:13 2015	(r286151)
+++ head/usr.sbin/pw/pw.c	Sat Aug  1 10:25:55 2015	(r286152)
@@ -262,6 +262,11 @@ main(int argc, char *argv[])
 		case 'c':
 			conf.gecos = pw_checkname(optarg, 1);
 			break;
+		case 'e':
+			conf.expire_days = strtonum(optarg, 0, INT_MAX, &errstr);
+			if (errstr)
+				errx(EX_USAGE, "Invalid expired days: %s", optarg);
+			break;
 		case 'g':
 			if (which == 0) { /* for user* */
 				addarg(&arglist, 'g', optarg);
@@ -321,6 +326,11 @@ main(int argc, char *argv[])
 		case 'o':
 			conf.checkduplicate = false;
 			break;
+		case 'p':
+			conf.password_days = strtonum(optarg, 0, INT_MAX, &errstr);
+			if (errstr)
+				errx(EX_USAGE, "Invalid password days: %s", optarg);
+			break;
 		case 'q':
 			conf.quiet = true;
 			break;

Modified: head/usr.sbin/pw/pw_conf.c
==============================================================================
--- head/usr.sbin/pw/pw_conf.c	Sat Aug  1 10:10:13 2015	(r286151)
+++ head/usr.sbin/pw/pw_conf.c	Sat Aug  1 10:25:55 2015	(r286152)
@@ -355,12 +355,20 @@ read_userconfig(char const * file)
 				}
 				break;
 			case _UC_EXPIRE:
-				if ((q = unquote(q)) != NULL && isdigit(*q))
-					config.expire_days = atoi(q);
+				if ((q = unquote(q)) != NULL) {
+					errstr = NULL;
+					config.expire_days = strtonum(q, 0, INT_MAX, &errstr);
+					if (errstr)
+						warnx("Invalid expire days: '%s', ignoring", q);
+				}
 				break;
 			case _UC_PASSWORD:
-				if ((q = unquote(q)) != NULL && isdigit(*q))
-					config.password_days = atoi(q);
+				if ((q = unquote(q)) != NULL) {
+					errstr = NULL;
+					config.password_days = strtonum(q, 0, INT_MAX, &errstr);
+					if (errstr)
+						warnx("Invalid password days: '%s', ignoring", q);
+				}
 				break;
 			case _UC_FIELDS:
 			case _UC_NONE:

Modified: head/usr.sbin/pw/pw_user.c
==============================================================================
--- head/usr.sbin/pw/pw_user.c	Sat Aug  1 10:10:13 2015	(r286151)
+++ head/usr.sbin/pw/pw_user.c	Sat Aug  1 10:25:55 2015	(r286152)
@@ -418,14 +418,14 @@ pw_user(int mode, char *name, long id, s
 			errx(EX_OSFILE, "root home `%s' is not a directory", cnf->home);
 	}
 
-	if ((arg = getarg(args, 'e')) != NULL)
-		cnf->expire_days = atoi(arg->val);
+	if (conf.expire_days > 0)
+		cnf->expire_days = conf.expire_days;
 
 	if ((arg = getarg(args, 'y')) != NULL)
 		cnf->nispasswd = arg->val;
 
-	if ((arg = getarg(args, 'p')) != NULL && arg->val)
-		cnf->password_days = atoi(arg->val);
+	if (conf.password_days > 0)
+		cnf->password_days = conf.password_days;
 
 	if ((arg = getarg(args, 'g')) != NULL) {
 		if (!*(p = arg->val))	/* Handle empty group list specially */

Modified: head/usr.sbin/pw/pwupd.h
==============================================================================
--- head/usr.sbin/pw/pwupd.h	Sat Aug  1 10:10:13 2015	(r286151)
+++ head/usr.sbin/pw/pwupd.h	Sat Aug  1 10:25:55 2015	(r286152)
@@ -86,6 +86,8 @@ struct pwconf {
 	char		*newname;
 	char		*config;
 	char		*gecos;
+	int		 expire_days;
+	int		 password_days;
 	int		 fd;
 	int		 rootfd;
 	int		 which;



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