]> granicus.if.org Git - php/commitdiff
Fix relative constant addressing in file cache
authorNikita Popov <nikita.ppv@gmail.com>
Sun, 10 Dec 2017 21:33:47 +0000 (22:33 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Sun, 10 Dec 2017 21:34:50 +0000 (22:34 +0100)
PASS_TWO_UNDO_CONSTANT was using the serialized op_array->literals
pointer, resulting in incorrect offsets.

ext/opcache/zend_file_cache.c

index 2e5f3afdd2c74b733dd4a99181d0b7e5e0249af3..33c8da0d0c7862463a6453a3569482d3b63a21b8 100644 (file)
@@ -392,6 +392,11 @@ static void zend_file_cache_serialize_op_array(zend_op_array            *op_arra
        if (!IS_SERIALIZED(op_array->opcodes)) {
                zend_op *opline, *end;
 
+#if !ZEND_USE_ABS_CONST_ADDR
+               zval *literals = op_array->literals;
+               UNSERIALIZE_PTR(literals);
+#endif
+
                SERIALIZE_PTR(op_array->opcodes);
                opline = op_array->opcodes;
                UNSERIALIZE_PTR(opline);
@@ -406,10 +411,10 @@ static void zend_file_cache_serialize_op_array(zend_op_array            *op_arra
                        }
 #else
                        if (opline->op1_type == IS_CONST) {
-                               ZEND_PASS_TWO_UNDO_CONSTANT(op_array, opline, opline->op1);
+                               opline->op1.constant = RT_CONSTANT(opline, opline->op1) - literals;
                        }
                        if (opline->op2_type == IS_CONST) {
-                               ZEND_PASS_TWO_UNDO_CONSTANT(op_array, opline, opline->op2);
+                               opline->op2.constant = RT_CONSTANT(opline, opline->op2) - literals;
                        }
 #endif
 #if ZEND_USE_ABS_JMP_ADDR