Skip to content

Commit c7d3c5f

Browse files
committed
Merge branch 'PHP-8.3' into PHP-8.4
* PHP-8.3: Fix fallback paths in fast_long_{add,sub}_function
2 parents 78da288 + 7e06a81 commit c7d3c5f

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ PHP NEWS
1010
compilation). (ilutov)
1111
. Fixed bug GH-17618 (UnhandledMatchError does not take
1212
zend.exception_ignore_args=1 into account). (timwolla)
13+
. Fix fallback paths in fast_long_{add,sub}_function. (nielsdos)
1314

1415
- DOM:
1516
. Fixed bug GH-17609 (Typo in error message: Dom\NO_DEFAULT_NS instead of

Zend/zend_operators.h

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -731,11 +731,13 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL
731731
* have read the values of op1 and op2.
732732
*/
733733

734+
zend_long sum = (zend_long) ((zend_ulong) Z_LVAL_P(op1) + (zend_ulong) Z_LVAL_P(op2));
735+
734736
if (UNEXPECTED((Z_LVAL_P(op1) & LONG_SIGN_MASK) == (Z_LVAL_P(op2) & LONG_SIGN_MASK)
735-
&& (Z_LVAL_P(op1) & LONG_SIGN_MASK) != ((Z_LVAL_P(op1) + Z_LVAL_P(op2)) & LONG_SIGN_MASK))) {
737+
&& (Z_LVAL_P(op1) & LONG_SIGN_MASK) != (sum & LONG_SIGN_MASK))) {
736738
ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2));
737739
} else {
738-
ZVAL_LONG(result, Z_LVAL_P(op1) + Z_LVAL_P(op2));
740+
ZVAL_LONG(result, sum);
739741
}
740742
#endif
741743
}
@@ -813,11 +815,19 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL
813815
ZVAL_LONG(result, llresult);
814816
}
815817
#else
816-
ZVAL_LONG(result, Z_LVAL_P(op1) - Z_LVAL_P(op2));
818+
/*
819+
* 'result' may alias with op1 or op2, so we need to
820+
* ensure that 'result' is not updated until after we
821+
* have read the values of op1 and op2.
822+
*/
823+
824+
zend_long sub = (zend_long) ((zend_ulong) Z_LVAL_P(op1) - (zend_ulong) Z_LVAL_P(op2));
817825

818826
if (UNEXPECTED((Z_LVAL_P(op1) & LONG_SIGN_MASK) != (Z_LVAL_P(op2) & LONG_SIGN_MASK)
819-
&& (Z_LVAL_P(op1) & LONG_SIGN_MASK) != (Z_LVAL_P(result) & LONG_SIGN_MASK))) {
827+
&& (Z_LVAL_P(op1) & LONG_SIGN_MASK) != (sub & LONG_SIGN_MASK))) {
820828
ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) - (double) Z_LVAL_P(op2));
829+
} else {
830+
ZVAL_LONG(result, sub);
821831
}
822832
#endif
823833
}

0 commit comments

Comments
 (0)