Skip to content

Commit e6707a5

Browse files
committed
ext/standard/array.c: assert on conditions which are always false
1 parent 2098a89 commit e6707a5

File tree

1 file changed

+127
-140
lines changed

1 file changed

+127
-140
lines changed

ext/standard/array.c

Lines changed: 127 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -1943,26 +1943,24 @@ static zend_long php_extract_ref_prefix_if_exists(zend_array *arr, zend_array *s
19431943
}
19441944
php_prefix_varname(&final_name, prefix, ZSTR_VAL(var_name), ZSTR_LEN(var_name), true);
19451945
if (php_valid_var_name(Z_STR(final_name))) {
1946-
if (zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS))) {
1947-
zend_throw_error(NULL, "Cannot re-assign $this");
1948-
return -1;
1946+
/* Prefixed varname cannot be equal to "this" due to underscore between prefix and name */
1947+
ZEND_ASSERT(!zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS)));
1948+
1949+
if (Z_ISREF_P(entry)) {
1950+
Z_ADDREF_P(entry);
19491951
} else {
1950-
if (Z_ISREF_P(entry)) {
1951-
Z_ADDREF_P(entry);
1952-
} else {
1953-
ZVAL_MAKE_REF_EX(entry, 2);
1954-
}
1955-
if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) {
1956-
if (Z_TYPE_P(orig_var) == IS_INDIRECT) {
1957-
orig_var = Z_INDIRECT_P(orig_var);
1958-
}
1959-
zval_ptr_dtor(orig_var);
1960-
ZVAL_REF(orig_var, Z_REF_P(entry));
1961-
} else {
1962-
zend_hash_add_new(symbol_table, Z_STR(final_name), entry);
1952+
ZVAL_MAKE_REF_EX(entry, 2);
1953+
}
1954+
if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) {
1955+
if (Z_TYPE_P(orig_var) == IS_INDIRECT) {
1956+
orig_var = Z_INDIRECT_P(orig_var);
19631957
}
1964-
count++;
1958+
zval_ptr_dtor(orig_var);
1959+
ZVAL_REF(orig_var, Z_REF_P(entry));
1960+
} else {
1961+
zend_hash_add_new(symbol_table, Z_STR(final_name), entry);
19651962
}
1963+
count++;
19661964
}
19671965
zval_ptr_dtor_str(&final_name);
19681966
}
@@ -1997,26 +1995,24 @@ static zend_long php_extract_prefix_if_exists(zend_array *arr, zend_array *symbo
19971995
}
19981996
php_prefix_varname(&final_name, prefix, ZSTR_VAL(var_name), ZSTR_LEN(var_name), true);
19991997
if (php_valid_var_name(Z_STR(final_name))) {
2000-
if (zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS))) {
2001-
zend_throw_error(NULL, "Cannot re-assign $this");
2002-
return -1;
2003-
} else {
2004-
ZVAL_DEREF(entry);
2005-
if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) {
2006-
if (Z_TYPE_P(orig_var) == IS_INDIRECT) {
2007-
orig_var = Z_INDIRECT_P(orig_var);
2008-
}
2009-
ZEND_TRY_ASSIGN_COPY_EX(orig_var, entry, 0);
2010-
if (UNEXPECTED(EG(exception))) {
2011-
zend_string_release_ex(Z_STR(final_name), 0);
2012-
return -1;
2013-
}
2014-
} else {
2015-
Z_TRY_ADDREF_P(entry);
2016-
zend_hash_add_new(symbol_table, Z_STR(final_name), entry);
1998+
/* Prefixed varname cannot be equal to "this" due to underscore between prefix and name */
1999+
ZEND_ASSERT(!zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS)));
2000+
2001+
ZVAL_DEREF(entry);
2002+
if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) {
2003+
if (Z_TYPE_P(orig_var) == IS_INDIRECT) {
2004+
orig_var = Z_INDIRECT_P(orig_var);
20172005
}
2018-
count++;
2006+
ZEND_TRY_ASSIGN_COPY_EX(orig_var, entry, 0);
2007+
if (UNEXPECTED(EG(exception))) {
2008+
zend_string_release_ex(Z_STR(final_name), 0);
2009+
return -1;
2010+
}
2011+
} else {
2012+
Z_TRY_ADDREF_P(entry);
2013+
zend_hash_add_new(symbol_table, Z_STR(final_name), entry);
20192014
}
2015+
count++;
20202016
}
20212017
zval_ptr_dtor_str(&final_name);
20222018
}
@@ -2060,26 +2056,24 @@ static zend_long php_extract_ref_prefix_same(zend_array *arr, zend_array *symbol
20602056
prefix:
20612057
php_prefix_varname(&final_name, prefix, ZSTR_VAL(var_name), ZSTR_LEN(var_name), true);
20622058
if (php_valid_var_name(Z_STR(final_name))) {
2063-
if (zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS))) {
2064-
zend_throw_error(NULL, "Cannot re-assign $this");
2065-
return -1;
2059+
/* Prefixed varname cannot be equal to "this" due to underscore between prefix and name */
2060+
ZEND_ASSERT(!zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS)));
2061+
2062+
if (Z_ISREF_P(entry)) {
2063+
Z_ADDREF_P(entry);
20662064
} else {
2067-
if (Z_ISREF_P(entry)) {
2068-
Z_ADDREF_P(entry);
2069-
} else {
2070-
ZVAL_MAKE_REF_EX(entry, 2);
2071-
}
2072-
if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) {
2073-
if (Z_TYPE_P(orig_var) == IS_INDIRECT) {
2074-
orig_var = Z_INDIRECT_P(orig_var);
2075-
}
2076-
zval_ptr_dtor(orig_var);
2077-
ZVAL_REF(orig_var, Z_REF_P(entry));
2078-
} else {
2079-
zend_hash_add_new(symbol_table, Z_STR(final_name), entry);
2065+
ZVAL_MAKE_REF_EX(entry, 2);
2066+
}
2067+
if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) {
2068+
if (Z_TYPE_P(orig_var) == IS_INDIRECT) {
2069+
orig_var = Z_INDIRECT_P(orig_var);
20802070
}
2081-
count++;
2071+
zval_ptr_dtor(orig_var);
2072+
ZVAL_REF(orig_var, Z_REF_P(entry));
2073+
} else {
2074+
zend_hash_add_new(symbol_table, Z_STR(final_name), entry);
20822075
}
2076+
count++;
20832077
}
20842078
zval_ptr_dtor_str(&final_name);
20852079
} else {
@@ -2132,26 +2126,24 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab
21322126
prefix:
21332127
php_prefix_varname(&final_name, prefix, ZSTR_VAL(var_name), ZSTR_LEN(var_name), true);
21342128
if (php_valid_var_name(Z_STR(final_name))) {
2135-
if (zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS))) {
2136-
zend_throw_error(NULL, "Cannot re-assign $this");
2137-
return -1;
2138-
} else {
2139-
ZVAL_DEREF(entry);
2140-
if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) {
2141-
if (Z_TYPE_P(orig_var) == IS_INDIRECT) {
2142-
orig_var = Z_INDIRECT_P(orig_var);
2143-
}
2144-
ZEND_TRY_ASSIGN_COPY_EX(orig_var, entry, 0);
2145-
if (UNEXPECTED(EG(exception))) {
2146-
zend_string_release_ex(Z_STR(final_name), 0);
2147-
return -1;
2148-
}
2149-
} else {
2150-
Z_TRY_ADDREF_P(entry);
2151-
zend_hash_add_new(symbol_table, Z_STR(final_name), entry);
2129+
/* Prefixed varname cannot be equal to "this" due to underscore between prefix and name */
2130+
ZEND_ASSERT(!zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS)));
2131+
2132+
ZVAL_DEREF(entry);
2133+
if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) {
2134+
if (Z_TYPE_P(orig_var) == IS_INDIRECT) {
2135+
orig_var = Z_INDIRECT_P(orig_var);
21522136
}
2153-
count++;
2137+
ZEND_TRY_ASSIGN_COPY_EX(orig_var, entry, 0);
2138+
if (UNEXPECTED(EG(exception))) {
2139+
zend_string_release_ex(Z_STR(final_name), 0);
2140+
return -1;
2141+
}
2142+
} else {
2143+
Z_TRY_ADDREF_P(entry);
2144+
zend_hash_add_new(symbol_table, Z_STR(final_name), entry);
21542145
}
2146+
count++;
21552147
}
21562148
zval_ptr_dtor_str(&final_name);
21572149
} else {
@@ -2191,26 +2183,24 @@ static zend_long php_extract_ref_prefix_all(zend_array *arr, zend_array *symbol_
21912183
zend_string_release_ex(str, 0);
21922184
}
21932185
if (php_valid_var_name(Z_STR(final_name))) {
2194-
if (zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS))) {
2195-
zend_throw_error(NULL, "Cannot re-assign $this");
2196-
return -1;
2186+
/* Prefixed varname cannot be equal to "this" due to underscore between prefix and name */
2187+
ZEND_ASSERT(!zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS)));
2188+
2189+
if (Z_ISREF_P(entry)) {
2190+
Z_ADDREF_P(entry);
21972191
} else {
2198-
if (Z_ISREF_P(entry)) {
2199-
Z_ADDREF_P(entry);
2200-
} else {
2201-
ZVAL_MAKE_REF_EX(entry, 2);
2202-
}
2203-
if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) {
2204-
if (Z_TYPE_P(orig_var) == IS_INDIRECT) {
2205-
orig_var = Z_INDIRECT_P(orig_var);
2206-
}
2207-
zval_ptr_dtor(orig_var);
2208-
ZVAL_REF(orig_var, Z_REF_P(entry));
2209-
} else {
2210-
zend_hash_add_new(symbol_table, Z_STR(final_name), entry);
2192+
ZVAL_MAKE_REF_EX(entry, 2);
2193+
}
2194+
if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) {
2195+
if (Z_TYPE_P(orig_var) == IS_INDIRECT) {
2196+
orig_var = Z_INDIRECT_P(orig_var);
22112197
}
2212-
count++;
2198+
zval_ptr_dtor(orig_var);
2199+
ZVAL_REF(orig_var, Z_REF_P(entry));
2200+
} else {
2201+
zend_hash_add_new(symbol_table, Z_STR(final_name), entry);
22132202
}
2203+
count++;
22142204
}
22152205
zval_ptr_dtor_str(&final_name);
22162206
} ZEND_HASH_FOREACH_END();
@@ -2238,26 +2228,24 @@ static zend_long php_extract_prefix_all(zend_array *arr, zend_array *symbol_tabl
22382228
zend_string_release_ex(str, 0);
22392229
}
22402230
if (php_valid_var_name(Z_STR(final_name))) {
2241-
if (zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS))) {
2242-
zend_throw_error(NULL, "Cannot re-assign $this");
2243-
return -1;
2244-
} else {
2245-
ZVAL_DEREF(entry);
2246-
if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) {
2247-
if (Z_TYPE_P(orig_var) == IS_INDIRECT) {
2248-
orig_var = Z_INDIRECT_P(orig_var);
2249-
}
2250-
ZEND_TRY_ASSIGN_COPY_EX(orig_var, entry, 0);
2251-
if (UNEXPECTED(EG(exception))) {
2252-
zend_string_release_ex(Z_STR(final_name), 0);
2253-
return -1;
2254-
}
2255-
} else {
2256-
Z_TRY_ADDREF_P(entry);
2257-
zend_hash_add_new(symbol_table, Z_STR(final_name), entry);
2231+
/* Prefixed varname cannot be equal to "this" due to underscore between prefix and name */
2232+
ZEND_ASSERT(!zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS)));
2233+
2234+
ZVAL_DEREF(entry);
2235+
if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) {
2236+
if (Z_TYPE_P(orig_var) == IS_INDIRECT) {
2237+
orig_var = Z_INDIRECT_P(orig_var);
22582238
}
2259-
count++;
2239+
ZEND_TRY_ASSIGN_COPY_EX(orig_var, entry, 0);
2240+
if (UNEXPECTED(EG(exception))) {
2241+
zend_string_release_ex(Z_STR(final_name), 0);
2242+
return -1;
2243+
}
2244+
} else {
2245+
Z_TRY_ADDREF_P(entry);
2246+
zend_hash_add_new(symbol_table, Z_STR(final_name), entry);
22602247
}
2248+
count++;
22612249
}
22622250
zval_ptr_dtor_str(&final_name);
22632251
} ZEND_HASH_FOREACH_END();
@@ -2294,26 +2282,25 @@ static zend_long php_extract_ref_prefix_invalid(zend_array *arr, zend_array *sym
22942282
continue;
22952283
}
22962284
}
2297-
if (zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS))) {
2298-
zend_throw_error(NULL, "Cannot re-assign $this");
2299-
return -1;
2285+
2286+
/* We previously checked if the var name is "this" to prefix it */
2287+
ZEND_ASSERT(!zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS)));
2288+
if (Z_ISREF_P(entry)) {
2289+
Z_ADDREF_P(entry);
23002290
} else {
2301-
if (Z_ISREF_P(entry)) {
2302-
Z_ADDREF_P(entry);
2303-
} else {
2304-
ZVAL_MAKE_REF_EX(entry, 2);
2305-
}
2306-
if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) {
2307-
if (Z_TYPE_P(orig_var) == IS_INDIRECT) {
2308-
orig_var = Z_INDIRECT_P(orig_var);
2309-
}
2310-
zval_ptr_dtor(orig_var);
2311-
ZVAL_REF(orig_var, Z_REF_P(entry));
2312-
} else {
2313-
zend_hash_add_new(symbol_table, Z_STR(final_name), entry);
2291+
ZVAL_MAKE_REF_EX(entry, 2);
2292+
}
2293+
if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) {
2294+
if (Z_TYPE_P(orig_var) == IS_INDIRECT) {
2295+
orig_var = Z_INDIRECT_P(orig_var);
23142296
}
2315-
count++;
2297+
zval_ptr_dtor(orig_var);
2298+
ZVAL_REF(orig_var, Z_REF_P(entry));
2299+
} else {
2300+
zend_hash_add_new(symbol_table, Z_STR(final_name), entry);
23162301
}
2302+
count++;
2303+
23172304
zval_ptr_dtor_str(&final_name);
23182305
} ZEND_HASH_FOREACH_END();
23192306

