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: | Pierre Joye | Date: | Fri, 17 May 2013 05:40:51 +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 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-72193@lists.php.net to get a copy of this message | ||
hi Sara!
Please add a note to UPGRADING as well.
Thanks!
--
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
>
--
Pierre
@pierrejoye | http://blog.thepimp.net | http://www.libgd.org