aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2024-02-21 19:39:37 +0100
committerCorinna Vinschen <corinna@vinschen.de>2024-02-21 20:00:59 +0100
commitf0ab27c0954e9529109e00c905be2d1ea88a749a (patch)
tree2782b0744af3fff02c3914ddd175d6b523fb60e6
parent12b85bec0e4db176cb5c6534f01bef62fb15c44b (diff)
downloadnewlib-f0ab27c0954e9529109e00c905be2d1ea88a749a.zip
newlib-f0ab27c0954e9529109e00c905be2d1ea88a749a.tar.gz
newlib-f0ab27c0954e9529109e00c905be2d1ea88a749a.tar.bz2
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>
-rw-r--r--winsup/cygwin/libc/strptime.cc15
1 files changed, 12 insertions, 3 deletions
diff --git a/winsup/cygwin/libc/strptime.cc b/winsup/cygwin/libc/strptime.cc
index dc55723..353b800 100644
--- a/winsup/cygwin/libc/strptime.cc
+++ b/winsup/cygwin/libc/strptime.cc
@@ -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;