diff --git a/ds4_agent.c b/ds4_agent.c index c16d6499..95f92925 100644 --- a/ds4_agent.c +++ b/ds4_agent.c @@ -388,11 +388,16 @@ static bool parse_power_percent(const char *arg, int *out) { return true; } -static uint64_t parse_u64(const char *s, const char *opt) { +static uint64_t parse_seed(const char *s) { char *end = NULL; + if (s[0] == '\0' || s[0] == '-') { + fprintf(stderr, "ds4-agent: invalid value for --seed: %s\n", s); + exit(2); + } + errno = 0; unsigned long long v = strtoull(s, &end, 10); - if (s[0] == '\0' || *end != '\0' || v == 0) { - fprintf(stderr, "ds4-agent: invalid value for %s: %s\n", opt, s); + if (*end != '\0' || errno == ERANGE || v == 0) { + fprintf(stderr, "ds4-agent: invalid value for --seed: %s\n", s); exit(2); } return (uint64_t)v; @@ -541,7 +546,7 @@ static agent_config parse_options(int argc, char **argv) { } else if (!strcmp(arg, "--min-p")) { c.gen.min_p = parse_float_range(need_arg(&i, argc, argv, arg), arg, 0.0f, 1.0f); } else if (!strcmp(arg, "--seed")) { - c.gen.seed = parse_u64(need_arg(&i, argc, argv, arg), arg); + c.gen.seed = parse_seed(need_arg(&i, argc, argv, arg)); } else if (!strcmp(arg, "--think")) { c.gen.think_mode = DS4_THINK_HIGH; } else if (!strcmp(arg, "--think-max")) { diff --git a/ds4_cli.c b/ds4_cli.c index 7bd1bb37..e01de61a 100644 --- a/ds4_cli.c +++ b/ds4_cli.c @@ -214,11 +214,16 @@ static int parse_int(const char *s, const char *opt) { return (int)v; } -static uint64_t parse_u64(const char *s, const char *opt) { +static uint64_t parse_seed(const char *s) { char *end = NULL; + if (s[0] == '\0' || s[0] == '-') { + fprintf(stderr, "ds4: invalid value for --seed: %s\n", s); + exit(2); + } + errno = 0; unsigned long long v = strtoull(s, &end, 10); - if (s[0] == '\0' || *end != '\0' || v == 0) { - fprintf(stderr, "ds4: invalid value for %s: %s\n", opt, s); + if (*end != '\0' || errno == ERANGE || v == 0) { + fprintf(stderr, "ds4: invalid value for --seed: %s\n", s); exit(2); } return (uint64_t)v; @@ -1444,7 +1449,7 @@ static cli_config parse_options(int argc, char **argv) { } else if (!strcmp(arg, "--min-p")) { c.gen.min_p = parse_float_range(need_arg(&i, argc, argv, arg), arg, 0.0f, 1.0f); } else if (!strcmp(arg, "--seed")) { - c.gen.seed = parse_u64(need_arg(&i, argc, argv, arg), arg); + c.gen.seed = parse_seed(need_arg(&i, argc, argv, arg)); } else if (!strcmp(arg, "--quality")) { c.engine.quality = true; } else if (!strcmp(arg, "--power")) { diff --git a/ds4_eval.c b/ds4_eval.c index 5d80e88c..ccf0f92b 100644 --- a/ds4_eval.c +++ b/ds4_eval.c @@ -1429,11 +1429,16 @@ static int parse_int_arg(const char *s, const char *opt) { return (int)v; } -static uint64_t parse_u64_arg(const char *s, const char *opt) { +static uint64_t parse_seed_arg(const char *s) { char *end = NULL; + if (s[0] == '\0' || s[0] == '-') { + fprintf(stderr, "ds4-eval: invalid value for --seed: %s\n", s); + exit(2); + } + errno = 0; unsigned long long v = strtoull(s, &end, 10); - if (s[0] == '\0' || *end != '\0' || v == 0) { - fprintf(stderr, "ds4-eval: invalid value for %s: %s\n", opt, s); + if (*end != '\0' || errno == ERANGE || v == 0) { + fprintf(stderr, "ds4-eval: invalid value for --seed: %s\n", s); exit(2); } return (uint64_t)v; @@ -1556,7 +1561,7 @@ static eval_config parse_options(int argc, char **argv) { } else if (!strcmp(arg, "--min-p")) { c.min_p = parse_float_arg(need_arg(&i, argc, argv, arg), arg, 0.0f, 1.0f); } else if (!strcmp(arg, "--seed")) { - c.seed = parse_u64_arg(need_arg(&i, argc, argv, arg), arg); + c.seed = parse_seed_arg(need_arg(&i, argc, argv, arg)); } else if (!strcmp(arg, "--trace")) { c.trace_path = need_arg(&i, argc, argv, arg); } else if (!strcmp(arg, "--regrade-trace")) { diff --git a/ds4_server.c b/ds4_server.c index 62fabc1b..73b3ad5e 100644 --- a/ds4_server.c +++ b/ds4_server.c @@ -11235,6 +11235,17 @@ static int parse_nonneg_int_arg(const char *s, const char *opt) { return (int)v; } +static int parse_port_arg(const char *s) { + char *end = NULL; + errno = 0; + long v = strtol(s, &end, 10); + if (!s[0] || *end || errno == ERANGE || v < 1 || v > 65535) { + server_log(DS4_LOG_DEFAULT, "ds4-server: --port must be between 1 and 65535: %s", s); + exit(2); + } + return (int)v; +} + static float parse_float_arg(const char *s, const char *opt, float minv, float maxv) { char *end = NULL; float v = strtof(s, &end); @@ -11439,7 +11450,7 @@ static server_config parse_options(int argc, char **argv) { } else if (!strcmp(arg, "--host")) { c.host = need_arg(&i, argc, argv, arg); } else if (!strcmp(arg, "--port")) { - c.port = parse_int_arg(need_arg(&i, argc, argv, arg), arg); + c.port = parse_port_arg(need_arg(&i, argc, argv, arg)); } else if (!strcmp(arg, "--cors")) { c.enable_cors = true; } else if (!strcmp(arg, "--trace")) {