summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortb <tb@openbsd.org>2016-03-07 19:16:06 +0000
committertb <tb@openbsd.org>2016-03-07 19:16:06 +0000
commit45dfdaaf6c2e0fdeca69cf06d74b357c1d6b7882 (patch)
tree4b7cdc69e1bd2caf33cdf8202982f09fd6c5b02c
parentrefactor canohost.c: move functions that cache results closer to the (diff)
downloadwireguard-openbsd-45dfdaaf6c2e0fdeca69cf06d74b357c1d6b7882.tar.xz
wireguard-openbsd-45dfdaaf6c2e0fdeca69cf06d74b357c1d6b7882.zip
Use the full idiom for error checking with strtoul(3), as
exemplified in the man page. Requested by deraadt@. Joint work with natano@ input and ok espie@, deraadt@
-rw-r--r--sbin/mknod/mknod.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/sbin/mknod/mknod.c b/sbin/mknod/mknod.c
index 91b311e5544..884dd6fa373 100644
--- a/sbin/mknod/mknod.c
+++ b/sbin/mknod/mknod.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mknod.c,v 1.28 2016/03/06 19:31:31 tb Exp $ */
+/* $OpenBSD: mknod.c,v 1.29 2016/03/07 19:16:06 tb Exp $ */
/* $NetBSD: mknod.c,v 1.8 1995/08/11 00:08:18 jtc Exp $ */
/*
@@ -21,12 +21,15 @@
#include <sys/types.h>
#include <sys/stat.h>
+
+#include <err.h>
+#include <errno.h>
+#include <limits.h>
+#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <locale.h>
-#include <err.h>
extern char *__progname;
@@ -69,7 +72,7 @@ main(int argc, char *argv[])
switch (ch) {
case 'm':
if (!(set = setmode(optarg)))
- errx(1, "invalid file mode '%s'",
+ errx(1, "invalid file mode '%s'",
optarg);
/*
* In symbolic mode strings, the + and -
@@ -147,20 +150,30 @@ compute_device(int argc, char **argv)
{
dev_t dev;
char *endp;
- u_int major, minor;
+ unsigned long major, minor;
if (argc < 4)
usage(0);
- major = (long)strtoul(argv[2], &endp, 0);
+
+ errno = 0;
+ major = strtoul(argv[2], &endp, 0);
if (endp == argv[2] || *endp != '\0')
errx(1, "invalid major number '%s'", argv[2]);
- minor = (long)strtoul(argv[3], &endp, 0);
+ if (errno == ERANGE && major == ULONG_MAX)
+ errx(1, "major number too large: '%s'", argv[2]);
+
+ errno = 0;
+ minor = strtoul(argv[3], &endp, 0);
if (endp == argv[3] || *endp != '\0')
errx(1, "invalid minor number '%s'", argv[3]);
+ if (errno == ERANGE && minor == ULONG_MAX)
+ errx(1, "minor number too large: '%s'", argv[3]);
+
dev = makedev(major, minor);
if (major(dev) != major || minor(dev) != minor)
- errx(1, "major or minor number too large (%u %u)", major,
+ errx(1, "major or minor number too large (%lu %lu)", major,
minor);
+
return dev;
}