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:
parent
acf176104f
commit
343a2a5581
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user