|
|
|
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
|
|
|
|
--- glibc-2.17-c758a686/time/getdate.c
|
|
|
|
+++ glibc-2.17-c758a686/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 glibc-2.17-c758a686/time/tst-getdate.c glibc-2.17-c758a686/time/tst-getdate.c
|
|
|
|
index 7604e83..dc8ecf4 100644
|
|
|
|
--- glibc-2.17-c758a686/time/tst-getdate.c
|
|
|
|
+++ glibc-2.17-c758a686/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}}
|