stas            Mon Apr 25 08:18:50 2005 EDT

  Modified files:              
    /php-src/ext/gmp    gmp.c 
    /php-src/ext/gmp/tests      bug32773.phpt 
  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.47&r2=1.48&ty=u
Index: php-src/ext/gmp/gmp.c
diff -u php-src/ext/gmp/gmp.c:1.47 php-src/ext/gmp/gmp.c:1.48
--- php-src/ext/gmp/gmp.c:1.47  Tue Mar  1 08:09:33 2005
+++ php-src/ext/gmp/gmp.c       Mon Apr 25 08:18:49 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/diff.php/php-src/ext/gmp/tests/bug32773.phpt?r1=1.1&r2=1.2&ty=u
Index: php-src/ext/gmp/tests/bug32773.phpt
diff -u /dev/null php-src/ext/gmp/tests/bug32773.phpt:1.2
--- /dev/null   Mon Apr 25 08:18:50 2005
+++ php-src/ext/gmp/tests/bug32773.phpt Mon Apr 25 08:18:50 2005
@@ -0,0 +1,24 @@
+--TEST--
+Bug #32773 binary GMP functions returns unexpected value, when second 
parameter is int(0)
+--SKIPIF--
+<?php if (!extension_loaded("gmp")) print "skip"; ?>
+--POST--
+--GET--
+--FILE--
+<?
+echo '10 + 0 = ', gmp_strval(gmp_add(10, 0)), "\n";
+echo '10 + "0" = ', gmp_strval(gmp_add(10, '0')), "\n";
+                                                                               
                               
+echo gmp_strval(gmp_div(10, 0))."\n";
+echo gmp_strval(gmp_div_qr(10, 0))."\n";
+                                                                               
                               
+?>
+--EXPECTF--
+10 + 0 = 10
+10 + "0" = 10
+
+Warning: gmp_div(): Zero operand not allowed in %s on line %d
+0
+
+Warning: gmp_div_qr(): Zero operand not allowed in %s on line %d
+0

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to