Skip to content

Commit 697b1b1

Browse files
committed
Moved BG(unserialize_refs) into php_unserialize_data_t
1 parent 13c86d9 commit 697b1b1

File tree

6 files changed

+50
-40
lines changed

6 files changed

+50
-40
lines changed

ext/standard/basic_functions.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3742,8 +3742,6 @@ PHP_RINIT_FUNCTION(basic) /* {{{ */
37423742
#endif
37433743
BG(user_shutdown_function_names) = NULL;
37443744

3745-
zend_hash_init(&BG(unserialize_refs), 8, NULL, ZVAL_PTR_DTOR, 0);
3746-
37473745
PHP_RINIT(filestat)(INIT_FUNC_ARGS_PASSTHRU);
37483746
#ifdef HAVE_SYSLOG_H
37493747
BASIC_RINIT_SUBMODULE(syslog)
@@ -3773,8 +3771,6 @@ PHP_RSHUTDOWN_FUNCTION(basic) /* {{{ */
37733771
zend_hash_destroy(&BG(putenv_ht));
37743772
#endif
37753773

3776-
zend_hash_destroy(&BG(unserialize_refs));
3777-
37783774
if (BG(umask) != -1) {
37793775
umask(BG(umask));
37803776
}

ext/standard/basic_functions.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,6 @@ typedef struct _php_basic_globals {
208208
struct php_unserialize_data *data;
209209
unsigned level;
210210
} unserialize;
211-
HashTable unserialize_refs;
212211

213212
/* url_scanner_ex.re */
214213
url_adapt_state_ex_t url_adapt_state_ex;

ext/standard/php_var.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ struct php_unserialize_data {
4848
void *last;
4949
void *first_dtor;
5050
void *last_dtor;
51+
HashTable *refs;
5152
};
5253

5354
typedef struct php_serialize_data *php_serialize_data_t;

ext/standard/var.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,7 +1126,6 @@ PHP_FUNCTION(unserialize)
11261126
zend_hash_destroy(class_hash);
11271127
FREE_HASHTABLE(class_hash);
11281128
}
1129-
zend_hash_clean(&BG(unserialize_refs));
11301129
zval_ptr_dtor(return_value);
11311130
if (!EG(exception)) {
11321131
php_error_docref(NULL, E_NOTICE, "Error at offset " ZEND_LONG_FMT " of %zd bytes",
@@ -1148,7 +1147,6 @@ PHP_FUNCTION(unserialize)
11481147
zend_hash_destroy(class_hash);
11491148
FREE_HASHTABLE(class_hash);
11501149
}
1151-
zend_hash_clean(&BG(unserialize_refs));
11521150
}
11531151
/* }}} */
11541152

ext/standard/var_unserializer.c

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,10 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx)
164164
efree_size(var_dtor_hash, sizeof(var_dtor_entries));
165165
var_dtor_hash = next;
166166
}
167+
168+
if ((*var_hashx)->refs) {
169+
zend_array_destroy((*var_hashx)->refs);
170+
}
167171
}
168172

