Skip to content

Commit be6fb13

Browse files
committed
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3: Fix $x = (bool)$x; for undefined with opcache
2 parents 29c7c9e + e72e337 commit be6fb13

File tree

3 files changed

+58
-8
lines changed

3 files changed

+58
-8
lines changed

Zend/zend_vm_def.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1018,8 +1018,10 @@ ZEND_VM_COLD_CONST_HANDLER(14, ZEND_BOOL_NOT, CONST|TMPVAR|CV, ANY)
10181018
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
10191019
ZVAL_FALSE(EX_VAR(opline->result.var));
10201020
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
1021+
/* The result and op1 can be the same cv zval */
1022+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
10211023
ZVAL_TRUE(EX_VAR(opline->result.var));
1022-
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
1024+
if (OP1_TYPE == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
10231025
SAVE_OPLINE();
10241026
ZVAL_UNDEFINED_OP1();
10251027
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -5319,8 +5321,10 @@ ZEND_VM_COLD_CONST_HANDLER(52, ZEND_BOOL, CONST|TMPVAR|CV, ANY)
53195321
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
53205322
ZVAL_TRUE(EX_VAR(opline->result.var));
53215323
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
5324+
/* The result and op1 can be the same cv zval */
5325+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
53225326
ZVAL_FALSE(EX_VAR(opline->result.var));
5323-
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
5327+
if (OP1_TYPE == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
53245328
SAVE_OPLINE();
53255329
ZVAL_UNDEFINED_OP1();
53265330
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();

Zend/zend_vm_execute.h

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3276,8 +3276,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CON
32763276
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
32773277
ZVAL_FALSE(EX_VAR(opline->result.var));
32783278
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
3279+
/* The result and op1 can be the same cv zval */
3280+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
32793281
ZVAL_TRUE(EX_VAR(opline->result.var));
3280-
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
3282+
if (IS_CONST == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
32813283
SAVE_OPLINE();
32823284
ZVAL_UNDEFINED_OP1();
32833285
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -3851,8 +3853,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CONST_H
38513853
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
38523854
ZVAL_TRUE(EX_VAR(opline->result.var));
38533855
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
3856+
/* The result and op1 can be the same cv zval */
3857+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
38543858
ZVAL_FALSE(EX_VAR(opline->result.var));
3855-
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
3859+
if (IS_CONST == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
38563860
SAVE_OPLINE();
38573861
ZVAL_UNDEFINED_OP1();
38583862
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -13286,8 +13290,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_TMPVAR_HANDLER(Z
1328613290
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
1328713291
ZVAL_FALSE(EX_VAR(opline->result.var));
1328813292
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
13293+
/* The result and op1 can be the same cv zval */
13294+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
1328913295
ZVAL_TRUE(EX_VAR(opline->result.var));
13290-
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
13296+
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
1329113297
SAVE_OPLINE();
1329213298
ZVAL_UNDEFINED_OP1();
1329313299
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -13548,8 +13554,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_TMPVAR_HANDLER(ZEND_
1354813554
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
1354913555
ZVAL_TRUE(EX_VAR(opline->result.var));
1355013556
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
13557+
/* The result and op1 can be the same cv zval */
13558+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
1355113559
ZVAL_FALSE(EX_VAR(opline->result.var));
13552-
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
13560+
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
1355313561
SAVE_OPLINE();
1355413562
ZVAL_UNDEFINED_OP1();
1355513563
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -36479,8 +36487,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CV_HANDLER(ZEND_
3647936487
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
3648036488
ZVAL_FALSE(EX_VAR(opline->result.var));
3648136489
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
36490+
/* The result and op1 can be the same cv zval */
36491+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
3648236492
ZVAL_TRUE(EX_VAR(opline->result.var));
36483-
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
36493+
if (IS_CV == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
3648436494
SAVE_OPLINE();
3648536495
ZVAL_UNDEFINED_OP1();
3648636496
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -37362,8 +37372,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CV_HANDLER(ZEND_OPCO
3736237372
if (Z_TYPE_INFO_P(val) == IS_TRUE) {
3736337373
ZVAL_TRUE(EX_VAR(opline->result.var));
3736437374
} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
37375+
/* The result and op1 can be the same cv zval */
37376+
const uint32_t orig_val_type = Z_TYPE_INFO_P(val);
3736537377
ZVAL_FALSE(EX_VAR(opline->result.var));
37366-
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
37378+
if (IS_CV == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
3736737379
SAVE_OPLINE();
3736837380
ZVAL_UNDEFINED_OP1();
3736937381
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();

ext/opcache/tests/bool_not_cv.phpt

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
--TEST--
2+
$v = !$v/(bool)$v checks for undefined variables
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.file_cache_only=0
7+
--SKIPIF--
8+
<?php require_once('skipif.inc'); ?>
9+
--FILE--
10+
<?php
11+
function undef_negation() {
12+
echo "In undef_negation\n";
13+
$v = !$v;
14+
var_export($v);
15+
echo "\n";
16+
}
17+
function undef_bool_cast() {
18+
echo "In undef_bool_cast\n";
19+
$v = (bool)$v;
20+
var_export($v);
21+
echo "\n";
22+
}
23+
undef_negation();
24+
undef_bool_cast();
25+
?>
26+
--EXPECTF--
27+
In undef_negation
28+
29+
Notice: Undefined variable: v in %s on line 4
30+
true
31+
In undef_bool_cast
32+
33+
Notice: Undefined variable: v in %s on line 10
34+
false

0 commit comments

Comments
 (0)