From: Xinchen Hui Date: Fri, 27 Nov 2015 15:30:37 +0000 (-0800) Subject: Fixed bug #70977, #70973 (Segmentation fault with opcache.huge_code_pages=1) X-Git-Tag: php-7.0.1RC1~38 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e9a8d7ff1d59cbcaf4b5cec728a94fb0d54dd993;p=php Fixed bug #70977, #70973 (Segmentation fault with opcache.huge_code_pages=1) --- diff --git a/NEWS b/NEWS index 227ccdffd6..7d7daaea55 100644 --- a/NEWS +++ b/NEWS @@ -29,6 +29,10 @@ PHP NEWS . Fixed LOB implementation size_t/zend_long mismatch reported by gcov. (Senthil) +- Opcache: + . Fixed bug #70977 (Segmentation fault with opcache.huge_code_pages=1). + (Laruence) + - Phpdbg: . Fixed stderr being written to stdout. (Bob) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index e23e7515b8..15d6734e82 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -2515,6 +2515,9 @@ static int accel_remap_huge_pages(void *start, size_t size, const char *name, si MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (mem == MAP_FAILED) { + zend_error(E_WARNING, + ACCELERATOR_PRODUCT_NAME " huge_code_pages: mmap failed: %s (%d)", + strerror(errno), errno); return -1; } memcpy(mem, start, size); @@ -2525,20 +2528,36 @@ static int accel_remap_huge_pages(void *start, size_t size, const char *name, si MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED | MAP_HUGETLB, -1, 0); # endif -# ifdef MADV_HUGEPAGE if (ret == MAP_FAILED) { ret = mmap(start, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); + /* this should never happen? */ + ZEND_ASSERT(ret != MAP_FAILED); +# ifdef MADV_HUGEPAGE if (-1 == madvise(start, size, MADV_HUGEPAGE)) { + memcpy(start, mem, size); + mprotect(start, size, PROT_READ | PROT_EXEC); munmap(mem, size); + zend_error(E_WARNING, + ACCELERATOR_PRODUCT_NAME " huge_code_pages: madvise(HUGEPAGE) failed: %s (%d)", + strerror(errno), errno); return -1; } - } +# else + memcpy(start, mem, size); + mprotect(start, size, PROT_READ | PROT_EXEC); + munmap(mem, size); + zend_error(E_WARNING, + ACCELERATOR_PRODUCT_NAME "huge_code_pages: mmap(HUGETLB) failed: %s (%d)", + strerror(errno), errno); + return -1; # endif + } + if (ret == start) { - memcpy(start, mem, size); + memcpy(start, mem, size); mprotect(start, size, PROT_READ | PROT_EXEC); } munmap(mem, size);