You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.8 KiB
96 lines
2.8 KiB
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}}
|
|
|