@@ -234,9 +234,15 @@ typedef struct {
234
234
235
235
void php_set_session_var (char * name , size_t namelen , zval * state_val PSLS_DC )
236
236
{
237
+ zval * state_val_copy ;
237
238
PLS_FETCH ();
238
239
ELS_FETCH ();
239
240
241
+ ALLOC_ZVAL (state_val_copy );
242
+ * state_val_copy = * state_val ;
243
+ zval_copy_ctor (state_val_copy );
244
+ state_val_copy -> refcount = 0 ;
245
+
240
246
if (PG (register_globals )) {
241
247
zval * * old_symbol ;
242
248
if (zend_hash_find (& EG (symbol_table ),name ,namelen + 1 ,(void * )& old_symbol ) == SUCCESS ) {
@@ -247,14 +253,15 @@ void php_set_session_var(char *name, size_t namelen, zval *state_val PSLS_DC)
247
253
of a global variable) dangling.
248
254
*/
249
255
250
- REPLACE_ZVAL_VALUE (old_symbol ,state_val ,0 );
256
+ REPLACE_ZVAL_VALUE (old_symbol ,state_val_copy ,0 );
257
+ FREE_ZVAL (state_val_copy );
251
258
252
259
zend_set_hash_symbol (* old_symbol , name , namelen , 1 , 1 , Z_ARRVAL_P (PS (http_session_vars )));
253
260
} else {
254
- zend_set_hash_symbol (state_val , name , namelen , 1 , 2 , Z_ARRVAL_P (PS (http_session_vars )), & EG (symbol_table ));
261
+ zend_set_hash_symbol (state_val_copy , name , namelen , 1 , 2 , Z_ARRVAL_P (PS (http_session_vars )), & EG (symbol_table ));
255
262
}
256
263
} else {
257
- zend_set_hash_symbol (state_val , name , namelen , 0 , 1 , Z_ARRVAL_P (PS (http_session_vars )));
264
+ zend_set_hash_symbol (state_val_copy , name , namelen , 0 , 1 , Z_ARRVAL_P (PS (http_session_vars )));
258
265
}
259
266
}
260
267
@@ -322,6 +329,7 @@ PS_SERIALIZER_DECODE_FUNC(php_binary)
322
329
323
330
PHP_VAR_UNSERIALIZE_INIT (var_hash );
324
331
332
+ MAKE_STD_ZVAL (current );
325
333
for (p = val ; p < endptr ; ) {
326
334
namelen = * p & (~PS_BIN_UNDEF );
327
335
has_value = * p & PS_BIN_UNDEF ? 0 : 1 ;
@@ -331,16 +339,15 @@ PS_SERIALIZER_DECODE_FUNC(php_binary)
331
339
p += namelen + 1 ;
332
340
333
341
if (has_value ) {
334
- MAKE_STD_ZVAL (current );
335
342
if (php_var_unserialize (& current , & p , endptr , & var_hash )) {
336
343
php_set_session_var (name , namelen , current PSLS_CC );
344
+ zval_dtor (current );
337
345
}
338
- zval_ptr_dtor (& current );
339
346
}
340
347
PS_ADD_VARL (name , namelen );
341
348
efree (name );
342
349
}
343
-
350
+ FREE_ZVAL ( current );
344
351
PHP_VAR_UNSERIALIZE_DESTROY (var_hash );
345
352
346
353
return SUCCESS ;
@@ -398,6 +405,7 @@ PS_SERIALIZER_DECODE_FUNC(php)
398
405
399
406
PHP_VAR_UNSERIALIZE_INIT (var_hash );
400
407
408
+ MAKE_STD_ZVAL (current );
401
409
for (p = q = val ; (p < endptr ) && (q = memchr (p , PS_DELIMITER , endptr - p )); p = q ) {
402
410
if (p [0 ] == PS_UNDEF_MARKER ) {
403
411
p ++ ;
@@ -411,18 +419,17 @@ PS_SERIALIZER_DECODE_FUNC(php)
411
419
q ++ ;
412
420
413
421
if (has_value ) {
414
- MAKE_STD_ZVAL (current );
415
422
if (php_var_unserialize (& current , & q , endptr , & var_hash )) {
416
423
php_set_session_var (name , namelen , current PSLS_CC );
424
+ zval_dtor (current );
417
425
}
418
- zval_ptr_dtor (& current );
419
426
}
420
427
PS_ADD_VARL (name , namelen );
421
428
efree (name );
422
429
}
430
+ FREE_ZVAL (current );
423
431
424
432
PHP_VAR_UNSERIALIZE_DESTROY (var_hash );
425
-
426
433
return SUCCESS ;
427
434
}
428
435
0 commit comments