diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-09-18 10:45:07 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-09-18 10:45:07 +0200 |
commit | db7702213c195e74e8a42dcef23eff9cadb3202e (patch) | |
tree | 588683dee40d8b42c59d9b1a2e70b344a22fc803 | |
parent | 996292a91d40c2fa9221bb9899e7a9b5cd7ebed2 (diff) | |
parent | e11ed028706dbedc51ba71736de21db15890a1c0 (diff) | |
download | php-git-db7702213c195e74e8a42dcef23eff9cadb3202e.tar.gz |
Merge branch 'PHP-7.3' into PHP-7.4
-rw-r--r-- | ext/pcre/pcre2lib/sljit/sljitExecAllocator.c | 15 | ||||
-rw-r--r-- | ext/pcre/tests/bug78272.phpt | 33 |
2 files changed, 47 insertions, 1 deletions
diff --git a/ext/pcre/pcre2lib/sljit/sljitExecAllocator.c b/ext/pcre/pcre2lib/sljit/sljitExecAllocator.c index 3b37a9751f..caaf438578 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 0000000000..576d3013a5 --- /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-- +<?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 |