felipe Wed Sep 10 00:07:45 2008 UTC Added files: (Branch: PHP_5_3) /php-src/ext/xmlrpc/tests bug18916.phpt bug45226.phpt
Modified files: /php-src/ext/xmlrpc/libxmlrpc xmlrpc.c Log: MFH: - Merged fix from SF project (Import Jeff Lawsons patches for XML datetime bug fixes) Fixed bugs: #45226 (xmlrpc_set_type() segfaults with valid ISO8601 date string) #18916 (xmlrpc_set_type() "not working") http://cvs.php.net/viewvc.cgi/php-src/ext/xmlrpc/libxmlrpc/xmlrpc.c?r1=1.8.4.3&r2=1.8.4.3.2.1&diff_format=u Index: php-src/ext/xmlrpc/libxmlrpc/xmlrpc.c diff -u php-src/ext/xmlrpc/libxmlrpc/xmlrpc.c:1.8.4.3 php-src/ext/xmlrpc/libxmlrpc/xmlrpc.c:1.8.4.3.2.1 --- php-src/ext/xmlrpc/libxmlrpc/xmlrpc.c:1.8.4.3 Tue Sep 18 19:49:53 2007 +++ php-src/ext/xmlrpc/libxmlrpc/xmlrpc.c Wed Sep 10 00:07:44 2008 @@ -31,7 +31,7 @@ */ -static const char rcsid[] = "#(@) $Id: xmlrpc.c,v 1.8.4.3 2007/09/18 19:49:53 iliaa Exp $"; +static const char rcsid[] = "#(@) $Id: xmlrpc.c,v 1.8.4.3.2.1 2008/09/10 00:07:44 felipe Exp $"; /****h* ABOUT/xmlrpc @@ -43,6 +43,13 @@ * 9/1999 - 10/2000 * HISTORY * $Log: xmlrpc.c,v $ + * Revision 1.8.4.3.2.1 2008/09/10 00:07:44 felipe + * MFH: + * - Merged fix from SF project (Import Jeff Lawsons patches for XML datetime bug fixes) + * Fixed bugs: + * #45226 (xmlrpc_set_type() segfaults with valid ISO8601 date string) + * #18916 (xmlrpc_set_type() "not working") + * * Revision 1.8.4.3 2007/09/18 19:49:53 iliaa * * Fixed bug #42189 (xmlrpc_set_type() crashes php on invalid datetime @@ -166,11 +173,21 @@ * Begin Time Functions * ***********************/ +static time_t mkgmtime(struct tm *tm) +{ + static const int mdays[12] = {0,31,59,90,120,151,181,212,243,273,304,334}; + + return ((((((tm->tm_year - 70) * 365) + mdays[tm->tm_mon] + tm->tm_mday-1 + + (tm->tm_year-68-1+(tm->tm_mon>=2))/4) * 24) + tm->tm_hour) * 60 + + tm->tm_min) * 60 + tm->tm_sec; +} + static int date_from_ISO8601 (const char *text, time_t * value) { struct tm tm; int n; int i; - char buf[18]; + char buf[30]; + if (strchr (text, '-')) { char *p = (char *) text, *p2 = buf; @@ -178,6 +195,9 @@ if (*p != '-') { *p2 = *p; p2++; + if (p2-buf >= sizeof(buf)) { + return -1; + } } p++; } @@ -187,10 +207,6 @@ tm.tm_isdst = -1; - if(strlen(text) < 17) { - return -1; - } - #define XMLRPC_IS_NUMBER(x) if (x < '0' || x > '9') return -1; n = 1000; @@ -243,7 +259,7 @@ tm.tm_year -= 1900; - *value = mktime(&tm); + *value = mkgmtime(&tm); return 0; @@ -251,14 +267,14 @@ static int date_to_ISO8601 (time_t value, char *buf, int length) { struct tm *tm, tmbuf; - tm = php_localtime_r(&value, &tmbuf); + tm = php_gmtime_r(&value, &tmbuf); if (!tm) { return 0; } #if 0 /* TODO: soap seems to favor this method. xmlrpc the latter. */ return strftime (buf, length, "%Y-%m-%dT%H:%M:%SZ", tm); #else - return strftime(buf, length, "%Y%m%dT%H:%M:%S", tm); + return strftime(buf, length, "%Y%m%dT%H:%M:%SZ", tm); #endif } @@ -1529,8 +1545,7 @@ date_to_ISO8601(time, timeBuf, sizeof(timeBuf)); if(timeBuf[0]) { - simplestring_clear(&value->str); - simplestring_add(&value->str, timeBuf); + XMLRPC_SetValueDateTime_ISO8601 (value, timeBuf); } } } @@ -1706,8 +1721,11 @@ if(value) { time_t time_val = 0; if(s) { + value->type = xmlrpc_datetime; date_from_ISO8601(s, &time_val); - XMLRPC_SetValueDateTime(value, time_val); + value->i = time_val; + simplestring_clear(&value->str); + simplestring_add(&value->str, s); } } } http://cvs.php.net/viewvc.cgi/php-src/ext/xmlrpc/tests/bug18916.phpt?view=markup&rev=1.1 Index: php-src/ext/xmlrpc/tests/bug18916.phpt +++ php-src/ext/xmlrpc/tests/bug18916.phpt http://cvs.php.net/viewvc.cgi/php-src/ext/xmlrpc/tests/bug45226.phpt?view=markup&rev=1.1 Index: php-src/ext/xmlrpc/tests/bug45226.phpt +++ php-src/ext/xmlrpc/tests/bug45226.phpt -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php