@@ -40,7 +40,7 @@ class PhpSerialize extends AbstractAdapter
4040 /**
4141 * @var null|string Serialized boolean false value
4242 */
43- private static $ _serializedFalse = null ;
43+ private static $ serializedFalse = null ;
4444
4545 /**
4646 * Constructor
@@ -54,8 +54,8 @@ public function __construct($opts = array())
5454
5555 // needed to check if a returned false is based on a serialize false
5656 // or based on failure (igbinary can overwrite [un]serialize functions)
57- if (self ::$ _serializedFalse === null ) {
58- self ::$ _serializedFalse = serialize (false );
57+ if (self ::$ serializedFalse === null ) {
58+ self ::$ serializedFalse = serialize (false );
5959 }
6060 }
6161
@@ -69,11 +69,17 @@ public function __construct($opts = array())
6969 */
7070 public function serialize ($ value , array $ opts = array ())
7171 {
72+ set_error_handler (function ($ errno , $ errstr = '' , $ errfile = '' , $ errline = '' ) {
73+ $ message = sprintf (
74+ 'Error with serialize operation in %s:%d: %s ' ,
75+ $ errfile ,
76+ $ errline ,
77+ $ errstr
78+ );
79+ throw new RuntimeException ($ message , $ errno );
80+ });
7281 $ ret = serialize ($ value );
73- if ($ ret === false ) {
74- $ lastErr = error_get_last ();
75- throw new RuntimeException ($ lastErr ['message ' ]);
76- }
82+ restore_error_handler ();
7783 return $ ret ;
7884 }
7985
@@ -88,11 +94,37 @@ public function serialize($value, array $opts = array())
8894 */
8995 public function unserialize ($ serialized , array $ opts = array ())
9096 {
91- $ ret = @unserialize ($ serialized );
92- if ($ ret === false && $ serialized !== self ::$ _serializedFalse ) {
93- $ lastErr = error_get_last ();
94- throw new RuntimeException ($ lastErr ['message ' ]);
97+ if (!is_string ($ serialized )) {
98+ // Must already be unserialized!
99+ return $ serialized ;
100+ throw new RuntimeException (sprintf (
101+ '%s expects a serialized string argument; received "%s" ' ,
102+ __METHOD__ ,
103+ (is_object ($ serialized ) ? get_class ($ serialized ) : gettype ($ serialized ))
104+ ));
105+ }
106+ if (!preg_match ('/^((s|i|d|b|a|O|C):|N;)/ ' , $ serialized )) {
107+ return $ serialized ;
95108 }
109+
110+ // If we have a serialized boolean false value, just return false;
111+ // prevents the unserialize handler from creating an error.
112+ if ($ serialized === self ::$ serializedFalse ) {
113+ return false ;
114+ }
115+
116+ set_error_handler (function ($ errno , $ errstr = '' , $ errfile = '' , $ errline = '' ) use ($ serialized ) {
117+ $ message = sprintf (
118+ 'Error with unserialize operation in %s:%d: %s; (string: "%s") ' ,
119+ $ errfile ,
120+ $ errline ,
121+ $ errstr ,
122+ $ serialized
123+ );
124+ throw new RuntimeException ($ message , $ errno );
125+ }, E_NOTICE );
126+ $ ret = unserialize ($ serialized );
127+ restore_error_handler ();
96128 return $ ret ;
97129 }
98130}
0 commit comments