summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schlüter <johannes@php.net>2013-01-29 19:49:39 +0100
committerJohannes Schlüter <johannes@php.net>2013-01-29 19:49:39 +0100
commit264279439b5707ecbc21ad06c8f48d3ffd6bd862 (patch)
tree6d25f348ebf505893cc38ce8898b073584008138
parenta85ae16e74d0f1025f2505ea462c566491396fab (diff)
parent5382e156f925603ef0f65b9cc4fed29cbe2dce9b (diff)
downloadphp-git-264279439b5707ecbc21ad06c8f48d3ffd6bd862.tar.gz
Merge branch 'PHP-5.4' of git.php.net:/php-src into PHP-5.4
-rw-r--r--NEWS8
-rw-r--r--Zend/tests/bug63462.phpt74
-rw-r--r--Zend/zend_object_handlers.c10
-rw-r--r--Zend/zend_vm_def.h18
-rw-r--r--Zend/zend_vm_execute.h72
-rw-r--r--ext/spl/spl_directory.c4
-rw-r--r--ext/spl/tests/bug64023.phpt20
-rw-r--r--ext/standard/html.c4
-rw-r--r--ext/standard/http_fopen_wrapper.c6
-rw-r--r--ext/standard/tests/strings/get_html_translation_table_basic10.phpt121
-rw-r--r--ext/standard/var_unserializer.c62
-rw-r--r--ext/standard/var_unserializer.re6
-rw-r--r--main/streams/php_stream_plain_wrapper.h2
-rw-r--r--tests/classes/unset_properties.phpt6
14 files changed, 298 insertions, 115 deletions
diff --git a/NEWS b/NEWS
index a10ef4e4ce..28f151febb 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,8 @@ PHP NEWS
?? ??? 2012, PHP 5.4.12
- Core:
+ . Fixed bug #64011 (get_html_translation_table() output incomplete with
+ HTML_ENTITIES and ISO-8859-1). (Gustavo)
. Fixed bug #63982 (isset() inconsistently produces a fatal error on
protected property). (Stas)
. Fixed bug #63943 (Bad warning text from strpos() on empty needle).
@@ -11,6 +13,10 @@ PHP NEWS
. Fixed bug #63893 (Poor efficiency of strtr() using array with keys of very
different length). (Gustavo)
. Fixed bug #63882 (zend_std_compare_objects crash on recursion). (Dmitry)
+ . Fixed bug #63462 (Magic methods called twice for unset protected
+ properties). (Stas)
+ . Fixed bug #62524 (fopen follows redirects for non-3xx statuses).
+ (Wes Mason)
. Support BITMAPV5HEADER in getimagesize(). (AsamK, Lars)
- Date:
@@ -38,7 +44,7 @@ PHP NEWS
. Fixed bug #63916 (PDO::PARAM_INT casts to 32bit int internally even
on 64bit builds in pdo_sqlite). (srgoogleguy, Lars)
-?? ??? 2012, PHP 5.4.11
+17 Jan 2012, PHP 5.4.11
- Core:
. Fixed bug #63762 (Sigsegv when Exception::$trace is changed by user).
diff --git a/Zend/tests/bug63462.phpt b/Zend/tests/bug63462.phpt
new file mode 100644
index 0000000000..e936a6fa69
--- /dev/null
+++ b/Zend/tests/bug63462.phpt
@@ -0,0 +1,74 @@
+--TEST--
+Test script to verify that magic methods should be called only once when accessing an unset property.
+--CREDITS--
+Marco Pivetta <ocramius@gmail.com>
+--FILE--
+<?php
+class Test {
+ public $publicProperty;
+ protected $protectedProperty;
+ private $privateProperty;
+
+ public function __construct() {
+ unset(
+ $this->publicProperty,
+ $this->protectedProperty,
+ $this->privateProperty
+ );
+ }
+
+ function __get($name) {
+ echo '__get ' . $name . "\n";
+ return $this->$name;
+ }
+
+ function __set($name, $value) {
+ echo '__set ' . $name . "\n";
+ $this->$name = $value;
+ }
+
+ function __isset($name) {
+ echo '__isset ' . $name . "\n";
+ return isset($this->$name);
+ }
+}
+
+$test = new Test();
+
+$test->nonExisting;
+$test->publicProperty;
+$test->protectedProperty;
+$test->privateProperty;
+isset($test->nonExisting);
+isset($test->publicProperty);
+isset($test->protectedProperty);
+isset($test->privateProperty);
+$test->nonExisting = 'value';
+$test->publicProperty = 'value';
+$test->protectedProperty = 'value';
+$test->privateProperty = 'value';
+
+?>
+
+--EXPECTF--
+__get nonExisting
+
+Notice: Undefined property: Test::$nonExisting in %s on line %d
+__get publicProperty
+
+Notice: Undefined property: Test::$publicProperty in %s on line %d
+__get protectedProperty
+
+Notice: Undefined property: Test::$protectedProperty in %s on line %d
+__get privateProperty
+
+Notice: Undefined property: Test::$privateProperty in %s on line %d
+__isset nonExisting
+__isset publicProperty
+__isset protectedProperty
+__isset privateProperty
+__set nonExisting
+__set publicProperty
+__set protectedProperty
+__set privateProperty
+
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index 2c2a45d726..cc45d35ecd 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -393,6 +393,16 @@ static int zend_get_property_guard(zend_object *zobj, zend_property_info *proper
info.name = Z_STRVAL_P(member);
info.name_length = Z_STRLEN_P(member);
info.h = zend_get_hash_value(Z_STRVAL_P(member), Z_STRLEN_P(member) + 1);
+ } else if(property_info->name[0] == '\0'){
+ const char *class_name = NULL, *prop_name = NULL;
+ zend_unmangle_property_name(property_info->name, property_info->name_length, &class_name, &prop_name);
+ if(class_name) {
+ /* use unmangled name for protected properties */
+ info.name = prop_name;
+ info.name_length = strlen(prop_name);
+ info.h = zend_get_hash_value(info.name, info.name_length+1);
+ property_info = &info;
+ }
}
if (!zobj->guards) {
ALLOC_HASHTABLE(zobj->guards);
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index b7fa907073..e5cdd1d1fb 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -974,27 +974,15 @@ ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMP|VAR|CV, ANY)
{
USE_OPLINE
zend_free_op free_op1;
- zval z_copy;
zval *z;
SAVE_OPLINE();
z = GET_OP1_ZVAL_PTR(BP_VAR_R);
- if (OP1_TYPE != IS_CONST &&
- UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) &&
- Z_OBJ_HT_P(z)->get_method != NULL) {
- if (OP1_TYPE == IS_TMP_VAR) {
- INIT_PZVAL(z);
- }
- if (zend_std_cast_object_tostring(z, &z_copy, IS_STRING TSRMLS_CC) == SUCCESS) {
- zend_print_variable(&z_copy);
- zval_dtor(&z_copy);
- } else {
- zend_print_variable(z);
- }
- } else {
- zend_print_variable(z);
+ if (OP1_TYPE == IS_TMP_VAR && Z_TYPE_P(z) == IS_OBJECT) {
+ INIT_PZVAL(z);
}
+ zend_print_variable(z);
FREE_OP1();
CHECK_EXCEPTION();
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 2680d85242..97e5a8e93f 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -2024,27 +2024,15 @@ static int ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval z_copy;
zval *z;
SAVE_OPLINE();
z = opline->op1.zv;
- if (IS_CONST != IS_CONST &&
- UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) &&
- Z_OBJ_HT_P(z)->get_method != NULL) {
- if (IS_CONST == IS_TMP_VAR) {
- INIT_PZVAL(z);
- }
- if (zend_std_cast_object_tostring(z, &z_copy, IS_STRING TSRMLS_CC) == SUCCESS) {
- zend_print_variable(&z_copy);
- zval_dtor(&z_copy);
- } else {
- zend_print_variable(z);
- }
- } else {
- zend_print_variable(z);
+ if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(z) == IS_OBJECT) {
+ INIT_PZVAL(z);
}
+ zend_print_variable(z);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -6443,27 +6431,15 @@ static int ZEND_FASTCALL ZEND_ECHO_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
- zval z_copy;
zval *z;
SAVE_OPLINE();
z = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
- if (IS_TMP_VAR != IS_CONST &&
- UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) &&
- Z_OBJ_HT_P(z)->get_method != NULL) {
- if (IS_TMP_VAR == IS_TMP_VAR) {
- INIT_PZVAL(z);
- }
- if (zend_std_cast_object_tostring(z, &z_copy, IS_STRING TSRMLS_CC) == SUCCESS) {
- zend_print_variable(&z_copy);
- zval_dtor(&z_copy);
- } else {
- zend_print_variable(z);
- }
- } else {
- zend_print_variable(z);
+ if (IS_TMP_VAR == IS_TMP_VAR && Z_TYPE_P(z) == IS_OBJECT) {
+ INIT_PZVAL(z);
}
+ zend_print_variable(z);
zval_dtor(free_op1.var);
CHECK_EXCEPTION();
@@ -10761,27 +10737,15 @@ static int ZEND_FASTCALL ZEND_ECHO_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
- zval z_copy;
zval *z;
SAVE_OPLINE();
z = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
- if (IS_VAR != IS_CONST &&
- UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) &&
- Z_OBJ_HT_P(z)->get_method != NULL) {
- if (IS_VAR == IS_TMP_VAR) {
- INIT_PZVAL(z);
- }
- if (zend_std_cast_object_tostring(z, &z_copy, IS_STRING TSRMLS_CC) == SUCCESS) {
- zend_print_variable(&z_copy);
- zval_dtor(&z_copy);
- } else {
- zend_print_variable(z);
- }
- } else {
- zend_print_variable(z);
+ if (IS_VAR == IS_TMP_VAR && Z_TYPE_P(z) == IS_OBJECT) {
+ INIT_PZVAL(z);
}
+ zend_print_variable(z);
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
CHECK_EXCEPTION();
@@ -26741,27 +26705,15 @@ static int ZEND_FASTCALL ZEND_ECHO_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval z_copy;
zval *z;
SAVE_OPLINE();
z = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
- if (IS_CV != IS_CONST &&
- UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) &&
- Z_OBJ_HT_P(z)->get_method != NULL) {
- if (IS_CV == IS_TMP_VAR) {
- INIT_PZVAL(z);
- }
- if (zend_std_cast_object_tostring(z, &z_copy, IS_STRING TSRMLS_CC) == SUCCESS) {
- zend_print_variable(&z_copy);
- zval_dtor(&z_copy);
- } else {
- zend_print_variable(z);
- }
- } else {
- zend_print_variable(z);
+ if (IS_CV == IS_TMP_VAR && Z_TYPE_P(z) == IS_OBJECT) {
+ INIT_PZVAL(z);
}
+ zend_print_variable(z);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index 61d6324d52..f43a3709e1 100644
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@ -1874,6 +1874,10 @@ static int spl_filesystem_object_cast(zval *readobj, zval *writeobj, int type TS
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(readobj TSRMLS_CC);
if (type == IS_STRING) {
+ if (Z_OBJCE_P(readobj)->__tostring) {
+ return std_object_handlers.cast_object(readobj, writeobj, type TSRMLS_CC);
+ }
+
switch (intern->type) {
case SPL_FS_INFO:
case SPL_FS_FILE:
diff --git a/ext/spl/tests/bug64023.phpt b/ext/spl/tests/bug64023.phpt
new file mode 100644
index 0000000000..2c177f9512
--- /dev/null
+++ b/ext/spl/tests/bug64023.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #64023: Overloading __toString() in SplFileInfo has no effect
+--FILE--
+<?php
+class A extends \SplFileInfo
+{
+ public function __toString() {return ' -expected- ';}
+}
+
+$a = new A('/');
+
+// Works
+echo $a, $a->__toString(), $a->__toString() . '', "\n";
+
+// Does not work - outputs parent::__toString()
+echo $a . '', "\n";
+
+--EXPECT--
+ -expected- -expected- -expected-
+ -expected-
diff --git a/ext/standard/html.c b/ext/standard/html.c
index 79a6737ca5..414fa65c91 100644
--- a/ext/standard/html.c
+++ b/ext/standard/html.c
@@ -1628,8 +1628,8 @@ PHP_FUNCTION(get_html_translation_table)
unsigned i, j, k,
max_i, max_j, max_k;
/* no mapping to unicode required */
- if (CHARSET_SINGLE_BYTE(charset)) {
- max_i = 1; max_j = 1; max_k = 64;
+ if (CHARSET_SINGLE_BYTE(charset)) { /* ISO-8859-1 */
+ max_i = 1; max_j = 4; max_k = 64;
} else {
max_i = 0x1E; max_j = 64; max_k = 64;
}
diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c
index 85a61167aa..870f904e9c 100644
--- a/ext/standard/http_fopen_wrapper.c
+++ b/ext/standard/http_fopen_wrapper.c
@@ -113,6 +113,7 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, char *path,
int redirected = ((flags & HTTP_WRAPPER_REDIRECTED) != 0);
int follow_location = 1;
php_stream_filter *transfer_encoding = NULL;
+ int response_code;
tmp_line[0] = '\0';
@@ -657,7 +658,6 @@ finish:
if (php_stream_get_line(stream, tmp_line, sizeof(tmp_line) - 1, &tmp_line_len) != NULL) {
zval *http_response;
- int response_code;
if (tmp_line_len > 9) {
response_code = atoi(tmp_line + 9);
@@ -731,7 +731,9 @@ finish:
http_header_line[http_header_line_length] = '\0';
if (!strncasecmp(http_header_line, "Location: ", 10)) {
- if (context && php_stream_context_get_option(context, "http", "follow_location", &tmpzval) == SUCCESS) {
+ /* we only care about Location for 300, 301, 302, 303 and 307 */
+ /* see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.1 */
+ if ((response_code >= 300 && response_code < 304 || 307 == response_code) && context && php_stream_context_get_option(context, "http", "follow_location", &tmpzval) == SUCCESS) {
SEPARATE_ZVAL(tmpzval);
convert_to_long_ex(tmpzval);
follow_location = Z_LVAL_PP(tmpzval);
diff --git a/ext/standard/tests/strings/get_html_translation_table_basic10.phpt b/ext/standard/tests/strings/get_html_translation_table_basic10.phpt
new file mode 100644
index 0000000000..a5a356885d
--- /dev/null
+++ b/ext/standard/tests/strings/get_html_translation_table_basic10.phpt
@@ -0,0 +1,121 @@
+--TEST--
+Test get_html_translation_table() function: htmlentities/HTML 4/ISO-8859-1 (bug #64011)
+--FILE--
+<?php
+
+function so($a,$b) { return ord($a) - ord($b); }
+
+$table = HTML_ENTITIES;
+$tt = get_html_translation_table($table, ENT_COMPAT, "ISO-8859-1");
+uksort( $tt, 'so' );
+var_dump( count($tt) );
+print_r( $tt );
+echo "Done\n";
+
+?>
+--EXPECT--
+int(100)
+Array
+(
+ ["] => &quot;
+ [&] => &amp;
+ [<] => &lt;
+ [>] => &gt;
+ [ ] => &nbsp;
+ [¡] => &iexcl;
+ [¢] => &cent;
+ [£] => &pound;
+ [¤] => &curren;
+ [¥] => &yen;
+ [¦] => &brvbar;
+ [§] => &sect;
+ [¨] => &uml;
+ [©] => &copy;
+ [ª] => &ordf;
+ [«] => &laquo;
+ [¬] => &not;
+ [­] => &shy;
+ [®] => &reg;
+ [¯] => &macr;
+ [°] => &deg;
+ [±] => &plusmn;
+ [²] => &sup2;
+ [³] => &sup3;
+ [´] => &acute;
+ [µ] => &micro;
+ [¶] => &para;
+ [·] => &middot;
+ [¸] => &cedil;
+ [¹] => &sup1;
+ [º] => &ordm;
+ [»] => &raquo;
+ [¼] => &frac14;
+ [½] => &frac12;
+ [¾] => &frac34;
+ [¿] => &iquest;
+ [À] => &Agrave;
+ [Á] => &Aacute;
+ [Â] => &Acirc;
+ [Ã] => &Atilde;
+ [Ä] => &Auml;
+ [Å] => &Aring;
+ [Æ] => &AElig;
+ [Ç] => &Ccedil;
+ [È] => &Egrave;
+ [É] => &Eacute;
+ [Ê] => &Ecirc;
+ [Ë] => &Euml;
+ [Ì] => &Igrave;
+ [Í] => &Iacute;
+ [Î] => &Icirc;
+ [Ï] => &Iuml;
+ [Ð] => &ETH;
+ [Ñ] => &Ntilde;
+ [Ò] => &Ograve;
+ [Ó] => &Oacute;
+ [Ô] => &Ocirc;
+ [Õ] => &Otilde;
+ [Ö] => &Ouml;
+ [×] => &times;
+ [Ø] => &Oslash;
+ [Ù] => &Ugrave;
+ [Ú] => &Uacute;
+ [Û] => &Ucirc;
+ [Ü] => &Uuml;
+ [Ý] => &Yacute;
+ [Þ] => &THORN;
+ [ß] => &szlig;
+ [à] => &agrave;
+ [á] => &aacute;
+ [â] => &acirc;
+ [ã] => &atilde;
+ [ä] => &auml;
+ [å] => &aring;
+ [æ] => &aelig;
+ [ç] => &ccedil;
+ [è] => &egrave;
+ [é] => &eacute;
+ [ê] => &ecirc;
+ [ë] => &euml;
+ [ì] => &igrave;
+ [í] => &iacute;
+ [î] => &icirc;
+ [ï] => &iuml;
+ [ð] => &eth;
+ [ñ] => &ntilde;
+ [ò] => &ograve;
+ [ó] => &oacute;
+ [ô] => &ocirc;
+ [õ] => &otilde;
+ [ö] => &ouml;
+ [÷] => &divide;
+ [ø] => &oslash;
+ [ù] => &ugrave;
+ [ú] => &uacute;
+ [û] => &ucirc;
+ [ü] => &uuml;
+ [ý] => &yacute;
+ [þ] => &thorn;
+ [ÿ] => &yuml;
+)
+Done
diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c
index 1e896d2eef..bd0b2f6695 100644
--- a/ext/standard/var_unserializer.c
+++ b/ext/standard/var_unserializer.c
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Wed Nov 9 19:37:48 2011 */
+/* Generated by re2c 0.13.5 on Mon Jan 21 11:34:03 2013 */
#line 1 "ext/standard/var_unserializer.re"
/*
+----------------------------------------------------------------------+
@@ -427,7 +427,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
-#line 425 "ext/standard/var_unserializer.c"
+#line 431 "ext/standard/var_unserializer.c"
{
YYCTYPE yych;
static const unsigned char yybm[] = {
@@ -487,9 +487,9 @@ yy2:
yych = *(YYMARKER = ++YYCURSOR);
if (yych == ':') goto yy95;
yy3:
-#line 747 "ext/standard/var_unserializer.re"
+#line 759 "ext/standard/var_unserializer.re"
{ return 0; }
-#line 487 "ext/standard/var_unserializer.c"
+#line 493 "ext/standard/var_unserializer.c"
yy4:
yych = *(YYMARKER = ++YYCURSOR);
if (yych == ':') goto yy89;
@@ -532,13 +532,13 @@ yy13:
goto yy3;
yy14:
++YYCURSOR;
-#line 741 "ext/standard/var_unserializer.re"
+#line 753 "ext/standard/var_unserializer.re"
{
/* this is the case where we have less data than planned */
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unexpected end of serialized data");
return 0; /* not sure if it should be 0 or 1 here? */
}
-#line 536 "ext/standard/var_unserializer.c"
+#line 542 "ext/standard/var_unserializer.c"
yy16:
yych = *++YYCURSOR;
goto yy3;
@@ -568,7 +568,7 @@ yy20:
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 624 "ext/standard/var_unserializer.re"
+#line 630 "ext/standard/var_unserializer.re"
{
size_t len, len2, len3, maxlen;
long elements;
@@ -691,7 +691,7 @@ yy20:
return object_common2(UNSERIALIZE_PASSTHRU, elements);
}
-#line 683 "ext/standard/var_unserializer.c"
+#line 695 "ext/standard/var_unserializer.c"
yy25:
yych = *++YYCURSOR;
if (yych <= ',') {
@@ -716,7 +716,7 @@ yy27:
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 616 "ext/standard/var_unserializer.re"
+#line 622 "ext/standard/var_unserializer.re"
{
INIT_PZVAL(*rval);
@@ -724,7 +724,7 @@ yy27:
return object_common2(UNSERIALIZE_PASSTHRU,
object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR));
}
-#line 716 "ext/standard/var_unserializer.c"
+#line 728 "ext/standard/var_unserializer.c"
yy32:
yych = *++YYCURSOR;
if (yych == '+') goto yy33;
@@ -745,7 +745,7 @@ yy34:
yych = *++YYCURSOR;
if (yych != '{') goto yy18;
++YYCURSOR;
-#line 596 "ext/standard/var_unserializer.re"
+#line 602 "ext/standard/var_unserializer.re"
{
long elements = parse_iv(start + 2);
/* use iv() not uiv() in order to check data range */
@@ -765,7 +765,7 @@ yy34:
return finish_nested_data(UNSERIALIZE_PASSTHRU);
}
-#line 757 "ext/standard/var_unserializer.c"
+#line 769 "ext/standard/var_unserializer.c"
yy39:
yych = *++YYCURSOR;
if (yych == '+') goto yy40;
@@ -786,7 +786,7 @@ yy41:
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 567 "ext/standard/var_unserializer.re"
+#line 573 "ext/standard/var_unserializer.re"
{
size_t len, maxlen;
char *str;
@@ -815,7 +815,7 @@ yy41:
ZVAL_STRINGL(*rval, str, len, 0);
return 1;
}
-#line 807 "ext/standard/var_unserializer.c"
+#line 819 "ext/standard/var_unserializer.c"
yy46:
yych = *++YYCURSOR;
if (yych == '+') goto yy47;
@@ -836,7 +836,7 @@ yy48:
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 539 "ext/standard/var_unserializer.re"
+#line 545 "ext/standard/var_unserializer.re"
{
size_t len, maxlen;
char *str;
@@ -864,7 +864,7 @@ yy48:
ZVAL_STRINGL(*rval, str, len, 1);
return 1;
}
-#line 856 "ext/standard/var_unserializer.c"
+#line 868 "ext/standard/var_unserializer.c"
yy53:
yych = *++YYCURSOR;
if (yych <= '/') {
@@ -952,7 +952,7 @@ yy61:
}
yy63:
++YYCURSOR;
-#line 529 "ext/standard/var_unserializer.re"
+#line 535 "ext/standard/var_unserializer.re"
{
#if SIZEOF_LONG == 4
use_double:
@@ -962,7 +962,7 @@ use_double:
ZVAL_DOUBLE(*rval, zend_strtod((const char *)start + 2, NULL));
return 1;
}
-#line 954 "ext/standard/var_unserializer.c"
+#line 966 "ext/standard/var_unserializer.c"
yy65:
yych = *++YYCURSOR;
if (yych <= ',') {
@@ -1021,7 +1021,7 @@ yy73:
yych = *++YYCURSOR;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 514 "ext/standard/var_unserializer.re"
+#line 520 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
INIT_PZVAL(*rval);
@@ -1036,7 +1036,7 @@ yy73:
return 1;
}
-#line 1028 "ext/standard/var_unserializer.c"
+#line 1040 "ext/standard/var_unserializer.c"
yy76:
yych = *++YYCURSOR;
if (yych == 'N') goto yy73;
@@ -1063,7 +1063,7 @@ yy79:
if (yych <= '9') goto yy79;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 487 "ext/standard/var_unserializer.re"
+#line 493 "ext/standard/var_unserializer.re"
{
#if SIZEOF_LONG == 4
int digits = YYCURSOR - start - 3;
@@ -1090,7 +1090,7 @@ yy79:
ZVAL_LONG(*rval, parse_iv(start + 2));
return 1;
}
-#line 1082 "ext/standard/var_unserializer.c"
+#line 1094 "ext/standard/var_unserializer.c"
yy83:
yych = *++YYCURSOR;
if (yych <= '/') goto yy18;
@@ -1098,24 +1098,24 @@ yy83:
yych = *++YYCURSOR;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 480 "ext/standard/var_unserializer.re"
+#line 486 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
INIT_PZVAL(*rval);
ZVAL_BOOL(*rval, parse_iv(start + 2));
return 1;
}
-#line 1097 "ext/standard/var_unserializer.c"
+#line 1109 "ext/standard/var_unserializer.c"
yy87:
++YYCURSOR;
-#line 473 "ext/standard/var_unserializer.re"
+#line 479 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
INIT_PZVAL(*rval);
ZVAL_NULL(*rval);
return 1;
}
-#line 1107 "ext/standard/var_unserializer.c"
+#line 1119 "ext/standard/var_unserializer.c"
yy89:
yych = *++YYCURSOR;
if (yych <= ',') {
@@ -1138,7 +1138,7 @@ yy91:
if (yych <= '9') goto yy91;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 450 "ext/standard/var_unserializer.re"
+#line 456 "ext/standard/var_unserializer.re"
{
long id;
@@ -1161,7 +1161,7 @@ yy91:
return 1;
}
-#line 1153 "ext/standard/var_unserializer.c"
+#line 1165 "ext/standard/var_unserializer.c"
yy95:
yych = *++YYCURSOR;
if (yych <= ',') {
@@ -1184,7 +1184,7 @@ yy97:
if (yych <= '9') goto yy97;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 429 "ext/standard/var_unserializer.re"
+#line 435 "ext/standard/var_unserializer.re"
{
long id;
@@ -1205,9 +1205,9 @@ yy97:
return 1;
}
-#line 1197 "ext/standard/var_unserializer.c"
+#line 1209 "ext/standard/var_unserializer.c"
}
-#line 749 "ext/standard/var_unserializer.re"
+#line 761 "ext/standard/var_unserializer.re"
return 0;
diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re
index e54449a78c..204995783f 100644
--- a/ext/standard/var_unserializer.re
+++ b/ext/standard/var_unserializer.re
@@ -678,10 +678,13 @@ object ":" uiv ":" ["] {
do {
/* Try to find class directly */
+ BG(serialize_lock) = 1;
if (zend_lookup_class(class_name, len2, &pce TSRMLS_CC) == SUCCESS) {
+ BG(serialize_lock) = 0;
ce = *pce;
break;
}
+ BG(serialize_lock) = 0;
/* Check for unserialize callback */
if ((PG(unserialize_callback_func) == NULL) || (PG(unserialize_callback_func)[0] == '\0')) {
@@ -696,7 +699,9 @@ object ":" uiv ":" ["] {
args[0] = &arg_func_name;
MAKE_STD_ZVAL(arg_func_name);
ZVAL_STRING(arg_func_name, class_name, 1);
+ BG(serialize_lock) = 1;
if (call_user_function_ex(CG(function_table), NULL, user_func, &retval_ptr, 1, args, 0, NULL TSRMLS_CC) != SUCCESS) {
+ BG(serialize_lock) = 0;
php_error_docref(NULL TSRMLS_CC, E_WARNING, "defined (%s) but not found", user_func->value.str.val);
incomplete_class = 1;
ce = PHP_IC_ENTRY;
@@ -704,6 +709,7 @@ object ":" uiv ":" ["] {
zval_ptr_dtor(&arg_func_name);
break;
}
+ BG(serialize_lock) = 0;
if (retval_ptr) {
zval_ptr_dtor(&retval_ptr);
}
diff --git a/main/streams/php_stream_plain_wrapper.h b/main/streams/php_stream_plain_wrapper.h
index 4b3875577d..d88b30c479 100644
--- a/main/streams/php_stream_plain_wrapper.h
+++ b/main/streams/php_stream_plain_wrapper.h
@@ -31,7 +31,7 @@ PHPAPI php_stream *_php_stream_fopen(const char *filename, const char *mode, cha
#define php_stream_fopen(filename, mode, opened) _php_stream_fopen((filename), (mode), (opened), 0 STREAMS_CC TSRMLS_CC)
PHPAPI php_stream *_php_stream_fopen_with_path(char *filename, char *mode, char *path, char **opened_path, int options STREAMS_DC TSRMLS_DC);
-#define php_stream_fopen_with_path(filename, mode, path, opened) _php_stream_fopen_with_path((filename), (mode), (path), (opened) STREAMS_CC TSRMLS_CC)
+#define php_stream_fopen_with_path(filename, mode, path, opened) _php_stream_fopen_with_path((filename), (mode), (path), (opened), 0 STREAMS_CC TSRMLS_CC)
PHPAPI php_stream *_php_stream_fopen_from_file(FILE *file, const char *mode STREAMS_DC TSRMLS_DC);
#define php_stream_fopen_from_file(file, mode) _php_stream_fopen_from_file((file), (mode) STREAMS_CC TSRMLS_CC)
diff --git a/tests/classes/unset_properties.phpt b/tests/classes/unset_properties.phpt
index 7f9b569887..264e720c9e 100644
--- a/tests/classes/unset_properties.phpt
+++ b/tests/classes/unset_properties.phpt
@@ -140,15 +140,15 @@ true
new publicProperty value via public access
protectedProperty set
-__isset "protectedProperty"__isset "protectedProperty"false
+__isset "protectedProperty"false
__get "protectedProperty"
__set "protectedProperty" to "new protectedProperty value via setter"
__isset "protectedProperty"true
new protectedProperty value via setter
privateProperty set
-__isset "privateProperty"__isset "privateProperty"false
+__isset "privateProperty"false
__get "privateProperty"
__set "privateProperty" to "new privateProperty value via setter"
__isset "privateProperty"true
-new privateProperty value via setter \ No newline at end of file
+new privateProperty value via setter