]> granicus.if.org Git - php/commitdiff
Possible fix for bug #77287
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 2 Jan 2019 12:58:44 +0000 (13:58 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 2 Jan 2019 13:12:58 +0000 (14:12 +0100)
The cache size could be off by 4, if we're on a 32-bit system and
the slot had to be bumped for alignment reasons.

I wasn't able to reproduce the issue reported in bug #77287, but I
think this might be the cause.

ext/opcache/Optimizer/compact_literals.c

index 4f71e5635ef254b25c05cd0c37b9839ebc3e06ff..10bdf540118e5459a6aaed8693c6c4070115ba15 100644 (file)
@@ -805,9 +805,9 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
                                        zval *val = &op_array->literals[opline->op2.constant];
 
                                        if (Z_TYPE_P(val) == IS_CONSTANT_AST) {
-                                               uint32_t slot = ZEND_MM_ALIGNED_SIZE_EX(op_array->cache_size, 8);
-
-                                               Z_CACHE_SLOT_P(val) = slot;
+                                               /* Ensure zval is aligned to 8 bytes */
+                                               op_array->cache_size = ZEND_MM_ALIGNED_SIZE_EX(op_array->cache_size, 8);
+                                               Z_CACHE_SLOT_P(val) = op_array->cache_size;
                                                op_array->cache_size += sizeof(zval);
                                        }
                                } else if (opline->opcode != ZEND_RECV) {