diff options
Diffstat (limited to 'time')
-rw-r--r-- | time/getdate.c | 42 | ||||
-rw-r--r-- | time/tst-getdate.c | 4 |
2 files changed, 46 insertions, 0 deletions
diff --git a/time/getdate.c b/time/getdate.c index 637dd18fcf..eadebc348b 100644 --- a/time/getdate.c +++ b/time/getdate.c @@ -25,6 +25,8 @@ #include <time.h> #include <unistd.h> #include <sys/stat.h> +#include <ctype.h> +#include <alloca.h> #define TM_YEAR_BASE 1900 @@ -135,6 +137,44 @@ __getdate_r (const char *string, struct tm *tp) /* No threads reading this stream. */ __fsetlocking (fp, FSETLOCKING_BYCALLER); + /* Skip leading whitespace. */ + while (isspace (*string)) + string++; + + size_t inlen, oldlen; + + oldlen = inlen = strlen (string); + + /* Skip trailing whitespace. */ + while (inlen > 0 && isspace (string[inlen - 1])) + inlen--; + + char *instr = NULL; + + if (inlen < oldlen) + { + bool using_malloc = false; + + if (__libc_use_alloca (inlen + 1)) + instr = alloca (inlen + 1); + else + { + instr = malloc (inlen + 1); + if (instr == NULL) + { + fclose (fp); + return 6; + } + using_malloc = true; + } + memcpy (instr, string, inlen); + instr[inlen] = '\0'; + string = instr; + + if (!using_malloc) + instr = NULL; + } + line = NULL; len = 0; do @@ -159,6 +199,8 @@ __getdate_r (const char *string, struct tm *tp) } while (!feof_unlocked (fp)); + free (instr); + /* Free the buffer. */ free (line); diff --git a/time/tst-getdate.c b/time/tst-getdate.c index 7604e8394f..dc8ecf413a 100644 --- a/time/tst-getdate.c +++ b/time/tst-getdate.c @@ -31,6 +31,10 @@ static const struct } tests [] = { {"21:01:10 1999-1-31", "Universal", 0, {10, 1, 21, 31, 0, 99, 0, 0, 0}}, + {"21:01:10 1999-1-31", "Universal", 0, {10, 1, 21, 31, 0, 99, 0, 0, 0}}, + {" 21:01:10 1999-1-31", "Universal", 0, {10, 1, 21, 31, 0, 99, 0, 0, 0}}, + {"21:01:10 1999-1-31 ", "Universal", 0, {10, 1, 21, 31, 0, 99, 0, 0, 0}}, + {" 21:01:10 1999-1-31 ", "Universal", 0, {10, 1, 21, 31, 0, 99, 0, 0, 0}}, {"21:01:10 1999-2-28", "Universal", 0, {10, 1, 21, 28, 1, 99, 0, 0, 0}}, {"16:30:46 2000-2-29", "Universal", 0, {46, 30,16, 29, 1, 100, 0, 0, 0}}, {"01-08-2000 05:06:07", "Europe/Berlin", 0, {7, 6, 5, 1, 7, 100, 0, 0, 0}} |