4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-28 03:27:46 +08:00

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

View File

@ -301,10 +301,19 @@ first_day (int year)
return ret; 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) #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 *); alt_digits_t *);
static const unsigned char *find_string(const unsigned char *, int *, static const unsigned char *find_string(const unsigned char *, int *,
const char * const *, const char * const *,
@ -842,7 +851,7 @@ strptime (const char *__restrict buf, const char *__restrict fmt,
} }
static const unsigned char * 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) alt_digits_t *alt_digits)
{ {
uint result = 0; uint result = 0;