Re: com php-src: Add optional second arg to unserialize(): ext/standard/basic_functions.c ext/standard/tests/serialize/serialization_error_001.phpt
ext/standard/tests/serialize/unserialize_consumed.phpt ext/standard/var.c
| From: | Stas Malyshev | Date: | Fri, 05 Jul 2013 03:43:40 +0000 |
| Subject: | Re: com php-src: Add optional second arg to unserialize(): ext/standard/basic_functions.c ext/standard/tests/serialize/serialization_error_001.phpt ext/standard/tests/serialize/unserialize_consumed.phpt ext/standard/var.c |
||
| References: | 1 2 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-72586@lists.php.net to get a copy of this message | ||
Hi!
> Please add a note to UPGRADING as well.
>
> Thanks!
I understand UPGRADING still not updated? Could you please update it?
> Cheers,
>
> On Fri, May 17, 2013 at 12:18 AM, Sara Golemon <pollita@php.net> wrote:
>> Commit: cfd104582220d578ab1b78a5991065d038e1f931
>> Author: Sara Golemon <pollita@php.net> Thu, 16 May 2013 14:37:36 -0700
>> Parents: bc656cde0453aa6de50812ba9edfc6f74c61ce37
>> Branches: master
>>
>> Link:
>> http://git.php.net/?p=php-src.git;a=commitdiff;h=cfd104582220d578ab1b78a5991065d038e1f931
>>
>> Log:
>> Add optional second arg to unserialize()
>>
>> Returns the number of bytes consumed by reference for
>> streaming unserialization.
>>
>> Actual unserialization behavior is not modified at all.
>>
>> The need for this came up while trying to parse SplDoublyLinkedList's
>> serialization format which uses a non-standard stream of serialized values.
>>
>> Changed paths:
>> M ext/standard/basic_functions.c
>> M ext/standard/tests/serialize/serialization_error_001.phpt
>> A ext/standard/tests/serialize/unserialize_consumed.phpt
>> M ext/standard/var.c
>>
>>
>> Diff:
>> diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
>> index 9c91404..1379117 100644
>> --- a/ext/standard/basic_functions.c
>> +++ b/ext/standard/basic_functions.c
>> @@ -2679,6 +2679,7 @@ ZEND_END_ARG_INFO()
>>
>> ZEND_BEGIN_ARG_INFO(arginfo_unserialize, 0)
>> ZEND_ARG_INFO(0, variable_representation)
>> + ZEND_ARG_INFO(1, consumed)
>> ZEND_END_ARG_INFO()
>>
>> ZEND_BEGIN_ARG_INFO_EX(arginfo_memory_get_usage, 0, 0, 0)
>> diff --git a/ext/standard/tests/serialize/serialization_error_001.phpt
>> b/ext/standard/tests/serialize/serialization_error_001.phpt
>> index da6f50c..c6c1751 100644
>> --- a/ext/standard/tests/serialize/serialization_error_001.phpt
>> +++ b/ext/standard/tests/serialize/serialization_error_001.phpt
>> @@ -21,7 +21,7 @@ var_dump( unserialize() );
>>
>> //Test serialize with one more than the expected number of arguments
>> var_dump( serialize(1,2) );
>> -var_dump( unserialize(1,2) );
>> +var_dump( unserialize(1,$x,2) );
>>
>> echo "Done";
>> ?>
>> @@ -31,12 +31,12 @@ echo "Done";
>> Warning: serialize() expects exactly 1 parameter, 0 given in %s on line 16
>> NULL
>>
>> -Warning: unserialize() expects exactly 1 parameter, 0 given in %s on line 17
>> +Warning: unserialize() expects at least 1 parameter, 0 given in %s on line 17
>> bool(false)
>>
>> Warning: serialize() expects exactly 1 parameter, 2 given in %s on line 20
>> NULL
>>
>> -Warning: unserialize() expects exactly 1 parameter, 2 given in %s on line 21
>> +Warning: unserialize() expects at most 2 parameters, 3 given in %s on line 21
>> bool(false)
>> Done
>> diff --git a/ext/standard/tests/serialize/unserialize_consumed.phpt
>> b/ext/standard/tests/serialize/unserialize_consumed.phpt
>> new file mode 100644
>> index 0000000..6cc11e2
>> --- /dev/null
>> +++ b/ext/standard/tests/serialize/unserialize_consumed.phpt
>> @@ -0,0 +1,27 @@
>> +--TEST--
>> +Unserialization of partial strings
>> +--FILE--
>> +<?php
>> +$data = [123,4.56,true];
>> +$ser = serialize($data);
>> +$serlen = strlen($ser);
>> +
>> +$unser = unserialize($ser, $consumed);
>> +echo "Consume full string: ";
>> +var_dump($serlen == $consumed);
>> +echo "Return original data: ";
>> +var_dump($unser === $data);
>> +
>> +$ser .= "junk\x01data";
>> +$unser = unserialize($ser, $consumed);
>> +echo "Consume full string(junk): ";
>> +var_dump($serlen == $consumed);
>> +echo "Return original data(junk): ";
>> +var_dump($unser === $data);
>> +
>> +--EXPECT--
>> +Consume full string: bool(true)
>> +Return original data: bool(true)
>> +Consume full string(junk): bool(true)
>> +Return original data(junk): bool(true)
>> +
>> diff --git a/ext/standard/var.c b/ext/standard/var.c
>> index f76a14c..4acc6f5 100644
>> --- a/ext/standard/var.c
>> +++ b/ext/standard/var.c
>> @@ -945,7 +945,7 @@ PHP_FUNCTION(serialize)
>> }
>> /* }}} */
>>
>> -/* {{{ proto mixed unserialize(string variable_representation)
>> +/* {{{ proto mixed unserialize(string variable_representation[, int &consumed])
>> Takes a string representation of variable and recreates it */
>> PHP_FUNCTION(unserialize)
>> {
>> @@ -953,8 +953,9 @@ PHP_FUNCTION(unserialize)
>> int buf_len;
>> const unsigned char *p;
>> php_unserialize_data_t var_hash;
>> + zval *consumed = NULL;
>>
>> - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &buf,
>> &buf_len) == FAILURE) {
>> + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z", &buf,
>> &buf_len, &consumed) == FAILURE) {
>> RETURN_FALSE;
>> }
>>
>> @@ -973,6 +974,11 @@ PHP_FUNCTION(unserialize)
>> RETURN_FALSE;
>> }
>> PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
>> +
>> + if (consumed) {
>> + zval_dtor(consumed);
>> + ZVAL_LONG(consumed, ((char*)p) - buf);
>> + }
>> }
>> /* }}} */
>>
>>
>> --
>> PHP CVS Mailing List (http://www.php.net/)
>> To unsubscribe, visit: http://www.php.net/unsub.php
>>
>
>
>
--
Stanislav Malyshev, Software Architect
SugarCRM: http://www.sugarcrm.com/
(408)454-6900 ext. 227