[php] fix regression introduce in fix for #67118

Remi Collet remi at fedoraproject.org
Fri Jun 6 04:52:39 UTC 2014


commit a791086e41bdc3a0d7379bef1df6e74891e32f0b
Author: Remi Collet <remi at fedoraproject.org>
Date:   Fri Jun 6 06:52:43 2014 +0200

    fix regression introduce in fix for #67118

 php-reg67072.patch |   50 ++++++++++++++-
 php-reg67118.patch |  166 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 php.spec           |    7 ++-
 3 files changed, 218 insertions(+), 5 deletions(-)
---
diff --git a/php-reg67072.patch b/php-reg67072.patch
index 6905db8..0258d95 100644
--- a/php-reg67072.patch
+++ b/php-reg67072.patch
@@ -1,26 +1,68 @@
+From 20568e502814fffc41d91a22edaf75ff5ae19d5c Mon Sep 17 00:00:00 2001
+From: Anatol Belski <ab at php.net>
+Date: Tue, 3 Jun 2014 20:43:58 +0200
+Subject: [PATCH] Fixed regression introduced by patch for bug #67072
+
+This applies to 5.4 and 5.5 only as a legacy fix.
+---
+ ext/standard/tests/serialize/005.phpt |  8 ++---
+ ext/standard/var_unserializer.c       | 68 ++++++++++++++++++-----------------
+ ext/standard/var_unserializer.re      |  6 +++-
+ 3 files changed, 44 insertions(+), 38 deletions(-)
+
+diff --git a/ext/standard/tests/serialize/005.phpt b/ext/standard/tests/serialize/005.phpt
+index 2df2701..07d47bd 100644
+--- a/ext/standard/tests/serialize/005.phpt
++++ b/ext/standard/tests/serialize/005.phpt
+@@ -156,11 +156,9 @@ object(TestNAOld)#%d (0) {
+ }
+ ===NANew===
+ unserializer(TestNANew)
+-
+-Warning: Erroneous data format for unserializing 'TestNANew' in %s005.php on line %d
+-
+-Notice: unserialize(): Error at offset 19 of 20 bytes in %s005.php on line %d
+-bool(false)
++TestNew::__wakeup()
++object(TestNANew)#1 (0) {
++}
+ ===NANew2===
+ unserializer(TestNANew2)
+ TestNew::unserialize()
 diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c
-index 003bac9..ed6a69c 100644
+index 003bac9..29d2e0f 100644
 --- a/ext/standard/var_unserializer.c
 +++ b/ext/standard/var_unserializer.c
