| commit abe7f530bf5c741fe6f0658da7be59d8db168f7f |
| Author: Siddhesh Poyarekar <siddhesh@redhat.com> |
| Date: Wed Apr 10 11:31:46 2013 +0530 |
| |
| 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. |
| |
| diff --git glibc-2.17-c758a686/time/getdate.c glibc-2.17-c758a686/time/getdate.c |
| index 637dd18..eadebc3 100644 |
| |
| |
| @@ -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 glibc-2.17-c758a686/time/tst-getdate.c glibc-2.17-c758a686/time/tst-getdate.c |
| index 7604e83..dc8ecf4 100644 |
| |
| |
| @@ -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}} |