Browse Source

Fixed shared memory corruption of opcode caches

experimental/first_unicode_implementation
Dmitry Stogov 19 years ago
parent
commit
d5e54a7f27
  1. 23
      Zend/zend_execute_API.c
  2. 3
      Zend/zend_vm_def.h
  3. 3
      Zend/zend_vm_execute.h

23
Zend/zend_execute_API.c

@ -487,6 +487,19 @@ ZEND_API int zend_is_true(zval *op) /* {{{ */
#define Z_REAL_TYPE_P(p) (Z_TYPE_P(p) & ~IS_VISITED_CONSTANT)
#define MARK_CONSTANT_VISITED(p) Z_TYPE_P(p) |= IS_VISITED_CONSTANT
static void zval_deep_copy(zval **p)
{
zval *value;
ALLOC_ZVAL(value);
*value = **p;
Z_TYPE_P(value) &= ~IS_CONSTANT_INDEX;
zval_copy_ctor(value);
Z_TYPE_P(value) = Z_TYPE_PP(p);
INIT_PZVAL(value);
*p = value;
}
ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *scope TSRMLS_DC) /* {{{ */
{
zval *p = *pp;
@ -568,6 +581,16 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *sco
p = *pp;
Z_TYPE_P(p) = IS_ARRAY;
if (!inline_change) {
zval *tmp;
HashTable *tmp_ht = NULL;
ALLOC_HASHTABLE(tmp_ht);
zend_hash_init(tmp_ht, zend_hash_num_elements(Z_ARRVAL_P(p)), NULL, ZVAL_PTR_DTOR, 0);
zend_hash_copy(tmp_ht, Z_ARRVAL_P(p), (copy_ctor_func_t) zval_deep_copy, (void *) &tmp, sizeof(zval *));
Z_ARRVAL_P(p) = tmp_ht;
}
/* First go over the array and see if there are any constant indices */
zend_hash_internal_pointer_reset(Z_ARRVAL_P(p));
while (zend_hash_get_current_data(Z_ARRVAL_P(p), (void **) &element) == SUCCESS) {

3
Zend/zend_vm_def.h

@ -2644,9 +2644,6 @@ ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST)
ALLOC_ZVAL(default_value);
*default_value = opline->op2.u.constant;
if (Z_TYPE(opline->op2.u.constant)==IS_CONSTANT_ARRAY) {
zval_copy_ctor(default_value);
}
Z_SET_REFCOUNT_P(default_value, 1);
zval_update_constant(&default_value, 0 TSRMLS_CC);
Z_SET_REFCOUNT_P(default_value, 0);

3
Zend/zend_vm_execute.h

@ -736,9 +736,6 @@ static int ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
ALLOC_ZVAL(default_value);
*default_value = opline->op2.u.constant;
if (Z_TYPE(opline->op2.u.constant)==IS_CONSTANT_ARRAY) {
zval_copy_ctor(default_value);
}
Z_SET_REFCOUNT_P(default_value, 1);
zval_update_constant(&default_value, 0 TSRMLS_CC);
Z_SET_REFCOUNT_P(default_value, 0);

Loading…
Cancel
Save