diff --git a/NEWS b/NEWS index 84ac832178a..69bc3b41dde 100644 --- a/NEWS +++ b/NEWS @@ -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) diff --git a/ext/pcre/pcre2lib/sljit/sljitExecAllocator.c b/ext/pcre/pcre2lib/sljit/sljitExecAllocator.c index 3b37a9751f8..caaf4385783 100644 --- a/ext/pcre/pcre2lib/sljit/sljitExecAllocator.c +++ b/ext/pcre/pcre2lib/sljit/sljitExecAllocator.c @@ -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; diff --git a/ext/pcre/tests/bug78272.phpt b/ext/pcre/tests/bug78272.phpt new file mode 100644 index 00000000000..576d3013a51 --- /dev/null +++ b/ext/pcre/tests/bug78272.phpt @@ -0,0 +1,33 @@ +--TEST-- +Bug #78272: calling preg_match() before pcntl_fork() will freeze child process +--SKIPIF-- + +--FILE-- + +--EXPECT-- +Main start +Child start +Array +( + [0] => abc +) +End child +End Main