Skip to content

Commit bec62af

Browse files
author
Ard Biesheuvel
committed
Merge branch 'PHP-5.4' into PHP-5.5
2 parents 41cd533 + 8f1fee6 commit bec62af

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

Zend/zend_operators.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -640,13 +640,18 @@ static zend_always_inline int fast_add_function(zval *result, zval *op1, zval *o
640640
"n"(ZVAL_OFFSETOF_TYPE)
641641
: "rax","cc");
642642
#else
643-
Z_LVAL_P(result) = Z_LVAL_P(op1) + Z_LVAL_P(op2);
643+
/*
644+
* 'result' may alias with op1 or op2, so we need to
645+
* ensure that 'result' is not updated until after we
646+
* have read the values of op1 and op2.
647+
*/
644648

645649
if (UNEXPECTED((Z_LVAL_P(op1) & LONG_SIGN_MASK) == (Z_LVAL_P(op2) & LONG_SIGN_MASK)
646-
&& (Z_LVAL_P(op1) & LONG_SIGN_MASK) != (Z_LVAL_P(result) & LONG_SIGN_MASK))) {
650+
&& (Z_LVAL_P(op1) & LONG_SIGN_MASK) != ((Z_LVAL_P(op1) + Z_LVAL_P(op2)) & LONG_SIGN_MASK))) {
647651
Z_DVAL_P(result) = (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2);
648652
Z_TYPE_P(result) = IS_DOUBLE;
649653
} else {
654+
Z_LVAL_P(result) = Z_LVAL_P(op1) + Z_LVAL_P(op2);
650655
Z_TYPE_P(result) = IS_LONG;
651656
}
652657
#endif

0 commit comments

Comments
 (0)