Skip to content

Commit 332bd03

Browse files
authored
Do not optimize out ini_get() when the entry does not exist during compilation (#8507)
The entry may exist later if dl is enabled Fixes GH-8466
1 parent d8f7797 commit 332bd03

File tree

5 files changed

+33
-9
lines changed

5 files changed

+33
-9
lines changed

Zend/Optimizer/sccp.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
+----------------------------------------------------------------------+
1818
*/
1919

20+
#include "php.h"
2021
#include "zend_API.h"
2122
#include "zend_exceptions.h"
2223
#include "zend_ini.h"
@@ -908,6 +909,9 @@ static inline int ct_eval_func_call(
908909

909910
ini_entry = zend_hash_find_ptr(EG(ini_directives), Z_STR_P(args[0]));
910911
if (!ini_entry) {
912+
if (PG(enable_dl)) {
913+
return FAILURE;
914+
}
911915
ZVAL_FALSE(result);
912916
} else if (ini_entry->modifiable != ZEND_INI_SYSTEM) {
913917
return FAILURE;

ext/opcache/tests/gh8466.phpt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--TEST--
2+
Bug GH-8466: ini_get() is optimized out when the option does not exist during compilation
3+
--SKIPIF--
4+
<?php include dirname(__DIR__, 2) . "/dl_test/tests/skip.inc"; ?>
5+
--FILE--
6+
<?php
7+
8+
if (extension_loaded('dl_test')) {
9+
exit('Error: dl_test is already loaded');
10+
}
11+
12+
if (PHP_OS_FAMILY === 'Windows') {
13+
$loaded = dl('php_dl_test.dll');
14+
} else {
15+
$loaded = dl('dl_test.so');
16+
}
17+
18+
var_dump($loaded);
19+
20+
var_dump(ini_get('dl_test.long'));
21+
--EXPECT--
22+
bool(true)
23+
string(1) "0"

ext/standard/tests/general_functions/dl-001.phpt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@ var_dump($loaded);
2020
dl_test_test1();
2121
var_dump(dl_test_test2("World!"));
2222

23-
// ini_get() gets optimized out, so we use ini_get_all() here
24-
var_dump(ini_get_all()["dl_test.long"]["local_value"]);
25-
var_dump(ini_get_all()["dl_test.string"]["local_value"]);
23+
var_dump(ini_get("dl_test.long"));
24+
var_dump(ini_get("dl_test.string"));
2625

2726
echo "OK\n";
2827
--EXPECT--

ext/standard/tests/general_functions/dl-002.phpt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,8 @@ var_dump($loaded);
2121
dl_test_test1();
2222
var_dump(dl_test_test2("World!"));
2323

24-
// ini_get() gets optimized out, so we use ini_get_all() here
25-
var_dump(ini_get_all()["dl_test.long"]["local_value"]);
26-
var_dump(ini_get_all()["dl_test.string"]["local_value"]);
24+
var_dump(ini_get("dl_test.long"));
25+
var_dump(ini_get("dl_test.string"));
2726

2827
echo "OK\n";
2928
--EXPECT--

ext/standard/tests/general_functions/dl-003.phpt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,8 @@ var_dump(dl_test_test2("World!"));
2222
ini_set("dl_test.long", "1");
2323
ini_set("dl_test.string", "world");
2424

25-
// ini_get() gets optimized out, so we use ini_get_all() here
26-
var_dump(ini_get_all()["dl_test.long"]["local_value"]);
27-
var_dump(ini_get_all()["dl_test.string"]["local_value"]);
25+
var_dump(ini_get("dl_test.long"));
26+
var_dump(ini_get("dl_test.string"));
2827

2928
echo "OK\n";
3029
--EXPECT--

0 commit comments

Comments
 (0)