-@@ -396,7 +396,7 @@ static inline long object_common1(UNSERIALIZE_PARAMETER, zend_class_entry *ce)
+@@ -396,7 +396,11 @@ static inline long object_common1(UNSERIALIZE_PARAMETER, zend_class_entry *ce)
  
  	(*p) += 2;
  	
 -	if (ce->serialize == NULL) {
++	/* The internal class check here is a BC fix only, userspace classes implementing the
++	Serializable interface have eventually an inconsistent behavior at this place when
++	unserialized from a manipulated string. Additionaly the interal classes can possibly
++	crash PHP so they're still disabled here. */
 +	if (ce->serialize == NULL || ZEND_INTERNAL_CLASS != ce->type) {
  		object_init_ex(*rval, ce);
  	} else {
  		/* If this class implements Serializable, it should not land here but in object_custom(). The passed string
 diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re
-index b3f5d29..b5f092b 100644
+index b3f5d29..cd4d53b 100644
 --- a/ext/standard/var_unserializer.re
 +++ b/ext/standard/var_unserializer.re
-@@ -400,7 +400,7 @@ static inline long object_common1(UNSERIALIZE_PARAMETER, zend_class_entry *ce)
+@@ -400,7 +400,11 @@ static inline long object_common1(UNSERIALIZE_PARAMETER, zend_class_entry *ce)
  
  	(*p) += 2;
  	
 -	if (ce->serialize == NULL) {
++	/* The internal class check here is a BC fix only, userspace classes implementing the
++	Serializable interface have eventually an inconsistent behavior at this place when
++	unserialized from a manipulated string. Additionaly the interal classes can possibly
++	crash PHP so they're still disabled here. */
 +	if (ce->serialize == NULL || ZEND_INTERNAL_CLASS != ce->type) {
  		object_init_ex(*rval, ce);
  	} else {
  		/* If this class implements Serializable, it should not land here but in object_custom(). The passed string
+-- 
+1.9.2
+
diff --git a/php-reg67118.patch b/php-reg67118.patch
new file mode 100644
index 0000000..744ae23
--- /dev/null
+++ b/php-reg67118.patch
@@ -0,0 +1,166 @@
+From 1fe9f1e4f572d7b4d5a3872f41ea61e71fb563bf Mon Sep 17 00:00:00 2001
+From: Remi Collet <remi at php.net>
+Date: Thu, 5 Jun 2014 13:39:46 +0200
+Subject: [PATCH] Fix regression introduce in fix for bug #67118
+
+The fix was correct but break some code (at least in Horde)
+This is a temporary workaround to fix regressioni in 5.4, 5.5 and 5.6
+
+This make php_date_initialize more consistent
+- on success return 1 + time initiliazed
+- on failure return 0 + time = zero
+  which is check by DATE_CHECK_INITIALIZED by later method call
+
+Will restore consistency with other date classes in master.
+---
+ ext/date/php_date.c          |  6 +++---
+ ext/date/tests/bug67118.phpt | 18 +++++++++---------
+ 2 files changed, 12 insertions(+), 12 deletions(-)
+
+diff --git a/ext/date/php_date.c b/ext/date/php_date.c
+index a2bf001..595b0b0 100644
+--- a/ext/date/php_date.c
++++ b/ext/date/php_date.c
+@@ -2441,6 +2441,8 @@ PHPAPI int php_date_initialize(php_date_obj *dateobj, /*const*/ char *time_str,
+ 			err->error_messages[0].position, err->error_messages[0].character, err->error_messages[0].message);
+ 	}
+ 	if (err && err->error_count) {
++		timelib_time_dtor(dateobj->time);
++		dateobj->time = 0;
+ 		return 0;
+ 	}
+ 
+@@ -2548,9 +2550,7 @@ PHP_METHOD(DateTime, __construct)
+ 
+ 	zend_replace_error_handling(EH_THROW, NULL, &error_handling TSRMLS_CC);
+ 	if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sO!", &time_str, &time_str_len, &timezone_object, date_ce_timezone)) {
+-		if (!php_date_initialize(zend_object_store_get_object(getThis() TSRMLS_CC), time_str, time_str_len, NULL, timezone_object, 1 TSRMLS_CC)) {
+-			ZVAL_NULL(getThis());
+-		}
++		php_date_initialize(zend_object_store_get_object(getThis() TSRMLS_CC), time_str, time_str_len, NULL, timezone_object, 1 TSRMLS_CC);
+ 	}
+ 	zend_restore_error_handling(&error_handling TSRMLS_CC);
+ }
+diff --git a/ext/date/tests/bug67118.phpt b/ext/date/tests/bug67118.phpt
+index 6371757..973b4eb 100644
+--- a/ext/date/tests/bug67118.phpt
++++ b/ext/date/tests/bug67118.phpt
+@@ -1,5 +1,5 @@
+ --TEST--
+-Bug #67118 php-cgi crashes regularly on IIS 7
++Bug #67118 crashes in DateTime when this used after failed __construct
+ --INI--
+ date.timezone=Europe/Berlin
+ --FILE--
+@@ -12,16 +12,16 @@
+ 			$tz = new DateTimeZone($tz);
+ 		}
+
+-		@parent::__construct($time, $tz);
++		try {
++			@parent::__construct($time, $tz);
++		} catch (Exception $e) {
++			echo "Bad date" . $this->format("Y") . "\n";
++		}
+ 	}
+
+ };
+
+ new mydt("Funktionsansvarig rÄdgivning och juridik", "UTC");
+ --EXPECTF--
+-Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string (Funktionsansvarig rÄdgivning och juridik) at position 0 (F): The timezone could not be found in the database' in %sbug67118.php:%d
+-Stack trace:
+-#0 %sbug67118.php(%d): DateTime->__construct('Funktionsansvar...', Object(DateTimeZone))
+-#1 %sbug67118.php(%d): mydt->__construct('Funktionsansvar...', 'UTC')
+-#2 {main}
+-  thrown in %sbug67118.php on line %d
++Warning: DateTime::format(): The DateTime object has not been correctly initialized by its constructor in %sbug67118.php on line %d
++Bad date
+--
+1.9.2
+
+From 15d8c80ead75be976c18a66b0933cf52f3e6579f Mon Sep 17 00:00:00 2001
+From: Remi Collet <remi at php.net>
+Date: Thu, 5 Jun 2014 14:00:00 +0200
+Subject: [PATCH] add test for previous fix
+
+---
+ ext/date/tests/bug67118_2.phpt | 35 +++++++++++++++++++++++++++++++++++
+ 1 file changed, 35 insertions(+)
+ create mode 100644 ext/date/tests/bug67118_2.phpt
+
+diff --git a/ext/date/tests/bug67118_2.phpt b/ext/date/tests/bug67118_2.phpt
+new file mode 100644
+index 0000000..b517a3b
+--- /dev/null
++++ b/ext/date/tests/bug67118_2.phpt
+@@ -0,0 +1,35 @@
++--TEST--
++Regression introduce in fix for Bug #67118
++--INI--
++date.timezone=Europe/Paris
++--FILE--
++<?php
++class Foo extends DateTime {
++    public function __construct($time = null) {
++        $tz = new DateTimeZone('UTC');
++        try {
++            echo "First try\n";
++            parent::__construct($time, $tz);
++            return;
++        } catch (Exception $e) {
++            echo "Second try\n";
++            parent::__construct($time.'C', $tz);
++        }
++    }
++}
++$date = '12 Sep 2007 15:49:12 UT';
++var_dump(new Foo($date));
++?>
++Done
++--EXPECTF--
++First try
++Second try
++object(Foo)#1 (3) {
++  ["date"]=>
++  string(26) "2007-09-12 15:49:12.000000"
++  ["timezone_type"]=>
++  int(3)
++  ["timezone"]=>
++  string(3) "UTC"
++}
++Done
+\ No newline at end of file
+-- 
+1.9.2
+
+From 127651e9aeb4294c6be8c450fc1e7344570045f3 Mon Sep 17 00:00:00 2001
+From: Remi Collet <remi at php.net>
+Date: Thu, 5 Jun 2014 17:33:40 +0200
+Subject: [PATCH] fix test for 5.4/5.5
+
+---
+ ext/date/tests/bug67118_2.phpt | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/ext/date/tests/bug67118_2.phpt b/ext/date/tests/bug67118_2.phpt
+index b517a3b..b4904a1 100644
+--- a/ext/date/tests/bug67118_2.phpt
++++ b/ext/date/tests/bug67118_2.phpt
+@@ -26,10 +26,10 @@ First try
+ Second try
+ object(Foo)#1 (3) {
+   ["date"]=>
+-  string(26) "2007-09-12 15:49:12.000000"
++  string(%d) "2007-09-12 15:49:%s"
+   ["timezone_type"]=>
+   int(3)
+   ["timezone"]=>
+   string(3) "UTC"
+ }
+-Done
+\ No newline at end of file
++Done
+-- 
+1.9.2
+
diff --git a/php.spec b/php.spec
index f9197c2..ab6155d 100644
--- a/php.spec
+++ b/php.spec
@@ -69,7 +69,7 @@
 Summary: PHP scripting language for creating dynamic web sites
 Name: php
 Version: 5.5.13
-Release: 2%{?dist}
+Release: 3%{?dist}
 # All files licensed under PHP version 3.01, except
 # Zend is licensed under Zend
 # TSRM is licensed under BSD
@@ -123,6 +123,7 @@ Patch47: php-5.4.9-phpinfo.patch
 # Upstream fixes (100+)
 Patch100: php-reg67072.patch
 Patch101: php-bug67326.patch
+Patch102: php-reg67118.patch
 
 # Security fixes (200+)
 
@@ -732,6 +733,7 @@ support for using the enchant library to PHP.
 
 %patch100 -p1 -b .reg67072
 %patch101 -p1 -b .bug67326
+%patch102 -p1 -b .reg67118
 
 %if 0%{?fedora} < 21
 # Only revert when system libpcre < 8.34
@@ -1555,6 +1557,9 @@ exit 0
 
 
 %changelog
+* Thu Jun  5 2014 Remi Collet <rcollet at redhat.com> 5.5.13-3
+- fix regression introduce in fix for #67118
+
 * Tue Jun  3 2014 Remi Collet <remi at fedoraproject.org> 5.5.13-2
 - fileinfo: fix insufficient boundary check
 - workaround regression introduce in fix for 67072 in


More information about the scm-commits mailing list