169173
/* }}} */
@@ -238,7 +242,7 @@ static inline int unserialize_allowed_class(zend_string *class_name, HashTable *
238242
#define YYMARKER marker
239243

240244

241-
#line 246 "ext/standard/var_unserializer.re"
245+
#line 250 "ext/standard/var_unserializer.re"
242246

243247

244248

@@ -374,7 +378,11 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab
374378
data = old_data;
375379
} else {
376380
/* 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);
378386
}
379387
} else {
380388
var_push_dtor(var_hash, old_data);
@@ -551,7 +559,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
551559
start = cursor;
552560

553561

554-
#line 555 "ext/standard/var_unserializer.c"
562+
#line 563 "ext/standard/var_unserializer.c"
555563
{
556564
YYCTYPE yych;
557565
static const unsigned char yybm[] = {
@@ -611,9 +619,9 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
611619
yych = *(YYMARKER = ++YYCURSOR);
612620
if (yych == ':') goto yy95;
613621
yy3:
614-
#line 921 "ext/standard/var_unserializer.re"
622+
#line 929 "ext/standard/var_unserializer.re"
615623
{ return 0; }
616-
#line 617 "ext/standard/var_unserializer.c"
624+
#line 625 "ext/standard/var_unserializer.c"
617625
yy4:
618626
yych = *(YYMARKER = ++YYCURSOR);
619627
if (yych == ':') goto yy89;
@@ -656,13 +664,13 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
656664
goto yy3;
657665
yy14:
658666
++YYCURSOR;
659-
#line 915 "ext/standard/var_unserializer.re"
667+
#line 923 "ext/standard/var_unserializer.re"
660668
{
661669
/* this is the case where we have less data than planned */
662670
php_error_docref(NULL, E_NOTICE, "Unexpected end of serialized data");
663671
return 0; /* not sure if it should be 0 or 1 here? */
664672
}
665-
#line 666 "ext/standard/var_unserializer.c"
673+
#line 674 "ext/standard/var_unserializer.c"
666674
yy16:
667675
yych = *++YYCURSOR;
668676
goto yy3;
@@ -692,7 +700,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
692700
yych = *++YYCURSOR;
693701
if (yych != '"') goto yy18;
694702
++YYCURSOR;
695-
#line 770 "ext/standard/var_unserializer.re"
703+
#line 778 "ext/standard/var_unserializer.re"
696704
{
697705
size_t len, len2, len3, maxlen;
698706
zend_long elements;
@@ -837,7 +845,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
837845

838846
return object_common2(UNSERIALIZE_PASSTHRU, elements);
839847
}
840-
#line 841 "ext/standard/var_unserializer.c"
848+
#line 849 "ext/standard/var_unserializer.c"
841849
yy25:
842850
yych = *++YYCURSOR;
843851
if (yych <= ',') {
@@ -862,14 +870,14 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
862870
yych = *++YYCURSOR;
863871
if (yych != '"') goto yy18;
864872
++YYCURSOR;
865-
#line 763 "ext/standard/var_unserializer.re"
873+
#line 771 "ext/standard/var_unserializer.re"
866874
{
867875
if (!var_hash) return 0;
868876

869877
return object_common2(UNSERIALIZE_PASSTHRU,
870878
object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR));
871879
}
872-
#line 873 "ext/standard/var_unserializer.c"
880+
#line 881 "ext/standard/var_unserializer.c"
873881
yy32:
874882
yych = *++YYCURSOR;
875883
if (yych == '+') goto yy33;
@@ -890,7 +898,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
890898
yych = *++YYCURSOR;
891899
if (yych != '{') goto yy18;
892900
++YYCURSOR;
893-
#line 739 "ext/standard/var_unserializer.re"
901+
#line 747 "ext/standard/var_unserializer.re"
894902
{
895903
zend_long elements = parse_iv(start + 2);
896904
/* use iv() not uiv() in order to check data range */
@@ -914,7 +922,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
914922

915923
return finish_nested_data(UNSERIALIZE_PASSTHRU);
916924
}
917-
#line 918 "ext/standard/var_unserializer.c"
925+
#line 926 "ext/standard/var_unserializer.c"
918926
yy39:
919927
yych = *++YYCURSOR;
920928
if (yych == '+') goto yy40;
@@ -935,7 +943,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
935943
yych = *++YYCURSOR;
936944
if (yych != '"') goto yy18;
937945
++YYCURSOR;
938-
#line 705 "ext/standard/var_unserializer.re"
946+
#line 713 "ext/standard/var_unserializer.re"
939947
{
940948
size_t len, maxlen;
941949
zend_string *str;
@@ -969,7 +977,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
969977
ZVAL_STR(rval, str);
970978
return 1;
971979
}
972-
#line 973 "ext/standard/var_unserializer.c"
980+
#line 981 "ext/standard/var_unserializer.c"
973981
yy46:
974982
yych = *++YYCURSOR;
975983
if (yych == '+') goto yy47;
@@ -990,7 +998,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
990998
yych = *++YYCURSOR;
991999
if (yych != '"') goto yy18;
9921000
++YYCURSOR;
993-
#line 673 "ext/standard/var_unserializer.re"
1001+
#line 681 "ext/standard/var_unserializer.re"
9941002
{
9951003
size_t len, maxlen;
9961004
char *str;
@@ -1022,7 +1030,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
10221030
ZVAL_STRINGL(rval, str, len);
10231031
return 1;
10241032
}
1025-
#line 1026 "ext/standard/var_unserializer.c"
1033+
#line 1034 "ext/standard/var_unserializer.c"
10261034
yy53:
10271035
yych = *++YYCURSOR;
10281036
if (yych <= '/') {
@@ -1110,7 +1118,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
11101118
}
11111119
yy63:
11121120
++YYCURSOR;
1113-
#line 664 "ext/standard/var_unserializer.re"
1121+
#line 672 "ext/standard/var_unserializer.re"
11141122
{
11151123
#if SIZEOF_ZEND_LONG == 4
11161124
use_double:
@@ -1119,7 +1127,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
11191127
ZVAL_DOUBLE(rval, zend_strtod((const char *)start + 2, NULL));
11201128
return 1;
11211129
}
1122-
#line 1123 "ext/standard/var_unserializer.c"
1130+
#line 1131 "ext/standard/var_unserializer.c"
11231131
yy65:
11241132
yych = *++YYCURSOR;
11251133
if (yych <= ',') {
@@ -1178,7 +1186,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
11781186
yych = *++YYCURSOR;
11791187
if (yych != ';') goto yy18;
11801188
++YYCURSOR;
1181-
#line 648 "ext/standard/var_unserializer.re"
1189+
#line 656 "ext/standard/var_unserializer.re"
11821190
{
11831191
*p = YYCURSOR;
11841192

@@ -1194,7 +1202,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
11941202

11951203
return 1;
11961204
}
1197-
#line 1198 "ext/standard/var_unserializer.c"
1205+
#line 1206 "ext/standard/var_unserializer.c"
11981206
yy76:
11991207
yych = *++YYCURSOR;
12001208
if (yych == 'N') goto yy73;
@@ -1221,7 +1229,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
12211229
if (yych <= '9') goto yy79;
12221230
if (yych != ';') goto yy18;
12231231
++YYCURSOR;
1224-
#line 622 "ext/standard/var_unserializer.re"
1232+
#line 630 "ext/standard/var_unserializer.re"
12251233
{
12261234
#if SIZEOF_ZEND_LONG == 4
12271235
int digits = YYCURSOR - start - 3;
@@ -1247,30 +1255,30 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
12471255
ZVAL_LONG(rval, parse_iv(start + 2));
12481256
return 1;
12491257
}
1250-
#line 1251 "ext/standard/var_unserializer.c"
1258+
#line 1259 "ext/standard/var_unserializer.c"
12511259
yy83:
12521260
yych = *++YYCURSOR;
12531261
if (yych <= '/') goto yy18;
12541262
if (yych >= '2') goto yy18;
12551263
yych = *++YYCURSOR;
12561264
if (yych != ';') goto yy18;
12571265
++YYCURSOR;
1258-
#line 616 "ext/standard/var_unserializer.re"
1266+
#line 624 "ext/standard/var_unserializer.re"
12591267
{
12601268
*p = YYCURSOR;
12611269
ZVAL_BOOL(rval, parse_iv(start + 2));
12621270
return 1;
12631271
}
1264-
#line 1265 "ext/standard/var_unserializer.c"
1272+
#line 1273 "ext/standard/var_unserializer.c"
12651273
yy87:
12661274
++YYCURSOR;
1267-
#line 610 "ext/standard/var_unserializer.re"
1275+
#line 618 "ext/standard/var_unserializer.re"
12681276
{
12691277
*p = YYCURSOR;
12701278
ZVAL_NULL(rval);
12711279
return 1;
12721280
}
1273-
#line 1274 "ext/standard/var_unserializer.c"
1281+
#line 1282 "ext/standard/var_unserializer.c"
12741282
yy89:
12751283
yych = *++YYCURSOR;
12761284
if (yych <= ',') {
@@ -1293,7 +1301,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
12931301
if (yych <= '9') goto yy91;
12941302
if (yych != ';') goto yy18;
12951303
++YYCURSOR;
1296-
#line 585 "ext/standard/var_unserializer.re"
1304+
#line 593 "ext/standard/var_unserializer.re"
12971305
{
12981306
zend_long id;
12991307

@@ -1318,7 +1326,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
13181326

13191327
return 1;
13201328
}
1321-
#line 1322 "ext/standard/var_unserializer.c"
1329+
#line 1330 "ext/standard/var_unserializer.c"
13221330
yy95:
13231331
yych = *++YYCURSOR;
13241332
if (yych <= ',') {
@@ -1341,7 +1349,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
13411349
if (yych <= '9') goto yy97;
13421350
if (yych != ';') goto yy18;
13431351
++YYCURSOR;
1344-
#line 559 "ext/standard/var_unserializer.re"
1352+
#line 567 "ext/standard/var_unserializer.re"
13451353
{
13461354
zend_long id;
13471355

@@ -1367,9 +1375,9 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
13671375

13681376
return 1;
13691377
}
1370-
#line 1371 "ext/standard/var_unserializer.c"
1378+
#line 1379 "ext/standard/var_unserializer.c"
13711379
}
1372-
#line 923 "ext/standard/var_unserializer.re"
1380+
#line 931 "ext/standard/var_unserializer.re"
13731381

13741382

13751383
return 0;

ext/standard/var_unserializer.re

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,10 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx)
162162
efree_size(var_dtor_hash, sizeof(var_dtor_entries));
163163
var_dtor_hash = next;
164164
}
165+
166+
if ((*var_hashx)->refs) {
167+
zend_array_destroy((*var_hashx)->refs);
168+
}
165169
}
166170

167171
/* }}} */
@@ -378,7 +382,11 @@ string_key:
378382
data = old_data;
379383
} else {
380384
/* little hack to disallow references */
381-
data = zend_hash_next_index_insert(&BG(unserialize_refs), &d);
385+
if (!(*var_hash)->refs) {
386+
(*var_hash)->refs = emalloc(sizeof(HashTable));
387+
zend_hash_init((*var_hash)->refs, 8, NULL, ZVAL_PTR_DTOR, 0);
388+
}
389+
data = zend_hash_next_index_insert((*var_hash)->refs, &d);
382390
}
383391
} else {
384392
var_push_dtor(var_hash, old_data);

0 commit comments

Comments
 (0)