On Tue, Jun 13, 2006 at 07:42:38AM -1000, Dan Jakubiec wrote:
> strptime() initializes the contents of its "struct tm" return structure 
> at the beginning of the function.  However, several of the strptime() 
> format specifiers result in recursive calls to strptime() which then 
> clobber any values which were parsed earlier in the format string.  

I've committed your patch. I also added a testcase which failed before
applying your fix and worked afterwards.

         Andrew
Index: ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/language/c/libc/time/current/ChangeLog,v
retrieving revision 1.20
diff -u -r1.20 ChangeLog
--- ChangeLog   27 Mar 2005 17:28:26 -0000      1.20
+++ ChangeLog   16 Jun 2006 18:45:26 -0000
@@ -1,3 +1,13 @@
+2006-06-16  Andrew Lunn  <[EMAIL PROTECTED]>
+
+       * tests/strptime.c: Add a testcase for the previous fix.
+
+2006-06-13  Dan Jakubiec  <[EMAIL PROTECTED]>
+
+       * src/strptime.cxx: Removed the initialization of the struct tm fields
+       to prevent clobbering of time values when using the following format
+       specifiers: %D, %r, %R, %T, %X, %x.
+
 2005-03-27  Andrew Lunn  <[EMAIL PROTECTED]>
 
        * include/time.h: Added CYGBLD_ATTRIB_STRFTIME_FORMAT where
Index: src/strptime.cxx
===================================================================
RCS file: 
/cvs/ecos/ecos/packages/language/c/libc/time/current/src/strptime.cxx,v
retrieving revision 1.5
diff -u -r1.5 strptime.cxx
--- src/strptime.cxx    8 Aug 2004 22:39:25 -0000       1.5
+++ src/strptime.cxx    16 Jun 2006 18:45:27 -0000
@@ -186,17 +186,6 @@
 {
     char c;
 
-    timeptr->tm_yday = 1;  // Initialize to a well known, valid date
-    timeptr->tm_isdst = 0; //   Tuesday March 18 14:05:00 2003 UTC
-    timeptr->tm_sec = 0;
-    timeptr->tm_min = 5;
-    timeptr->tm_hour = 14;
-    timeptr->tm_mday = 18;
-    timeptr->tm_mon = 2;
-    timeptr->tm_year = 103;
-    timeptr->tm_wday = 2;
-    timeptr->tm_yday = 77;
-
     for (; (c = *format) != '\0'; ++format) {
        char *s;
        int ret;
Index: tests/strptime.c
===================================================================
RCS file: 
/cvs/ecos/ecos/packages/language/c/libc/time/current/tests/strptime.c,v
retrieving revision 1.1
diff -u -r1.1 strptime.c
--- tests/strptime.c    27 Jan 2003 22:10:15 -0000      1.1
+++ tests/strptime.c    16 Jun 2006 18:45:27 -0000
@@ -57,7 +57,7 @@
 
 #include <time.h>
 #include <cyg/infra/testcase.h>
-
+#include <string.h>                     // strlen()
 // HOW TO START TESTS
 
 # define START_TEST( test ) test(0)
@@ -96,6 +96,17 @@
     size = strftime(s, sizeof(s), fp, &tm1);
     CYG_TEST_PASS_FAIL(((size==strlen(dp)) && (my_strcmp(s, dp) == 0)), 
"strptime test #4");
 
+    dp = "2006:06:13 12:22:01";
+    fp = "%x %X";
+    sp = strptime(dp, fp, &tm1);    
+    CYG_TEST_PASS_FAIL(((sp!=NULL) && (*sp=='\0')), "strptime test #5");
+    CYG_TEST_PASS_FAIL((tm1.tm_sec == 01) &&
+                       (tm1.tm_min == 22) &&
+                       (tm1.tm_hour == 12) &&
+                       (tm1.tm_mday == 13) &&
+                       (tm1.tm_mon ==  (06 - 1)) &&
+                       (tm1.tm_year == (2006 - 1900)), "strptime test #6");
+    size = strftime(s, sizeof(s), fp, &tm1);
     CYG_TEST_FINISH("Finished tests from testcase " __FILE__ " for C library "
                     "strptime() function");
 } // test()

Reply via email to