1
0
mirror of https://github.com/php/php-src.git synced 2026-04-10 17:43:13 +02:00

Merge branch 'PHP-5.6'

* PHP-5.6:
  Fixed bug #66461 (PHP crashes if opcache.interned_strings_buffer=0)
This commit is contained in:
Dmitry Stogov
2014-01-13 18:07:26 +04:00
2 changed files with 45 additions and 23 deletions

View File

@@ -2141,7 +2141,9 @@ static void accel_activate(void)
}
#if (ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO) && !defined(ZTS)
accel_interned_strings_restore_state(TSRMLS_C);
if (ZCG(accel_directives).interned_strings_buffer) {
accel_interned_strings_restore_state(TSRMLS_C);
}
#endif
zend_shared_alloc_restore_state();
@@ -2459,36 +2461,39 @@ static int zend_accel_init_shm(TSRMLS_D)
#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
ZCSG(interned_strings_start) = ZCSG(interned_strings_end) = NULL;
# ifndef ZTS
zend_hash_init(&ZCSG(interned_strings), (ZCG(accel_directives).interned_strings_buffer * 1024 * 1024) / (sizeof(Bucket) + sizeof(Bucket*) + 8 /* average string length */), NULL, NULL, 1);
ZCSG(interned_strings).nTableMask = ZCSG(interned_strings).nTableSize - 1;
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_accel_error(ACCEL_LOG_FATAL, ACCELERATOR_PRODUCT_NAME " cannot allocate buffer for interned strings");
return FAILURE;
if (ZCG(accel_directives).interned_strings_buffer) {
ZCSG(interned_strings).nTableMask = ZCSG(interned_strings).nTableSize - 1;
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_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);
orig_interned_strings_start = CG(interned_strings_start);
orig_interned_strings_end = CG(interned_strings_end);
CG(interned_strings_start) = ZCSG(interned_strings_start);
CG(interned_strings_end) = ZCSG(interned_strings_end);
}
ZCSG(interned_strings_end) = ZCSG(interned_strings_start) + (ZCG(accel_directives).interned_strings_buffer * 1024 * 1024);
ZCSG(interned_strings_top) = ZCSG(interned_strings_start);
# else
ZCSG(interned_strings_start) = ZCSG(interned_strings_end) = NULL;
# endif
orig_interned_strings_start = CG(interned_strings_start);
orig_interned_strings_end = CG(interned_strings_end);
orig_new_interned_string = zend_new_interned_string;
orig_interned_strings_snapshot = zend_interned_strings_snapshot;
orig_interned_strings_restore = zend_interned_strings_restore;
CG(interned_strings_start) = ZCSG(interned_strings_start);
CG(interned_strings_end) = ZCSG(interned_strings_end);
zend_new_interned_string = accel_new_interned_string_for_php;
zend_interned_strings_snapshot = accel_interned_strings_snapshot_for_php;
zend_interned_strings_restore = accel_interned_strings_restore_for_php;
# ifndef ZTS
accel_use_shm_interned_strings(TSRMLS_C);
accel_interned_strings_save_state(TSRMLS_C);
if (ZCG(accel_directives).interned_strings_buffer) {
accel_use_shm_interned_strings(TSRMLS_C);
accel_interned_strings_save_state(TSRMLS_C);
}
# endif
#endif
@@ -2726,13 +2731,15 @@ void accel_shutdown(TSRMLS_D)
}
#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
if (ZCG(accel_directives).interned_strings_buffer) {
# ifndef ZTS
zend_hash_clean(CG(function_table));
zend_hash_clean(CG(class_table));
zend_hash_clean(EG(zend_constants));
zend_hash_clean(CG(function_table));
zend_hash_clean(CG(class_table));
zend_hash_clean(EG(zend_constants));
# endif
CG(interned_strings_start) = orig_interned_strings_start;
CG(interned_strings_end) = orig_interned_strings_end;
CG(interned_strings_start) = orig_interned_strings_start;
CG(interned_strings_end) = orig_interned_strings_end;
}
zend_new_interned_string = orig_new_interned_string;
zend_interned_strings_snapshot = orig_interned_strings_snapshot;
zend_interned_strings_restore = orig_interned_strings_restore;

View File

@@ -0,0 +1,15 @@
--TEST--
Bug #66461 (PHP crashes if opcache.interned_strings_buffer=0)
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.optimization_level=-1
opcache.file_update_protection=0
opcache.interned_strings_buffer=0
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
echo "ok\n";
--EXPECT--
ok