diff options
author | Siddhesh Poyarekar <siddhesh@redhat.com> | 2013-04-10 11:31:46 +0530 |
---|---|---|
committer | Siddhesh Poyarekar <siddhesh@redhat.com> | 2013-04-10 11:31:46 +0530 |
commit | abe7f530bf5c741fe6f0658da7be59d8db168f7f (patch) | |
tree | b57ba83c808a98b42b5b9d548afc51ae6962982d /time | |
parent | 61c23e6234db0e94cd850e88536401910ac61516 (diff) | |
download | glibc-abe7f530bf5c741fe6f0658da7be59d8db168f7f.zip glibc-abe7f530bf5c741fe6f0658da7be59d8db168f7f.tar.gz glibc-abe7f530bf5c741fe6f0658da7be59d8db168f7f.tar.bz2 |
Accept leading and trailing spaces in getdate input string
Fixes #15346.
The POSIX description of getdate allows for extra spaces in the
getdate input string. __getdate_r uses strptime internally, which
works fine with extra spaces between format strings (and hence within
an input string) but not with leading and trailing spaces. So we trim
off the leading and trailing spaces before we pass it on to strptime.
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 637dd18..eadebc3 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 7604e83..dc8ecf4 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}} |