Commit:    dc8705c256cd1d50cfa276e8de31558e089eab92
Author:    Dmitry Stogov <dmi...@zend.com>         Wed, 25 Sep 2013 11:02:39 
+0400
Parents:   f7eff9cd41e0b996af9a0a01d3c5f8fdd8b7fa60
Branches:  PHP-5.5 master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=dc8705c256cd1d50cfa276e8de31558e089eab92

Log:
Fixed issue #135 (segfault in interned strings if initial memory is too low)

Bugs:
https://bugs.php.net/135

Changed paths:
  M  NEWS
  M  ext/opcache/ZendAccelerator.c


Diff:
diff --git a/NEWS b/NEWS
index e02d1b9..cd4d377 100644
--- a/NEWS
+++ b/NEWS
@@ -29,6 +29,8 @@ PHP                                                           
             NEWS
   . Fixed bug #65665 (Exception not properly caught when opcache enabled).
     (Laruence)
   . Fixed bug #65510 (5.5.2 crashes in _get_zval_ptr_ptr_var). (Dmitry)
+  . Fixed issue #135 (segfault in interned strings if initial memory is too
+    low). (Julien)
 
 - SPL:
   . Fix bug #64782 (SplFileObject constructor make $context optional / give it
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c
index 827f047..7fdae6f 100644
--- a/ext/opcache/ZendAccelerator.c
+++ b/ext/opcache/ZendAccelerator.c
@@ -2407,14 +2407,14 @@ static inline int accel_find_sapi(TSRMLS_D)
        return FAILURE;
 }
 
-static void zend_accel_init_shm(TSRMLS_D)
+static int zend_accel_init_shm(TSRMLS_D)
 {
        zend_shared_alloc_lock(TSRMLS_C);
 
        accel_shared_globals = 
zend_shared_alloc(sizeof(zend_accel_shared_globals));
        if (!accel_shared_globals) {
                zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared 
memory!");
-               return;
+               return FAILURE;
        }
        ZSMMG(app_shared_globals) = accel_shared_globals;
 
@@ -2429,7 +2429,8 @@ static void zend_accel_init_shm(TSRMLS_D)
        ZCSG(interned_strings).arBuckets = 
zend_shared_alloc(ZCSG(interned_strings).nTableSize * sizeof(Bucket *));
        ZCSG(interned_strings_start) = 
zend_shared_alloc((ZCG(accel_directives).interned_strings_buffer * 1024 * 
1024));
        if (!ZCSG(interned_strings).arBuckets || !ZCSG(interned_strings_start)) 
{
-               zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME " cannot allocate 
buffer for interned strings");
+               zend_accel_error(ACCEL_LOG_FATAL, ACCELERATOR_PRODUCT_NAME " 
cannot allocate buffer for interned strings");
+               return FAILURE;
        }
        ZCSG(interned_strings_end)   = ZCSG(interned_strings_start) + 
(ZCG(accel_directives).interned_strings_buffer * 1024 * 1024);
        ZCSG(interned_strings_top)   = ZCSG(interned_strings_start);
@@ -2468,6 +2469,8 @@ static void zend_accel_init_shm(TSRMLS_D)
        ZCSG(restart_in_progress) = 0;
 
        zend_shared_alloc_unlock(TSRMLS_C);
+
+       return SUCCESS;
 }
 
 static void accel_globals_ctor(zend_accel_globals *accel_globals TSRMLS_DC)
@@ -2525,7 +2528,10 @@ static int accel_startup(zend_extension *extension)
 /********************************************/
        switch 
(zend_shared_alloc_startup(ZCG(accel_directives).memory_consumption)) {
                case ALLOC_SUCCESS:
-                       zend_accel_init_shm(TSRMLS_C);
+                       if (zend_accel_init_shm(TSRMLS_C) == FAILURE) {
+                               accel_startup_ok = 0;
+                               return FAILURE;
+                       }
                        break;
                case ALLOC_FAILURE:
                        accel_startup_ok = 0;


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to