summaryrefslogtreecommitdiff
path: root/ext/date/date_strftime.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/date/date_strftime.c')
-rw-r--r--ext/date/date_strftime.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/ext/date/date_strftime.c b/ext/date/date_strftime.c
index 20931a3124..d7f28989d6 100644
--- a/ext/date/date_strftime.c
+++ b/ext/date/date_strftime.c
@@ -48,7 +48,7 @@ downcase(char *s, size_t i)
/* strftime --- produce formatted time */
static size_t
-date_strftime_with_tmx(char *s, size_t maxsize, const char *format,
+date_strftime_with_tmx(char *s, const size_t maxsize, const char *format,
const struct tmx *tmx)
{
char *endp = s + maxsize;
@@ -393,7 +393,7 @@ date_strftime_with_tmx(char *s, size_t maxsize, const char *format,
continue;
case 'v':
- STRFTIME("%e-%b-%Y");
+ STRFTIME("%e-%^b-%Y");
continue;
case 'w': /* weekday, Sunday == 0, 0 - 6 */
@@ -575,7 +575,12 @@ date_strftime_with_tmx(char *s, size_t maxsize, const char *format,
case '5': case '6': case '7': case '8': case '9':
{
char *e;
- precision = (int)strtoul(format, &e, 10);
+ unsigned long prec = strtoul(format, &e, 10);
+ if (prec > INT_MAX || prec > maxsize) {
+ errno = ERANGE;
+ return 0;
+ }
+ precision = (int)prec;
format = e - 1;
goto again;
}