Blame SOURCES/php-5.5.6-CVE-2014-3668.patch

e9ca13
From 44035de79f5b9646064d9bdd0329a946b0c5372a Mon Sep 17 00:00:00 2001
e9ca13
From: Stanislav Malyshev <stas@php.net>
e9ca13
Date: Sun, 28 Sep 2014 17:33:44 -0700
e9ca13
Subject: [PATCH] Fix bug #68027 - fix date parsing in XMLRPC lib
e9ca13
e9ca13
---
e9ca13
 ext/xmlrpc/libxmlrpc/xmlrpc.c  | 13 ++++++++-----
e9ca13
 ext/xmlrpc/tests/bug68027.phpt | 44 ++++++++++++++++++++++++++++++++++++++++++
e9ca13
 2 files changed, 52 insertions(+), 5 deletions(-)
e9ca13
 create mode 100644 ext/xmlrpc/tests/bug68027.phpt
e9ca13
e9ca13
diff --git a/ext/xmlrpc/libxmlrpc/xmlrpc.c b/ext/xmlrpc/libxmlrpc/xmlrpc.c
e9ca13
index ce70c2a..b766a54 100644
e9ca13
--- a/ext/xmlrpc/libxmlrpc/xmlrpc.c
e9ca13
+++ b/ext/xmlrpc/libxmlrpc/xmlrpc.c
e9ca13
@@ -219,16 +219,19 @@ static int date_from_ISO8601 (const char *text, time_t * value) {
e9ca13
    n = 10;
e9ca13
    tm.tm_mon = 0;
e9ca13
    for(i = 0; i < 2; i++) {
e9ca13
-      XMLRPC_IS_NUMBER(text[i])
e9ca13
+      XMLRPC_IS_NUMBER(text[i+4])
e9ca13
       tm.tm_mon += (text[i+4]-'0')*n;
e9ca13
       n /= 10;
e9ca13
    }
e9ca13
    tm.tm_mon --;
e9ca13
+   if(tm.tm_mon < 0 || tm.tm_mon > 11) {
e9ca13
+       return -1;
e9ca13
+   }
e9ca13
 
e9ca13
    n = 10;
e9ca13
    tm.tm_mday = 0;
e9ca13
    for(i = 0; i < 2; i++) {
e9ca13
-      XMLRPC_IS_NUMBER(text[i])
e9ca13
+      XMLRPC_IS_NUMBER(text[i+6])
e9ca13
       tm.tm_mday += (text[i+6]-'0')*n;
e9ca13
       n /= 10;
e9ca13
    }
e9ca13
@@ -236,7 +239,7 @@ static int date_from_ISO8601 (const char *text, time_t * value) {
e9ca13
    n = 10;
e9ca13
    tm.tm_hour = 0;
e9ca13
    for(i = 0; i < 2; i++) {
e9ca13
-      XMLRPC_IS_NUMBER(text[i])
e9ca13
+      XMLRPC_IS_NUMBER(text[i+9])
e9ca13
       tm.tm_hour += (text[i+9]-'0')*n;
e9ca13
       n /= 10;
e9ca13
    }
e9ca13
@@ -244,7 +247,7 @@ static int date_from_ISO8601 (const char *text, time_t * value) {
e9ca13
    n = 10;
e9ca13
    tm.tm_min = 0;
e9ca13
    for(i = 0; i < 2; i++) {
e9ca13
-      XMLRPC_IS_NUMBER(text[i])
e9ca13
+      XMLRPC_IS_NUMBER(text[i+12])
e9ca13
       tm.tm_min += (text[i+12]-'0')*n;
e9ca13
       n /= 10;
e9ca13
    }
e9ca13
@@ -252,7 +255,7 @@ static int date_from_ISO8601 (const char *text, time_t * value) {
e9ca13
    n = 10;
e9ca13
    tm.tm_sec = 0;
e9ca13
    for(i = 0; i < 2; i++) {
e9ca13
-      XMLRPC_IS_NUMBER(text[i])
e9ca13
+      XMLRPC_IS_NUMBER(text[i+15])
e9ca13
       tm.tm_sec += (text[i+15]-'0')*n;
e9ca13
       n /= 10;
e9ca13
    }
e9ca13
diff --git a/ext/xmlrpc/tests/bug68027.phpt b/ext/xmlrpc/tests/bug68027.phpt
e9ca13
new file mode 100644
e9ca13
index 0000000..a5c96f1
e9ca13
--- /dev/null
e9ca13
+++ b/ext/xmlrpc/tests/bug68027.phpt
e9ca13
@@ -0,0 +1,44 @@
e9ca13
+--TEST--
e9ca13
+Bug #68027 (buffer overflow in mkgmtime() function)
e9ca13
+--SKIPIF--
e9ca13
+
e9ca13
+if (!extension_loaded("xmlrpc")) print "skip";
e9ca13
+?>
e9ca13
+--FILE--
e9ca13
+
e9ca13
+
e9ca13
+$d = '6-01-01 20:00:00';
e9ca13
+xmlrpc_set_type($d, 'datetime');
e9ca13
+var_dump($d);
e9ca13
+$datetime = "2001-0-08T21:46:40-0400";
e9ca13
+$obj = xmlrpc_decode("<methodResponse><params><param><value><dateTime.iso8601>$datetime</dateTime.iso8601></value></param></params></methodResponse>");
e9ca13
+print_r($obj);
e9ca13
+
e9ca13
+$datetime = "34770-0-08T21:46:40-0400";
e9ca13
+$obj = xmlrpc_decode("<methodResponse><params><param><value><dateTime.iso8601>$datetime</dateTime.iso8601></value></param></params></methodResponse>");
e9ca13
+print_r($obj);
e9ca13
+
e9ca13
+echo "Done\n";
e9ca13
+?>
e9ca13
+--EXPECTF--	
e9ca13
+object(stdClass)#1 (3) {
e9ca13
+  ["scalar"]=>
e9ca13
+  string(16) "6-01-01 20:00:00"
e9ca13
+  ["xmlrpc_type"]=>
e9ca13
+  string(8) "datetime"
e9ca13
+  ["timestamp"]=>
e9ca13
+  int(%d)
e9ca13
+}
e9ca13
+stdClass Object
e9ca13
+(
e9ca13
+    [scalar] => 2001-0-08T21:46:40-0400
e9ca13
+    [xmlrpc_type] => datetime
e9ca13
+    [timestamp] => %s
e9ca13
+)
e9ca13
+stdClass Object
e9ca13
+(
e9ca13
+    [scalar] => 34770-0-08T21:46:40-0400
e9ca13
+    [xmlrpc_type] => datetime
e9ca13
+    [timestamp] => %d
e9ca13
+)
e9ca13
+Done
e9ca13
-- 
e9ca13
2.1.0
e9ca13