Re: [PHP-CVS] 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_c

2013-07-04 Thread Stas Malyshev
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 poll...@php.net wrote:
 Commit:cfd104582220d578ab1b78a5991065d038e1f931
 Author:Sara Golemon poll...@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 000..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

-- 
PHP CVS Mailing List (http://www.php.net/)
To 

Re: [PHP-CVS] 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_c

2013-05-17 Thread Nikita Popov
On Fri, May 17, 2013 at 12:18 AM, Sara Golemon poll...@php.net wrote:

 Commit:cfd104582220d578ab1b78a5991065d038e1f931
 Author:Sara Golemon poll...@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.


Imho this should have been briefly discussed on internals beforehand. At
least to me this seems rather dubious (why is it needed? why are you
manually parsing a part of the DLL serialization?) and also clashes with
Stas' proposed changes to unserialize.

Nikita


Re: [PHP-CVS] 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_c

2013-05-17 Thread Stas Malyshev
Hi!

 Imho this should have been briefly discussed on internals beforehand. At
 least to me this seems rather dubious (why is it needed? why are you
 manually parsing a part of the DLL serialization?) and also clashes with
 Stas' proposed changes to unserialize.

I don't remember any discussion and I think it's rather sad that we're
back to commit first, ask anybody else maybe paradigm. There
definitely should be notification on the list prior to changing API of
one of the very frequently used functions in the core.
-- 
Stanislav Malyshev, Software Architect
SugarCRM: http://www.sugarcrm.com/
(408)454-6900 ext. 227

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP-CVS] 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_c

2013-05-16 Thread Pierre Joye
hi Sara!

Please add a note to UPGRADING as well.

Thanks!
--
Cheers,

On Fri, May 17, 2013 at 12:18 AM, Sara Golemon poll...@php.net wrote:
 Commit:cfd104582220d578ab1b78a5991065d038e1f931
 Author:Sara Golemon poll...@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 000..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

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php