Skip to content

Commit 4ae16d3

Browse files
committed
Fixed a possible information leak because of interruption of XOR operator
1 parent 5fc060e commit 4ae16d3

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

Zend/zend_operators.c

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -965,8 +965,10 @@ ZEND_API int div_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
965965
ZEND_API int mod_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
966966
{
967967
zval op1_copy, op2_copy;
968+
long op1_lval;
968969

969970
zendi_convert_to_long(op1, op1_copy, result);
971+
op1_lval = Z_LVAL_P(op1);
970972
zendi_convert_to_long(op2, op2_copy, result);
971973

972974
if (Z_LVAL_P(op2) == 0) {
@@ -981,18 +983,20 @@ ZEND_API int mod_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
981983
return SUCCESS;
982984
}
983985

984-
ZVAL_LONG(result, Z_LVAL_P(op1) % Z_LVAL_P(op2));
986+
ZVAL_LONG(result, op1_lval % Z_LVAL_P(op2));
985987
return SUCCESS;
986988
}
987989
/* }}} */
988990

989991
ZEND_API int boolean_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
990992
{
991993
zval op1_copy, op2_copy;
994+
long op1_lval;
992995

993996
zendi_convert_to_boolean(op1, op1_copy, result);
997+
op1_lval = Z_LVAL_P(op1);
994998
zendi_convert_to_boolean(op2, op2_copy, result);
995-
ZVAL_BOOL(result, Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
999+
ZVAL_BOOL(result, op1_lval ^ Z_LVAL_P(op2));
9961000
return SUCCESS;
9971001
}
9981002
/* }}} */
@@ -1038,6 +1042,7 @@ ZEND_API int bitwise_not_function(zval *result, zval *op1 TSRMLS_DC) /* {{{ */
10381042
ZEND_API int bitwise_or_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
10391043
{
10401044
zval op1_copy, op2_copy;
1045+
long op1_lval;
10411046

10421047
if (Z_TYPE_P(op1) == IS_STRING && Z_TYPE_P(op2) == IS_STRING) {
10431048
zval *longer, *shorter;
@@ -1066,16 +1071,18 @@ ZEND_API int bitwise_or_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /
10661071
return SUCCESS;
10671072
}
10681073
zendi_convert_to_long(op1, op1_copy, result);
1074+
op1_lval = Z_LVAL_P(op1);
10691075
zendi_convert_to_long(op2, op2_copy, result);
10701076

1071-
ZVAL_LONG(result, Z_LVAL_P(op1) | Z_LVAL_P(op2));
1077+
ZVAL_LONG(result, op1_lval | Z_LVAL_P(op2));
10721078
return SUCCESS;
10731079
}
10741080
/* }}} */
10751081

10761082
ZEND_API int bitwise_and_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
10771083
{
10781084
zval op1_copy, op2_copy;
1085+
long op1_lval;
10791086

10801087
if (Z_TYPE_P(op1) == IS_STRING && Z_TYPE_P(op2) == IS_STRING) {
10811088
zval *longer, *shorter;
@@ -1106,16 +1113,18 @@ ZEND_API int bitwise_and_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
11061113

11071114

11081115
zendi_convert_to_long(op1, op1_copy, result);
1116+
op1_lval = Z_LVAL_P(op1);
11091117
zendi_convert_to_long(op2, op2_copy, result);
11101118

1111-
ZVAL_LONG(result, Z_LVAL_P(op1) & Z_LVAL_P(op2));
1119+
ZVAL_LONG(result, op1_lval & Z_LVAL_P(op2));
11121120
return SUCCESS;
11131121
}
11141122
/* }}} */
11151123

11161124
ZEND_API int bitwise_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
11171125
{
11181126
zval op1_copy, op2_copy;
1127+
long op1_lval;
11191128

11201129
if (Z_TYPE_P(op1) == IS_STRING && Z_TYPE_P(op2) == IS_STRING) {
11211130
zval *longer, *shorter;
@@ -1145,31 +1154,36 @@ ZEND_API int bitwise_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
11451154
}
11461155

11471156
zendi_convert_to_long(op1, op1_copy, result);
1157+
op1_lval = Z_LVAL_P(op1);
11481158
zendi_convert_to_long(op2, op2_copy, result);
11491159

1150-
ZVAL_LONG(result, Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
1160+
ZVAL_LONG(result, op1_lval ^ Z_LVAL_P(op2));
11511161
return SUCCESS;
11521162
}
11531163
/* }}} */
11541164

11551165
ZEND_API int shift_left_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
11561166
{
11571167
zval op1_copy, op2_copy;
1168+
long op1_lval;
11581169

11591170
zendi_convert_to_long(op1, op1_copy, result);
1171+
op1_lval = Z_LVAL_P(op1);
11601172
zendi_convert_to_long(op2, op2_copy, result);
1161-
ZVAL_LONG(result, Z_LVAL_P(op1) << Z_LVAL_P(op2));
1173+
ZVAL_LONG(result, op1_lval << Z_LVAL_P(op2));
11621174
return SUCCESS;
11631175
}
11641176
/* }}} */
11651177

11661178
ZEND_API int shift_right_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
11671179
{
11681180
zval op1_copy, op2_copy;
1181+
long op1_lval;
11691182

11701183
zendi_convert_to_long(op1, op1_copy, result);
1184+
op1_lval = Z_LVAL_P(op1);
11711185
zendi_convert_to_long(op2, op2_copy, result);
1172-
ZVAL_LONG(result, Z_LVAL_P(op1) >> Z_LVAL_P(op2));
1186+
ZVAL_LONG(result, op1_lval >> Z_LVAL_P(op2));
11731187
return SUCCESS;
11741188
}
11751189
/* }}} */

0 commit comments

Comments
 (0)