@@ -283,6 +283,16 @@ static encodePtr find_encoder_by_type_name(sdlPtr sdl, const char *type)
283
283
return NULL ;
284
284
}
285
285
286
+ static zval * soap_hash_str_find_deref (HashTable * ht , const char * str , size_t len ) {
287
+ zval * zv = zend_hash_str_find (ht , str , len );
288
+ if (!zv ) {
289
+ return NULL ;
290
+ }
291
+
292
+ ZVAL_DEREF (zv );
293
+ return zv ;
294
+ }
295
+
286
296
static zend_bool soap_check_zval_ref (zval * data , xmlNodePtr node ) {
287
297
xmlNodePtr node_ptr ;
288
298
@@ -380,6 +390,10 @@ static xmlNodePtr master_to_xml_int(encodePtr encode, zval *data, int style, xml
380
390
xmlNodePtr node = NULL ;
381
391
int add_type = 0 ;
382
392
393
+ if (data ) {
394
+ ZVAL_DEREF (data );
395
+ }
396
+
383
397
/* Special handling of class SoapVar */
384
398
if (data &&
385
399
Z_TYPE_P (data ) == IS_OBJECT &&
@@ -388,14 +402,14 @@ static xmlNodePtr master_to_xml_int(encodePtr encode, zval *data, int style, xml
388
402
encodePtr enc = NULL ;
389
403
HashTable * ht = Z_OBJPROP_P (data );
390
404
391
- if ((ztype = zend_hash_str_find (ht , "enc_type" , sizeof ("enc_type" )- 1 )) == NULL ||
405
+ if ((ztype = soap_hash_str_find_deref (ht , "enc_type" , sizeof ("enc_type" )- 1 )) == NULL ||
392
406
Z_TYPE_P (ztype ) != IS_LONG ) {
393
407
soap_error0 (E_ERROR , "Encoding: SoapVar has no 'enc_type' property" );
394
408
}
395
409
396
- if ((zstype = zend_hash_str_find (ht , "enc_stype" , sizeof ("enc_stype" )- 1 )) != NULL &&
410
+ if ((zstype = soap_hash_str_find_deref (ht , "enc_stype" , sizeof ("enc_stype" )- 1 )) != NULL &&
397
411
Z_TYPE_P (zstype ) == IS_STRING ) {
398
- if ((zns = zend_hash_str_find (ht , "enc_ns" , sizeof ("enc_ns" )- 1 )) != NULL &&
412
+ if ((zns = soap_hash_str_find_deref (ht , "enc_ns" , sizeof ("enc_ns" )- 1 )) != NULL &&
399
413
Z_TYPE_P (zns ) == IS_STRING ) {
400
414
enc = get_encoder (SOAP_GLOBAL (sdl ), Z_STRVAL_P (zns ), Z_STRVAL_P (zstype ));
401
415
} else {
@@ -422,13 +436,13 @@ static xmlNodePtr master_to_xml_int(encodePtr encode, zval *data, int style, xml
422
436
enc = encode ;
423
437
}
424
438
425
- zdata = zend_hash_str_find (ht , "enc_value" , sizeof ("enc_value" )- 1 );
439
+ zdata = soap_hash_str_find_deref (ht , "enc_value" , sizeof ("enc_value" )- 1 );
426
440
node = master_to_xml (enc , zdata , style , parent );
427
441
428
442
if (style == SOAP_ENCODED || (SOAP_GLOBAL (sdl ) && encode != enc )) {
429
- if ((zstype = zend_hash_str_find (ht , "enc_stype" , sizeof ("enc_stype" )- 1 )) != NULL &&
443
+ if ((zstype = soap_hash_str_find_deref (ht , "enc_stype" , sizeof ("enc_stype" )- 1 )) != NULL &&
430
444
Z_TYPE_P (zstype ) == IS_STRING ) {
431
- if ((zns = zend_hash_str_find (ht , "enc_ns" , sizeof ("enc_ns" )- 1 )) != NULL &&
445
+ if ((zns = soap_hash_str_find_deref (ht , "enc_ns" , sizeof ("enc_ns" )- 1 )) != NULL &&
432
446
Z_TYPE_P (zns ) == IS_STRING ) {
433
447
set_ns_and_type_ex (node , Z_STRVAL_P (zns ), Z_STRVAL_P (zstype ));
434
448
} else {
@@ -437,11 +451,11 @@ static xmlNodePtr master_to_xml_int(encodePtr encode, zval *data, int style, xml
437
451
}
438
452
}
439
453
440
- if ((zname = zend_hash_str_find (ht , "enc_name" , sizeof ("enc_name" )- 1 )) != NULL &&
454
+ if ((zname = soap_hash_str_find_deref (ht , "enc_name" , sizeof ("enc_name" )- 1 )) != NULL &&
441
455
Z_TYPE_P (zname ) == IS_STRING ) {
442
456
xmlNodeSetName (node , BAD_CAST (Z_STRVAL_P (zname )));
443
457
}
444
- if ((znamens = zend_hash_str_find (ht , "enc_namens" , sizeof ("enc_namens" )- 1 )) != NULL &&
458
+ if ((znamens = soap_hash_str_find_deref (ht , "enc_namens" , sizeof ("enc_namens" )- 1 )) != NULL &&
445
459
Z_TYPE_P (znamens ) == IS_STRING ) {
446
460
xmlNsPtr nsp = encode_add_ns (node , Z_STRVAL_P (znamens ));
447
461
xmlSetNs (node , nsp );
@@ -455,6 +469,7 @@ static xmlNodePtr master_to_xml_int(encodePtr encode, zval *data, int style, xml
455
469
zend_string * type_name ;
456
470
457
471
ZEND_HASH_FOREACH_STR_KEY_VAL (SOAP_GLOBAL (class_map ), type_name , tmp ) {
472
+ ZVAL_DEREF (tmp );
458
473
if (Z_TYPE_P (tmp ) == IS_STRING &&
459
474
ZSTR_LEN (ce -> name ) == Z_STRLEN_P (tmp ) &&
460
475
zend_binary_strncasecmp (ZSTR_VAL (ce -> name ), ZSTR_LEN (ce -> name ), Z_STRVAL_P (tmp ), ZSTR_LEN (ce -> name ), ZSTR_LEN (ce -> name )) == 0 &&
@@ -1193,20 +1208,18 @@ static zval* get_zval_property(zval* object, char* name, zval *rv)
1193
1208
if (property_info != ZEND_WRONG_PROPERTY_INFO && property_info &&
1194
1209
zend_hash_exists (Z_OBJPROP_P (object ), property_info -> name )) {
1195
1210
zval_ptr_dtor (& member );
1211
+ ZVAL_DEREF (data );
1196
1212
return data ;
1197
1213
}
1198
1214
zval_ptr_dtor (& member );
1199
1215
return NULL ;
1200
1216
}
1201
1217
zval_ptr_dtor (& member );
1202
1218
EG (scope ) = old_scope ;
1219
+ ZVAL_DEREF (data );
1203
1220
return data ;
1204
1221
} else if (Z_TYPE_P (object ) == IS_ARRAY ) {
1205
- zval * data_ptr ;
1206
-
1207
- if ((data_ptr = zend_hash_str_find (Z_ARRVAL_P (object ), name , strlen (name ))) != NULL ) {
1208
- return data_ptr ;
1209
- }
1222
+ return soap_hash_str_find_deref (Z_ARRVAL_P (object ), name , strlen (name ));
1210
1223
}
1211
1224
return NULL ;
1212
1225
}
@@ -1421,7 +1434,7 @@ static zval *to_zval_object_ex(zval *ret, encodeTypePtr type, xmlNodePtr data, z
1421
1434
zval * classname ;
1422
1435
zend_class_entry * tmp ;
1423
1436
1424
- if ((classname = zend_hash_str_find (SOAP_GLOBAL (class_map ), type -> type_str , strlen (type -> type_str ))) != NULL &&
1437
+ if ((classname = soap_hash_str_find_deref (SOAP_GLOBAL (class_map ), type -> type_str , strlen (type -> type_str ))) != NULL &&
1425
1438
Z_TYPE_P (classname ) == IS_STRING &&
1426
1439
(tmp = zend_fetch_class (Z_STR_P (classname ), ZEND_FETCH_CLASS_AUTO )) != NULL ) {
1427
1440
ce = tmp ;
@@ -1642,6 +1655,7 @@ static int model_to_xml_object(xmlNodePtr node, sdlContentModelPtr model, zval *
1642
1655
zval * val ;
1643
1656
1644
1657
ZEND_HASH_FOREACH_VAL (ht , val ) {
1658
+ ZVAL_DEREF (val );
1645
1659
if (Z_TYPE_P (val ) == IS_NULL && model -> u .element -> nillable ) {
1646
1660
property = xmlNewNode (NULL , BAD_CAST ("BOGUS" ));
1647
1661
xmlAddChild (node , property );
@@ -1896,6 +1910,7 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo
1896
1910
1897
1911
ZEND_HASH_FOREACH_VAL (prop , val ) {
1898
1912
xmlNodePtr property ;
1913
+ ZVAL_DEREF (val );
1899
1914
if (Z_TYPE_P (val ) == IS_NULL && array_el -> nillable ) {
1900
1915
property = xmlNewNode (NULL , BAD_CAST ("BOGUS" ));
1901
1916
xmlAddChild (xmlParam , property );
@@ -2327,6 +2342,7 @@ static xmlNodePtr to_xml_array(encodeTypePtr type, zval *data, int style, xmlNod
2327
2342
ZEND_HASH_FOREACH_VAL_IND (Z_ARRVAL_P (el ), el ) {
2328
2343
break ;
2329
2344
} ZEND_HASH_FOREACH_END ();
2345
+ ZVAL_DEREF (el );
2330
2346
if (Z_TYPE_P (el ) == IS_ARRAY ) {
2331
2347
dims [i ] = zend_hash_num_elements (Z_ARRVAL_P (el ));
2332
2348
} else {
@@ -3520,20 +3536,20 @@ static encodePtr get_array_type(xmlNodePtr node, zval *array, smart_str *type)
3520
3536
Z_OBJCE_P (tmp ) == soap_var_class_entry ) {
3521
3537
zval * ztype ;
3522
3538
3523
- if ((ztype = zend_hash_str_find (Z_OBJPROP_P (tmp ), "enc_type" , sizeof ("enc_type" )- 1 )) == NULL ||
3539
+ if ((ztype = soap_hash_str_find_deref (Z_OBJPROP_P (tmp ), "enc_type" , sizeof ("enc_type" )- 1 )) == NULL ||
3524
3540
Z_TYPE_P (ztype ) != IS_LONG ) {
3525
3541
soap_error0 (E_ERROR , "Encoding: SoapVar has no 'enc_type' property" );
3526
3542
}
3527
3543
cur_type = Z_LVAL_P (ztype );
3528
3544
3529
- if ((ztype = zend_hash_str_find (Z_OBJPROP_P (tmp ), "enc_stype" , sizeof ("enc_stype" )- 1 )) != NULL &&
3545
+ if ((ztype = soap_hash_str_find_deref (Z_OBJPROP_P (tmp ), "enc_stype" , sizeof ("enc_stype" )- 1 )) != NULL &&
3530
3546
Z_TYPE_P (ztype ) == IS_STRING ) {
3531
3547
cur_stype = Z_STRVAL_P (ztype );
3532
3548
} else {
3533
3549
cur_stype = NULL ;
3534
3550
}
3535
3551
3536
- if ((ztype = zend_hash_str_find (Z_OBJPROP_P (tmp ), "enc_ns" , sizeof ("enc_ns" )- 1 )) != NULL &&
3552
+ if ((ztype = soap_hash_str_find_deref (Z_OBJPROP_P (tmp ), "enc_ns" , sizeof ("enc_ns" )- 1 )) != NULL &&
3537
3553
Z_TYPE_P (ztype ) == IS_STRING ) {
3538
3554
cur_ns = Z_STRVAL_P (ztype );
3539
3555
} else {
0 commit comments