Use MAP_JIT only when running under hardened runtime, because MAP_JIT
is incompatible with fork().

The check is based on
f879e35e3e.
This commit is contained in:
Nikita Popov 2019-09-18 09:44:00 +02:00
parent 03efeda538
commit e11ed02870
3 changed files with 51 additions and 1 deletions

4
NEWS
View file

@ -14,6 +14,10 @@ PHP NEWS
. Fixed bug #78525 (Memory leak in pdo when reusing native prepared
statements). (Nikita)
- PCRE:
. Fixed bug #78272 (calling preg_match() before pcntl_fork() will freeze
child process). (Nikita)
- Standard:
. Fixed bug #76342 (file_get_contents waits twice specified timeout).
(Thomas Calvet)

View file

@ -121,7 +121,20 @@ static SLJIT_INLINE int get_map_jit_flag()
uname(&name);
/* Kernel version for 10.14.0 (Mojave) */
map_jit_flag = (atoi(name.release) >= 18) ? MAP_JIT : 0;
if (atoi(name.release) >= 18) {
/* Only use MAP_JIT if a hardened runtime is used, because MAP_JIT is incompatible
with fork(). */
void *ptr = mmap(
NULL, getpagesize(), PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
if (ptr == MAP_FAILED) {
map_jit_flag = MAP_JIT;
} else {
map_jit_flag = 0;
munmap(ptr, getpagesize());
}
} else {
map_jit_flag = 0;
}
}
return map_jit_flag;

View file

@ -0,0 +1,33 @@
--TEST--
Bug #78272: calling preg_match() before pcntl_fork() will freeze child process
--SKIPIF--
<?php
if (!extension_loaded('pcntl')) die("skip pcntl extension required");
?>
--FILE--
<?php
preg_match('/abc/', 'abcde', $r);
$pid = pcntl_fork();
if ($pid === 0) {
print "Child start\n";
preg_match('/abc/', 'abcde', $r);
print_r($r);
print "End child\n";
exit(0);
} else {
print "Main start\n";
pcntl_waitpid($pid, $status);
print "End Main\n";
exit(0);
}
?>
--EXPECT--
Main start
Child start
Array
(
[0] => abc
)
End child
End Main