Cygwin: strptime: make sure to fail on invalid input digits

conv_num returns NULL if the input is invalid, e. g., the
numbers are out of range.  However, the code fails to test
this in a lot of places.

Rather than adding checks all over the place, rename conv_num
to __conv_num and create a wrapper macro conv_num to perform
the task of error checking.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2024-02-21 19:39:37 +01:00
parent acf176104f
commit 343a2a5581
1 changed files with 12 additions and 3 deletions

View File

@ -301,10 +301,19 @@ first_day (int year)
return ret;
}
/* This simplifies the calls to conv_num enormously. */
/* This simplifies the calls to __conv_num enormously. */
#define ALT_DIGITS ((alt_format & ALT_O) ? *alt_digits : NULL)
static const unsigned char *conv_num(const unsigned char *, int *, uint, uint,
#define conv_num(_b,_d,_l,_u,_a) \
({ \
const unsigned char *_ret; \
_ret = __conv_num((_b),(_d),(_l),(_u),(_a)); \
if (!_ret) \
return NULL; \
_ret; \
})
static const unsigned char *__conv_num(const unsigned char *, int *, uint, uint,
alt_digits_t *);
static const unsigned char *find_string(const unsigned char *, int *,
const char * const *,
@ -842,7 +851,7 @@ strptime (const char *__restrict buf, const char *__restrict fmt,
}
static const unsigned char *
conv_num(const unsigned char *buf, int *dest, uint llim, uint ulim,
__conv_num(const unsigned char *buf, int *dest, uint llim, uint ulim,
alt_digits_t *alt_digits)
{
uint result = 0;