svn commit: r362236 - head/usr.sbin/mpsutil

Juli Mallett jmallett at FreeBSD.org
Tue Jun 16 19:21:29 UTC 2020


Author: jmallett
Date: Tue Jun 16 19:21:28 2020
New Revision: 362236
URL: https://svnweb.freebsd.org/changeset/base/362236

Log:
  Improve unit parsing of mpsutil.
  
  Previously, it used atoi(3) to parse the unit parameter, which would silently
  yield a unit of 0 in the presence of an invalid unit number.  As most users of
  mpsutil(8) are likely to have at least a unit 0, this is could have confusing
  results.
  
  This behaviour was particularly unintuitive if one incorrectly passed an
  adapter device name, or a device path, instead of a unit number.  In addition
  to using strtoumax(3) instead of atoi(3) to parse unit numbers, support
  stripping a device name (e.g. mps1) or path (e.g. /dev/mps2) to just its unit
  number.
  
  Reviewed by:	scottl (earlier version)

Modified:
  head/usr.sbin/mpsutil/mpsutil.c

Modified: head/usr.sbin/mpsutil/mpsutil.c
==============================================================================
--- head/usr.sbin/mpsutil/mpsutil.c	Tue Jun 16 18:39:56 2020	(r362235)
+++ head/usr.sbin/mpsutil/mpsutil.c	Tue Jun 16 19:21:28 2020	(r362236)
@@ -37,6 +37,8 @@ __RCSID("$FreeBSD$");
 #include <sys/param.h>
 #include <sys/errno.h>
 #include <err.h>
+#include <inttypes.h>
+#include <paths.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -91,6 +93,8 @@ int
 main(int ac, char **av)
 {
 	struct mpsutil_command **cmd;
+	uintmax_t unit;
+	char *end;
 	int ch;
 
 	is_mps = !strcmp(getprogname(), "mpsutil");
@@ -98,7 +102,17 @@ main(int ac, char **av)
 	while ((ch = getopt(ac, av, "u:h?")) != -1) {
 		switch (ch) {
 		case 'u':
-			mps_unit = atoi(optarg);
+			if (strncmp(optarg, _PATH_DEV, strlen(_PATH_DEV)) == 0) {
+				optarg += strlen(_PATH_DEV);
+				if (strncmp(optarg, is_mps ? "mps" : "mpr", 3) != 0)
+					errx(1, "Invalid device: %s", optarg);
+			}
+			if (strncmp(optarg, is_mps ? "mps" : "mpr", 3) == 0)
+				optarg += 3;
+			unit = strtoumax(optarg, &end, 10);
+			if (*end != '\0' || unit == UINTMAX_MAX || unit > INT_MAX)
+				errx(1, "Invalid unit: %s", optarg);
+			mps_unit = unit;
 			break;
 		case 'h':
 		case '?':


More information about the svn-src-all mailing list