Skip to content

Commit a7b265c

Browse files
committed
Merge branch 'PHP-8.5'
* PHP-8.5: Fix GH-23644: crash on a constant-vs-constant empty array comparison
2 parents f61da2a + 7c94b35 commit a7b265c

3 files changed

Lines changed: 36 additions & 2 deletions

File tree

Zend/zend_vm_def.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10291,7 +10291,7 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_NOT_EQUAL|ZEND_IS_NOT_IDENTICAL, (op1_info
1029110291
ZEND_VM_SMART_BRANCH(result, 0);
1029210292
}
1029310293

10294-
ZEND_VM_TYPE_SPEC_HANDLER(ZEND_IS_IDENTICAL, op->op2_type == IS_CONST && (Z_TYPE_P(RT_CONSTANT(op, op->op2)) == IS_ARRAY && zend_hash_num_elements(Z_ARR_P(RT_CONSTANT(op, op->op2))) == 0), ZEND_IS_IDENTICAL_EMPTY_ARRAY, TMPVARCV, CONST, SPEC(SMART_BRANCH,COMMUTATIVE))
10294+
ZEND_VM_TYPE_SPEC_HANDLER(ZEND_IS_IDENTICAL, op->op2_type == IS_CONST && (Z_TYPE_P(RT_CONSTANT(op, op->op2)) == IS_ARRAY && zend_hash_num_elements(Z_ARR_P(RT_CONSTANT(op, op->op2))) == 0), ZEND_IS_IDENTICAL_EMPTY_ARRAY, TMPVARCV, CONST, SPEC(SMART_BRANCH,NO_CONST_CONST,COMMUTATIVE))
1029510295
{
1029610296
USE_OPLINE
1029710297
zval *op1;
@@ -10304,7 +10304,7 @@ ZEND_VM_TYPE_SPEC_HANDLER(ZEND_IS_IDENTICAL, op->op2_type == IS_CONST && (Z_TYPE
1030410304
ZEND_VM_SMART_BRANCH(result, 0);
1030510305
}
1030610306

10307-
ZEND_VM_TYPE_SPEC_HANDLER(ZEND_IS_NOT_IDENTICAL, op->op2_type == IS_CONST && (Z_TYPE_P(RT_CONSTANT(op, op->op2)) == IS_ARRAY && zend_hash_num_elements(Z_ARR_P(RT_CONSTANT(op, op->op2))) == 0), ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY, TMPVARCV, CONST, SPEC(SMART_BRANCH,COMMUTATIVE))
10307+
ZEND_VM_TYPE_SPEC_HANDLER(ZEND_IS_NOT_IDENTICAL, op->op2_type == IS_CONST && (Z_TYPE_P(RT_CONSTANT(op, op->op2)) == IS_ARRAY && zend_hash_num_elements(Z_ARR_P(RT_CONSTANT(op, op->op2))) == 0), ZEND_IS_NOT_IDENTICAL_EMPTY_ARRAY, TMPVARCV, CONST, SPEC(SMART_BRANCH,NO_CONST_CONST,COMMUTATIVE))
1030810308
{
1030910309
USE_OPLINE
1031010310
zval *op1;

Zend/zend_vm_execute.h

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/opcache/tests/opt/gh23644.phpt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
--TEST--
2+
GH-23644 (Crash on a constant-vs-constant empty array comparison)
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.optimization_level=-1
7+
--EXTENSIONS--
8+
opcache
9+
--CREDITS--
10+
LTSCommerce
11+
--FILE--
12+
<?php
13+
function f($x) {
14+
if (null !== $x || [] !== $x) { return 1; }
15+
return 2;
16+
}
17+
18+
function g($x) {
19+
if ($x === null) { return $x === [] ? 'eq' : 'ne'; }
20+
return 'other';
21+
}
22+
23+
var_dump(f(null));
24+
var_dump(g(null));
25+
?>
26+
--EXPECT--
27+
int(1)
28+
string(2) "ne"

0 commit comments

Comments
 (0)