@@ -164,6 +164,10 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx)
164
164
efree_size (var_dtor_hash , sizeof (var_dtor_entries ));
165
165
var_dtor_hash = next ;
166
166
}
167
+
168
+ if ((* var_hashx )-> refs ) {
169
+ zend_array_destroy ((* var_hashx )-> refs );
170
+ }
167
171
}
168
172
169
173
/* }}} */
@@ -238,7 +242,7 @@ static inline int unserialize_allowed_class(zend_string *class_name, HashTable *
238
242
#define YYMARKER marker
239
243
240
244
241
- #line 246 "ext/standard/var_unserializer.re"
245
+ #line 250 "ext/standard/var_unserializer.re"
242
246
243
247
244
248
@@ -374,7 +378,11 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab
374
378
data = old_data ;
375
379
} else {
376
380
/* little hack to disallow references */
377
- data = zend_hash_next_index_insert (& BG (unserialize_refs ), & d );
381
+ if (!(* var_hash )-> refs ) {
382
+ (* var_hash )-> refs = emalloc (sizeof (HashTable ));
383
+ zend_hash_init ((* var_hash )-> refs , 8 , NULL , ZVAL_PTR_DTOR , 0 );
384
+ }
385
+ data = zend_hash_next_index_insert ((* var_hash )-> refs , & d );
378
386
}
379
387
} else {
380
388
var_push_dtor (var_hash , old_data );
@@ -551,7 +559,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
551
559
start = cursor ;
552
560
553
561
554
- #line 555 "ext/standard/var_unserializer.c"
562
+ #line 563 "ext/standard/var_unserializer.c"
555
563
{
556
564
YYCTYPE yych ;
557
565
static const unsigned char yybm [] = {
@@ -611,9 +619,9 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
611
619
yych = * (YYMARKER = ++ YYCURSOR );
612
620
if (yych == ':' ) goto yy95 ;
613
621
yy3 :
614
- #line 921 "ext/standard/var_unserializer.re"
622
+ #line 929 "ext/standard/var_unserializer.re"
615
623
{ return 0 ; }
616
- #line 617 "ext/standard/var_unserializer.c"
624
+ #line 625 "ext/standard/var_unserializer.c"
617
625
yy4 :
618
626
yych = * (YYMARKER = ++ YYCURSOR );
619
627
if (yych == ':' ) goto yy89 ;
@@ -656,13 +664,13 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
656
664
goto yy3 ;
657
665
yy14 :
658
666
++ YYCURSOR ;
659
- #line 915 "ext/standard/var_unserializer.re"
667
+ #line 923 "ext/standard/var_unserializer.re"
660
668
{
661
669
/* this is the case where we have less data than planned */
662
670
php_error_docref (NULL , E_NOTICE , "Unexpected end of serialized data" );
663
671
return 0 ; /* not sure if it should be 0 or 1 here? */
664
672
}
665
- #line 666 "ext/standard/var_unserializer.c"
673
+ #line 674 "ext/standard/var_unserializer.c"
666
674
yy16 :
667
675
yych = * ++ YYCURSOR ;
668
676
goto yy3 ;
@@ -692,7 +700,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
692
700
yych = * ++ YYCURSOR ;
693
701
if (yych != '"' ) goto yy18 ;
694
702
++ YYCURSOR ;
695
- #line 770 "ext/standard/var_unserializer.re"
703
+ #line 778 "ext/standard/var_unserializer.re"
696
704
{
697
705
size_t len , len2 , len3 , maxlen ;
698
706
zend_long elements ;
@@ -837,7 +845,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
837
845
838
846
return object_common2 (UNSERIALIZE_PASSTHRU , elements );
839
847
}
840
- #line 841 "ext/standard/var_unserializer.c"
848
+ #line 849 "ext/standard/var_unserializer.c"
841
849
yy25 :
842
850
yych = * ++ YYCURSOR ;
843
851
if (yych <= ',' ) {
@@ -862,14 +870,14 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
862
870
yych = * ++ YYCURSOR ;
863
871
if (yych != '"' ) goto yy18 ;
864
872
++ YYCURSOR ;
865
- #line 763 "ext/standard/var_unserializer.re"
873
+ #line 771 "ext/standard/var_unserializer.re"
866
874
{
867
875
if (!var_hash ) return 0 ;
868
876
869
877
return object_common2 (UNSERIALIZE_PASSTHRU ,
870
878
object_common1 (UNSERIALIZE_PASSTHRU , ZEND_STANDARD_CLASS_DEF_PTR ));
871
879
}
872
- #line 873 "ext/standard/var_unserializer.c"
880
+ #line 881 "ext/standard/var_unserializer.c"
873
881
yy32 :
874
882
yych = * ++ YYCURSOR ;
875
883
if (yych == '+' ) goto yy33 ;
@@ -890,7 +898,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
890
898
yych = * ++ YYCURSOR ;
891
899
if (yych != '{' ) goto yy18 ;
892
900
++ YYCURSOR ;
893
- #line 739 "ext/standard/var_unserializer.re"
901
+ #line 747 "ext/standard/var_unserializer.re"
894
902
{
895
903
zend_long elements = parse_iv (start + 2 );
896
904
/* use iv() not uiv() in order to check data range */
@@ -914,7 +922,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
914
922
915
923
return finish_nested_data (UNSERIALIZE_PASSTHRU );
916
924
}
917
- #line 918 "ext/standard/var_unserializer.c"
925
+ #line 926 "ext/standard/var_unserializer.c"
918
926
yy39 :
919
927
yych = * ++ YYCURSOR ;
920
928
if (yych == '+' ) goto yy40 ;
@@ -935,7 +943,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
935
943
yych = * ++ YYCURSOR ;
936
944
if (yych != '"' ) goto yy18 ;
937
945
++ YYCURSOR ;
938
- #line 705 "ext/standard/var_unserializer.re"
946
+ #line 713 "ext/standard/var_unserializer.re"
939
947
{
940
948
size_t len , maxlen ;
941
949
zend_string * str ;
@@ -969,7 +977,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
969
977
ZVAL_STR (rval , str );
970
978
return 1 ;
971
979
}
972
- #line 973 "ext/standard/var_unserializer.c"
980
+ #line 981 "ext/standard/var_unserializer.c"
973
981
yy46 :
974
982
yych = * ++ YYCURSOR ;
975
983
if (yych == '+' ) goto yy47 ;
@@ -990,7 +998,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
990
998
yych = * ++ YYCURSOR ;
991
999
if (yych != '"' ) goto yy18 ;
992
1000
++ YYCURSOR ;
993
- #line 673 "ext/standard/var_unserializer.re"
1001
+ #line 681 "ext/standard/var_unserializer.re"
994
1002
{
995
1003
size_t len , maxlen ;
996
1004
char * str ;
@@ -1022,7 +1030,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
1022
1030
ZVAL_STRINGL (rval , str , len );
1023
1031
return 1 ;
1024
1032
}
1025
- #line 1026 "ext/standard/var_unserializer.c"
1033
+ #line 1034 "ext/standard/var_unserializer.c"
1026
1034
yy53 :
1027
1035
yych = * ++ YYCURSOR ;
1028
1036
if (yych <= '/' ) {
@@ -1110,7 +1118,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
1110
1118
}
1111
1119
yy63 :
1112
1120
++ YYCURSOR ;
1113
- #line 664 "ext/standard/var_unserializer.re"
1121
+ #line 672 "ext/standard/var_unserializer.re"
1114
1122
{
1115
1123
#if SIZEOF_ZEND_LONG == 4
1116
1124
use_double :
@@ -1119,7 +1127,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
1119
1127
ZVAL_DOUBLE (rval , zend_strtod ((const char * )start + 2 , NULL ));
1120
1128
return 1 ;
1121
1129
}
1122
- #line 1123 "ext/standard/var_unserializer.c"
1130
+ #line 1131 "ext/standard/var_unserializer.c"
1123
1131
yy65 :
1124
1132
yych = * ++ YYCURSOR ;
1125
1133
if (yych <= ',' ) {
@@ -1178,7 +1186,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
1178
1186
yych = * ++ YYCURSOR ;
1179
1187
if (yych != ';' ) goto yy18 ;
1180
1188
++ YYCURSOR ;
1181
- #line 648 "ext/standard/var_unserializer.re"
1189
+ #line 656 "ext/standard/var_unserializer.re"
1182
1190
{
1183
1191
* p = YYCURSOR ;
1184
1192
@@ -1194,7 +1202,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
1194
1202
1195
1203
return 1 ;
1196
1204
}
1197
- #line 1198 "ext/standard/var_unserializer.c"
1205
+ #line 1206 "ext/standard/var_unserializer.c"
1198
1206
yy76 :
1199
1207
yych = * ++ YYCURSOR ;
1200
1208
if (yych == 'N' ) goto yy73 ;
@@ -1221,7 +1229,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
1221
1229
if (yych <= '9' ) goto yy79 ;
1222
1230
if (yych != ';' ) goto yy18 ;
1223
1231
++ YYCURSOR ;
1224
- #line 622 "ext/standard/var_unserializer.re"
1232
+ #line 630 "ext/standard/var_unserializer.re"
1225
1233
{
1226
1234
#if SIZEOF_ZEND_LONG == 4
1227
1235
int digits = YYCURSOR - start - 3 ;
@@ -1247,30 +1255,30 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
1247
1255
ZVAL_LONG (rval , parse_iv (start + 2 ));
1248
1256
return 1 ;
1249
1257
}
1250
- #line 1251 "ext/standard/var_unserializer.c"
1258
+ #line 1259 "ext/standard/var_unserializer.c"
1251
1259
yy83 :
1252
1260
yych = * ++ YYCURSOR ;
1253
1261
if (yych <= '/' ) goto yy18 ;
1254
1262
if (yych >= '2' ) goto yy18 ;
1255
1263
yych = * ++ YYCURSOR ;
1256
1264
if (yych != ';' ) goto yy18 ;
1257
1265
++ YYCURSOR ;
1258
- #line 616 "ext/standard/var_unserializer.re"
1266
+ #line 624 "ext/standard/var_unserializer.re"
1259
1267
{
1260
1268
* p = YYCURSOR ;
1261
1269
ZVAL_BOOL (rval , parse_iv (start + 2 ));
1262
1270
return 1 ;
1263
1271
}
1264
- #line 1265 "ext/standard/var_unserializer.c"
1272
+ #line 1273 "ext/standard/var_unserializer.c"
1265
1273
yy87 :
1266
1274
++ YYCURSOR ;
1267
- #line 610 "ext/standard/var_unserializer.re"
1275
+ #line 618 "ext/standard/var_unserializer.re"
1268
1276
{
1269
1277
* p = YYCURSOR ;
1270
1278
ZVAL_NULL (rval );
1271
1279
return 1 ;
1272
1280
}
1273
- #line 1274 "ext/standard/var_unserializer.c"
1281
+ #line 1282 "ext/standard/var_unserializer.c"
1274
1282
yy89 :
1275
1283
yych = * ++ YYCURSOR ;
1276
1284
if (yych <= ',' ) {
@@ -1293,7 +1301,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
1293
1301
if (yych <= '9' ) goto yy91 ;
1294
1302
if (yych != ';' ) goto yy18 ;
1295
1303
++ YYCURSOR ;
1296
- #line 585 "ext/standard/var_unserializer.re"
1304
+ #line 593 "ext/standard/var_unserializer.re"
1297
1305
{
1298
1306
zend_long id ;
1299
1307
@@ -1318,7 +1326,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
1318
1326
1319
1327
return 1 ;
1320
1328
}
1321
- #line 1322 "ext/standard/var_unserializer.c"
1329
+ #line 1330 "ext/standard/var_unserializer.c"
1322
1330
yy95 :
1323
1331
yych = * ++ YYCURSOR ;
1324
1332
if (yych <= ',' ) {
@@ -1341,7 +1349,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
1341
1349
if (yych <= '9' ) goto yy97 ;
1342
1350
if (yych != ';' ) goto yy18 ;
1343
1351
++ YYCURSOR ;
1344
- #line 559 "ext/standard/var_unserializer.re"
1352
+ #line 567 "ext/standard/var_unserializer.re"
1345
1353
{
1346
1354
zend_long id ;
1347
1355
@@ -1367,9 +1375,9 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
1367
1375
1368
1376
return 1 ;
1369
1377
}
1370
- #line 1371 "ext/standard/var_unserializer.c"
1378
+ #line 1379 "ext/standard/var_unserializer.c"
1371
1379
}
1372
- #line 923 "ext/standard/var_unserializer.re"
1380
+ #line 931 "ext/standard/var_unserializer.re"
1373
1381
1374
1382
1375
1383
return 0 ;
0 commit comments