* defs.h (string_to_uint_ex): New prototype.
(string_to_uint_upto): New function, a thin wrapper around
string_to_uint_ex.
* util.c (string_to_uint_ex): New function.
(string_to_uint): Change into a thin wrapper around string_to_uint_upto.
* strace.c (init): Use string_to_uint_upto.
* syscall.c (qualify_scno, qual_signal, qual_desc): Use
string_to_uint_upto instead of string_to_uint.
extern const char *xlat_search(const struct xlat *, const size_t, const uint64_t);
extern unsigned long get_pagesize(void);
+extern int
+string_to_uint_ex(const char *str, char **endptr,
+ unsigned int max_val, const char *accepted_ending);
extern int string_to_uint(const char *str);
+static inline int
+string_to_uint_upto(const char *const str, unsigned int max_val)
+{
+ return string_to_uint_ex(str, NULL, max_val, NULL);
+}
extern int next_set_bit(const void *bit_array, unsigned cur_bit, unsigned size_bits);
#define QUOTE_0_TERMINATED 0x01
die_out_of_memory();
break;
case 'I':
- opt_intr = string_to_uint(optarg);
- if (opt_intr <= 0 || opt_intr >= NUM_INTR_OPTS)
+ opt_intr = string_to_uint_upto(optarg, NUM_INTR_OPTS - 1);
+ if (opt_intr <= 0)
error_opt_arg(c, optarg);
break;
default:
qualify_scno(const char *const s, const unsigned int bitflag,
const int not)
{
- unsigned int i;
-
- if (*s < '0' || *s > '9' || (i = string_to_uint(s)) >= MAX_NSYSCALLS)
+ int i = string_to_uint_upto(s, MAX_NSYSCALLS - 1);
+ if (i < 0)
return false;
qualify_one(i, bitflag, not, -1);
unsigned int i;
if (*s >= '0' && *s <= '9') {
- int signo = string_to_uint(s);
- if (signo < 0 || signo > 255)
+ int signo = string_to_uint_upto(s, 255);
+ if (signo < 0)
return -1;
qualify_one(signo, bitflag, not, -1);
return 0;
static int
qual_desc(const char *s, const unsigned int bitflag, const int not)
{
- if (*s >= '0' && *s <= '9') {
- int desc = string_to_uint(s);
- if (desc < 0 || desc > 0x7fff) /* paranoia */
- return -1;
- qualify_one(desc, bitflag, not, -1);
- return 0;
- }
- return -1;
+ int desc = string_to_uint_upto(s, 0x7fff);
+ if (desc < 0)
+ return -1;
+ qualify_one(desc, bitflag, not, -1);
+ return 0;
}
void
#include "ptrace.h"
int
-string_to_uint(const char *str)
+string_to_uint_ex(const char *const str, char **const endptr,
+ const unsigned int max_val, const char *const accepted_ending)
{
- char *error;
- long value;
+ char *end;
+ long val;
if (!*str)
return -1;
- errno = 0;
- value = strtol(str, &error, 10);
- if (errno || *error || value < 0 || (long)(int)value != value)
+
+ val = strtol(str, &end, 10);
+
+ if (str == end || val < 0 || (unsigned long) val > max_val)
return -1;
- return (int)value;
+
+ if (*end && (!accepted_ending || !strchr(accepted_ending, *end)))
+ return -1;
+
+ if (endptr)
+ *endptr = end;
+
+ return (int) val;
+}
+
+int
+string_to_uint(const char *const str)
+{
+ return string_to_uint_upto(str, INT_MAX);
}
int