Cli: validate that width and height arguments are numbers

This commit is contained in:
josh committed 2026-10-30 13:55:08 -04:00
1 parent cc041168a1
commit c05f2b1b59
1 file changed
+35 -2
+35 -2
View File
@@ -2,6 +2,8 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h>
#include <stdint.h>
#define FLAGS \ #define FLAGS \
FLAG(height, "h", true) \ FLAG(height, "h", true) \
@@ -137,13 +139,41 @@ int Cli::run(int argc, char * argv[])
return 0; return 0;
} }
static bool parse_size(const char * flag, const char * value, size_t * out)
{
bool valid = value[0] != '\0';
for (const char * c = value; *c != '\0'; c++)
{
if (*c < '0' || *c > '9')
{
valid = false;
break;
}
}
if (valid)
{
errno = 0;
unsigned long long v = strtoull(value, nullptr, 10);
if (errno == 0 && v <= SIZE_MAX)
{
*out = (size_t)v;
return true;
}
}
fprintf(stderr, "Error: invalid value for option %s: '%s'\n", flag, value);
return false;
}
int Cli::handle_option(size_t flag_idx, const char * arg_value) int Cli::handle_option(size_t flag_idx, const char * arg_value)
{ {
switch (flag_idx) switch (flag_idx)
{ {
case flag_height: case flag_height:
case flag_height_l: case flag_height_l:
this->options.height = atoi(arg_value); if (!parse_size(flag_defs[flag_idx].flag, arg_value, &this->options.height))
{
return 2;
}
return 0; return 0;
case flag_help: case flag_help:
@@ -165,7 +195,10 @@ int Cli::handle_option(size_t flag_idx, const char * arg_value)
case flag_width: case flag_width:
case flag_width_l: case flag_width_l:
this->options.width = atoi(arg_value); if (!parse_size(flag_defs[flag_idx].flag, arg_value, &this->options.width))
{
return 2;
}
return 0; return 0;
case flag_version: case flag_version: