stas Mon Apr 25 08:16:43 2005 EDT
Added files: (Branch: PHP_5_0)
/php-src/ext/gmp/tests bug32773.phpt
Modified files:
/php-src/ext/gmp gmp.c
Log:
@- Fix #32773 and make right fix for GMP FPEs (Stas)
Fix #32773 and make right fix for GMP FPEs
http://cvs.php.net/diff.php/php-src/ext/gmp/gmp.c?r1=1.46.2.1&r2=1.46.2.2&ty=u
Index: php-src/ext/gmp/gmp.c
diff -u php-src/ext/gmp/gmp.c:1.46.2.1 php-src/ext/gmp/gmp.c:1.46.2.2
--- php-src/ext/gmp/gmp.c:1.46.2.1 Tue Mar 1 08:13:07 2005
+++ php-src/ext/gmp/gmp.c Mon Apr 25 08:16:43 2005
@@ -282,8 +282,8 @@
typedef unsigned long (*gmp_binary_ui_op2_t)(mpz_ptr, mpz_ptr, mpz_srcptr,
unsigned long);
/* }}} */
-#define gmp_zval_binary_ui_op(r, a, b, o, u) gmp_zval_binary_ui_op_ex(r, a, b,
o, u, 0 TSRMLS_CC)
-#define gmp_zval_binary_ui_op2(r, a, b, o, u) gmp_zval_binary_ui_op2_ex(r, a,
b, o, u, 0 TSRMLS_CC)
+#define gmp_zval_binary_ui_op(r, a, b, o, u) gmp_zval_binary_ui_op_ex(r, a, b,
o, u, 0, 0 TSRMLS_CC)
+#define gmp_zval_binary_ui_op2(r, a, b, o, u) gmp_zval_binary_ui_op2_ex(r, a,
b, o, u, 0, 0 TSRMLS_CC)
#define gmp_binary_ui_op(op, uop)
_gmp_binary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op, uop)
#define gmp_binary_op(op)
_gmp_binary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op, NULL)
@@ -298,7 +298,7 @@
Execute GMP binary operation.
May return GMP resource or long if operation allows this
*/
-static inline void gmp_zval_binary_ui_op_ex(zval *return_value, zval **a_arg,
zval **b_arg, gmp_binary_op_t gmp_op, gmp_binary_ui_op_t gmp_ui_op, int
allow_ui_return TSRMLS_DC)
+static inline void gmp_zval_binary_ui_op_ex(zval *return_value, zval **a_arg,
zval **b_arg, gmp_binary_op_t gmp_op, gmp_binary_ui_op_t gmp_ui_op, int
allow_ui_return, int check_b_zero TSRMLS_DC)
{
mpz_t *gmpnum_a, *gmpnum_b, *gmpnum_result;
unsigned long long_result = 0;
@@ -312,8 +312,18 @@
FETCH_GMP_ZVAL(gmpnum_b, b_arg);
}
- if (!Z_LVAL_PP(b_arg)) {
- RETURN_FALSE;
+ if(check_b_zero) {
+ int b_is_zero = 0;
+ if(use_ui) {
+ b_is_zero = (Z_LVAL_PP(b_arg) == 0);
+ } else {
+ b_is_zero = !mpz_cmp_ui(*gmpnum_b, 0);
+ }
+
+ if(b_is_zero) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Zero operand
not allowed");
+ RETURN_FALSE;
+ }
}
INIT_GMP_NUM(gmpnum_result);
@@ -341,7 +351,7 @@
Execute GMP binary operation which returns 2 values.
May return GMP resources or longs if operation allows this.
*/
-static inline void gmp_zval_binary_ui_op2_ex(zval *return_value, zval **a_arg,
zval **b_arg, gmp_binary_op2_t gmp_op, gmp_binary_ui_op2_t gmp_ui_op, int
allow_ui_return TSRMLS_DC)
+static inline void gmp_zval_binary_ui_op2_ex(zval *return_value, zval **a_arg,
zval **b_arg, gmp_binary_op2_t gmp_op, gmp_binary_ui_op2_t gmp_ui_op, int
allow_ui_return, int check_b_zero TSRMLS_DC)
{
mpz_t *gmpnum_a, *gmpnum_b, *gmpnum_result1, *gmpnum_result2;
zval r;
@@ -357,8 +367,18 @@
FETCH_GMP_ZVAL(gmpnum_b, b_arg);
}
- if (!Z_LVAL_PP(b_arg)) {
- RETURN_FALSE;
+ if(check_b_zero) {
+ int b_is_zero = 0;
+ if(use_ui) {
+ b_is_zero = (Z_LVAL_PP(b_arg) == 0);
+ } else {
+ b_is_zero = !mpz_cmp_ui(*gmpnum_b, 0);
+ }
+
+ if(b_is_zero) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Zero operand
not allowed");
+ RETURN_FALSE;
+ }
}
INIT_GMP_NUM(gmpnum_result1);
@@ -653,13 +673,13 @@
switch (round) {
case GMP_ROUND_ZERO:
- gmp_zval_binary_ui_op2(return_value, a_arg, b_arg, mpz_tdiv_qr,
(gmp_binary_ui_op2_t)mpz_tdiv_qr_ui);
+ gmp_zval_binary_ui_op2_ex(return_value, a_arg, b_arg,
mpz_tdiv_qr, (gmp_binary_ui_op2_t)mpz_tdiv_qr_ui, 0, 1 TSRMLS_CC);
break;
case GMP_ROUND_PLUSINF:
- gmp_zval_binary_ui_op2(return_value, a_arg, b_arg, mpz_cdiv_qr,
(gmp_binary_ui_op2_t)mpz_cdiv_qr_ui);
+ gmp_zval_binary_ui_op2_ex(return_value, a_arg, b_arg,
mpz_cdiv_qr, (gmp_binary_ui_op2_t)mpz_cdiv_qr_ui, 0, 1 TSRMLS_CC);
break;
case GMP_ROUND_MINUSINF:
- gmp_zval_binary_ui_op2(return_value, a_arg, b_arg, mpz_fdiv_qr,
(gmp_binary_ui_op2_t)mpz_fdiv_qr_ui);
+ gmp_zval_binary_ui_op2_ex(return_value, a_arg, b_arg,
mpz_fdiv_qr, (gmp_binary_ui_op2_t)mpz_fdiv_qr_ui, 0, 1 TSRMLS_CC);
break;
}
@@ -690,13 +710,13 @@
switch (round) {
case GMP_ROUND_ZERO:
- gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg,
mpz_tdiv_r, (gmp_binary_ui_op_t)mpz_tdiv_r_ui, 1 TSRMLS_CC);
+ gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg,
mpz_tdiv_r, (gmp_binary_ui_op_t)mpz_tdiv_r_ui, 1, 1 TSRMLS_CC);
break;
case GMP_ROUND_PLUSINF:
- gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg,
mpz_cdiv_r, (gmp_binary_ui_op_t)mpz_cdiv_r_ui, 1 TSRMLS_CC);
+ gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg,
mpz_cdiv_r, (gmp_binary_ui_op_t)mpz_cdiv_r_ui, 1, 1 TSRMLS_CC);
break;
case GMP_ROUND_MINUSINF:
- gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg,
mpz_fdiv_r, (gmp_binary_ui_op_t)mpz_fdiv_r_ui, 1 TSRMLS_CC);
+ gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg,
mpz_fdiv_r, (gmp_binary_ui_op_t)mpz_fdiv_r_ui, 1, 1 TSRMLS_CC);
break;
}
}
@@ -726,13 +746,13 @@
switch (round) {
case GMP_ROUND_ZERO:
- gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_tdiv_q,
(gmp_binary_ui_op_t)mpz_tdiv_q_ui);
+ gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg,
mpz_tdiv_q, (gmp_binary_ui_op_t)mpz_tdiv_q_ui, 0, 1 TSRMLS_CC);
break;
case GMP_ROUND_PLUSINF:
- gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_cdiv_q,
(gmp_binary_ui_op_t)mpz_cdiv_q_ui);
+ gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg,
mpz_cdiv_q, (gmp_binary_ui_op_t)mpz_cdiv_q_ui, 0, 1 TSRMLS_CC);
break;
case GMP_ROUND_MINUSINF:
- gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_fdiv_q,
(gmp_binary_ui_op_t)mpz_fdiv_q_ui);
+ gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg,
mpz_fdiv_q, (gmp_binary_ui_op_t)mpz_fdiv_q_ui, 0, 1 TSRMLS_CC);
break;
}
@@ -749,7 +769,7 @@
WRONG_PARAM_COUNT;
}
- gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_mod,
(gmp_binary_ui_op_t)mpz_mod_ui, 1 TSRMLS_CC);
+ gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_mod,
(gmp_binary_ui_op_t)mpz_mod_ui, 1, 1 TSRMLS_CC);
}
/* }}} */
@@ -996,7 +1016,7 @@
WRONG_PARAM_COUNT;
}
- gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_gcd,
(gmp_binary_ui_op_t)mpz_gcd_ui, 1 TSRMLS_CC);
+ gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_gcd,
(gmp_binary_ui_op_t)mpz_gcd_ui, 1, 0 TSRMLS_CC);
}
/* }}} */
http://cvs.php.net/co.php/php-src/ext/gmp/tests/bug32773.phpt?r=1.1&p=1
Index: php-src/ext/gmp/tests/bug32773.phpt
+++ php-src/ext/gmp/tests/bug32773.phpt