@@ -2349,26 +2336,26 @@ static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_
23492336
continue;
23502337
}
23512338
}
2352-
if (zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS))) {
2353-
zend_throw_error(NULL, "Cannot re-assign $this");
2354-
return -1;
2355-
} else {
2356-
ZVAL_DEREF(entry);
2357-
if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) {
2358-
if (Z_TYPE_P(orig_var) == IS_INDIRECT) {
2359-
orig_var = Z_INDIRECT_P(orig_var);
2360-
}
2361-
ZEND_TRY_ASSIGN_COPY_EX(orig_var, entry, 0);
2362-
if (UNEXPECTED(EG(exception))) {
2363-
zend_string_release_ex(Z_STR(final_name), 0);
2364-
return -1;
2365-
}
2366-
} else {
2367-
Z_TRY_ADDREF_P(entry);
2368-
zend_hash_add_new(symbol_table, Z_STR(final_name), entry);
2339+
2340+
/* We previously checked if the var name is "this" to prefix it */
2341+
ZEND_ASSERT(!zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS)));
2342+
2343+
ZVAL_DEREF(entry);
2344+
if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) {
2345+
if (Z_TYPE_P(orig_var) == IS_INDIRECT) {
2346+
orig_var = Z_INDIRECT_P(orig_var);
23692347
}
2370-
count++;
2348+
ZEND_TRY_ASSIGN_COPY_EX(orig_var, entry, 0);
2349+
if (UNEXPECTED(EG(exception))) {
2350+
zend_string_release_ex(Z_STR(final_name), 0);
2351+
return -1;
2352+
}
2353+
} else {
2354+
Z_TRY_ADDREF_P(entry);
2355+
zend_hash_add_new(symbol_table, Z_STR(final_name), entry);
23712356
}
2357+
count++;
2358+
23722359
zval_ptr_dtor_str(&final_name);
23732360
} ZEND_HASH_FOREACH_END();
23742361

0 commit comments

Comments
 (0)