Page MenuHomeFreeBSD

D54919.id170649.diff
No OneTemporary

D54919.id170649.diff

diff --git a/usr.sbin/cpucontrol/cpucontrol.c b/usr.sbin/cpucontrol/cpucontrol.c
--- a/usr.sbin/cpucontrol/cpucontrol.c
+++ b/usr.sbin/cpucontrol/cpucontrol.c
@@ -36,7 +36,9 @@
#include <errno.h>
#include <dirent.h>
#include <fcntl.h>
+#include <inttypes.h>
#include <paths.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -112,6 +114,21 @@
exit(EX_USAGE);
}
+static uint32_t
+strtouint32(const char *str, char **endptr, int base)
+{
+ uintmax_t val;
+
+ errno = 0;
+ val = strtoumax(str, endptr, base);
+ if (*str == '\0' || errno == ERANGE || val > UINT32_MAX) {
+ WARNX(0, "invalid operand: %s", str);
+ exit(EX_USAGE);
+ /* NOTREACHED */
+ }
+ return ((uint32_t)val);
+}
+
static int
do_cpuid(const char *cmdarg, const char *dev)
{
@@ -123,7 +140,7 @@
assert(cmdarg != NULL);
assert(dev != NULL);
- level = strtoul(cmdarg, &endptr, 16);
+ level = strtouint32(cmdarg, &endptr, 16);
if (*cmdarg == '\0' || *endptr != '\0') {
WARNX(0, "incorrect operand: %s", cmdarg);
usage();
@@ -162,7 +179,7 @@
assert(cmdarg != NULL);
assert(dev != NULL);
- level = strtoul(cmdarg, &endptr, 16);
+ level = strtouint32(cmdarg, &endptr, 16);
if (*cmdarg == '\0' || *endptr == '\0') {
WARNX(0, "incorrect or missing operand: %s", cmdarg);
usage();
@@ -172,7 +189,7 @@
cmdarg1 = strstr(endptr, ",");
/* ... and skip past it */
cmdarg1 += 1;
- level_type = strtoul(cmdarg1, &endptr1, 16);
+ level_type = strtouint32(cmdarg1, &endptr1, 16);
if (*cmdarg1 == '\0' || *endptr1 != '\0') {
WARNX(0, "incorrect or missing operand: %s", cmdarg);
usage();
@@ -228,7 +245,7 @@
/*
* Parse command string.
*/
- msr = strtoul(cmdarg, &endptr, 16);
+ msr = strtouint32(cmdarg, &endptr, 16);
switch (*endptr) {
case '\0':
op = OP_READ;

File Metadata

Mime Type
text/plain
Expires
Thu, Jan 29, 9:18 PM (15 h, 42 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28069452
Default Alt Text
D54919.id170649.diff (1 KB)

Event Timeline