]> granicus.if.org Git - php/commitdiff
Fixed bug #70977, #70973 (Segmentation fault with opcache.huge_code_pages=1)
authorXinchen Hui <laruence@gmail.com>
Fri, 27 Nov 2015 15:30:37 +0000 (07:30 -0800)
committerXinchen Hui <laruence@gmail.com>
Fri, 27 Nov 2015 15:30:37 +0000 (07:30 -0800)
NEWS
ext/opcache/ZendAccelerator.c

diff --git a/NEWS b/NEWS
index 227ccdffd6d83faaac274cc8c3711aaea0f01cae..7d7daaea55b0e80908ad445784f285514df1be3c 100644 (file)
--- 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)
 
index e23e7515b8fee63501aa20dbeb7e361b70dc2201..15d6734e8277476f23d15422ad11421aad9787f0 100644 (file)
@@ -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);