argp: Don't pass invalid arguments to isspace, isalnum, isalpha, isdigit.

* lib/argp-help.c (SKIPWS): Cast character to 'unsigned char' before passing it
to isspace().
(fill_in_uparams): Likewise for isalpha(), isalnum(), isdigit().
(canon_doc_option): Likewise for isspace(), isalnum().

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
This commit is contained in:
Bruno Haible 2021-01-07 02:06:18 +01:00 committed by Adhemerval Zanella
parent 1b3fc33f81
commit e9f63b5126
1 changed files with 7 additions and 7 deletions

View File

@ -166,7 +166,7 @@ fill_in_uparams (const struct argp_state *state)
{ {
const char *var = getenv ("ARGP_HELP_FMT"); const char *var = getenv ("ARGP_HELP_FMT");
#define SKIPWS(p) do { while (isspace (*p)) p++; } while (0); #define SKIPWS(p) do { while (isspace ((unsigned char) *p)) p++; } while (0);
if (var) if (var)
/* Parse var. */ /* Parse var. */
@ -174,14 +174,14 @@ fill_in_uparams (const struct argp_state *state)
{ {
SKIPWS (var); SKIPWS (var);
if (isalpha (*var)) if (isalpha ((unsigned char) *var))
{ {
size_t var_len; size_t var_len;
const struct uparam_name *un; const struct uparam_name *un;
int unspec = 0, val = 0; int unspec = 0, val = 0;
const char *arg = var; const char *arg = var;
while (isalnum (*arg) || *arg == '-' || *arg == '_') while (isalnum ((unsigned char) *arg) || *arg == '-' || *arg == '_')
arg++; arg++;
var_len = arg - var; var_len = arg - var;
@ -206,10 +206,10 @@ fill_in_uparams (const struct argp_state *state)
else else
val = 1; val = 1;
} }
else if (isdigit (*arg)) else if (isdigit ((unsigned char) *arg))
{ {
val = atoi (arg); val = atoi (arg);
while (isdigit (*arg)) while (isdigit ((unsigned char) *arg))
arg++; arg++;
SKIPWS (arg); SKIPWS (arg);
} }
@ -713,12 +713,12 @@ canon_doc_option (const char **name)
{ {
int non_opt; int non_opt;
/* Skip initial whitespace. */ /* Skip initial whitespace. */
while (isspace (**name)) while (isspace ((unsigned char) **name))
(*name)++; (*name)++;
/* Decide whether this looks like an option (leading `-') or not. */ /* Decide whether this looks like an option (leading `-') or not. */
non_opt = (**name != '-'); non_opt = (**name != '-');
/* Skip until part of name used for sorting. */ /* Skip until part of name used for sorting. */
while (**name && !isalnum (**name)) while (**name && !isalnum ((unsigned char) **name))
(*name)++; (*name)++;
return non_opt; return non_opt;
} }