]> granicus.if.org Git - php/commitdiff
Fixed refcounting
authorDmitry Stogov <dmitry@zend.com>
Fri, 21 Mar 2014 11:33:08 +0000 (15:33 +0400)
committerDmitry Stogov <dmitry@zend.com>
Fri, 21 Mar 2014 11:33:08 +0000 (15:33 +0400)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 509a5b5d6a1e4457306b10c03b2ad45b3fb0c78a..963481541ba59967f26cc5f5f5cbb4213089d5af 100644 (file)
@@ -1821,7 +1821,9 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV)
                }
                ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ASSIGN);
        } else if (OP2_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
-               PZVAL_LOCK(value_ptr);
+               if (!OP2_FREE) {
+                       PZVAL_LOCK(value_ptr);
+               }
        }
        if (OP1_TYPE == IS_VAR &&
            UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
index ed6ad2a9484deab2429f075d53f477343522bdaa..46394f49c2d5414dd9d2ec9683e9e8180cc49402 100644 (file)
@@ -19794,7 +19794,9 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL
                }
                return ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
        } else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
-               PZVAL_LOCK(value_ptr);
+               if (!(free_op2.var != NULL)) {
+                       PZVAL_LOCK(value_ptr);
+               }
        }
        if (IS_VAR == IS_VAR &&
            UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
@@ -23240,7 +23242,9 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE
                }
                return ZEND_ASSIGN_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
        } else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
-               PZVAL_LOCK(value_ptr);
+               if (!0) {
+                       PZVAL_LOCK(value_ptr);
+               }
        }
        if (IS_VAR == IS_VAR &&
            UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
@@ -36829,7 +36833,9 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE
                }
                return ZEND_ASSIGN_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
        } else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
-               PZVAL_LOCK(value_ptr);
+               if (!(free_op2.var != NULL)) {
+                       PZVAL_LOCK(value_ptr);
+               }
        }
        if (IS_CV == IS_VAR &&
            UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
@@ -40015,7 +40021,9 @@ static int ZEND_FASTCALL  ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER
                }
                return ZEND_ASSIGN_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
        } else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
-               PZVAL_LOCK(value_ptr);
+               if (!0) {
+                       PZVAL_LOCK(value_ptr);
+               }
        }
        if (IS_CV == IS_VAR &&
            UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&