From fd73a54c30a0851ae40a1a361ee4022236be6bcb Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Sat, 9 Sep 2017 23:57:22 +0200 Subject: [PATCH] Fixed bug #75169 (BCMath errors/warnings bypass error handling) Instead of writing warning messages to `stderr`, we employ PHP's error handling to raise `E_WARNING` even for the single case where `bc_rt_error()` has been called, since that did not actually error out. We choose to call `php_error_docref()` directly in libbcmath, since there is no upstream, and since other PHP core functionality is already used in our bundled libbcmath. Accordingly, we remove `rt.c` so it will not be accidentally used in the future. Besides adapting a few existing tests, we add new tests so that the warnings are tested at least once. We also get rid of the Windows specific tests, since the warning behavior is now supposed to be platform-agnostic. --- ext/bcmath/config.m4 | 2 +- ext/bcmath/config.w32 | 2 +- ext/bcmath/libbcmath/src/bcmath.h | 2 - ext/bcmath/libbcmath/src/raise.c | 4 +- ext/bcmath/libbcmath/src/raisemod.c | 6 +-- ext/bcmath/libbcmath/src/rt.c | 65 ---------------------------- ext/bcmath/tests/bcpow_error1.phpt | 15 +++++++ ext/bcmath/tests/bcpow_error2.phpt | 15 +++++++ ext/bcmath/tests/bug72093-win32.phpt | 18 -------- ext/bcmath/tests/bug72093.phpt | 6 +-- ext/bcmath/tests/bug75178-win32.phpt | 21 --------- ext/bcmath/tests/bug75178.phpt | 10 ++--- 12 files changed, 43 insertions(+), 123 deletions(-) delete mode 100644 ext/bcmath/libbcmath/src/rt.c create mode 100644 ext/bcmath/tests/bcpow_error1.phpt create mode 100644 ext/bcmath/tests/bcpow_error2.phpt delete mode 100644 ext/bcmath/tests/bug72093-win32.phpt delete mode 100644 ext/bcmath/tests/bug75178-win32.phpt diff --git a/ext/bcmath/config.m4 b/ext/bcmath/config.m4 index bc126454b4d..85c535d0f5f 100644 --- a/ext/bcmath/config.m4 +++ b/ext/bcmath/config.m4 @@ -7,7 +7,7 @@ PHP_ARG_ENABLE(bcmath, whether to enable bc style precision math functions, if test "$PHP_BCMATH" != "no"; then PHP_NEW_EXTENSION(bcmath, bcmath.c \ -libbcmath/src/add.c libbcmath/src/div.c libbcmath/src/init.c libbcmath/src/neg.c libbcmath/src/outofmem.c libbcmath/src/raisemod.c libbcmath/src/rt.c libbcmath/src/sub.c \ +libbcmath/src/add.c libbcmath/src/div.c libbcmath/src/init.c libbcmath/src/neg.c libbcmath/src/outofmem.c libbcmath/src/raisemod.c libbcmath/src/sub.c \ libbcmath/src/compare.c libbcmath/src/divmod.c libbcmath/src/int2num.c libbcmath/src/num2long.c libbcmath/src/output.c libbcmath/src/recmul.c \ libbcmath/src/sqrt.c libbcmath/src/zero.c libbcmath/src/debug.c libbcmath/src/doaddsub.c libbcmath/src/nearzero.c libbcmath/src/num2str.c libbcmath/src/raise.c \ libbcmath/src/rmzero.c libbcmath/src/str2num.c, diff --git a/ext/bcmath/config.w32 b/ext/bcmath/config.w32 index 3973c10cbfa..f79df604b8e 100644 --- a/ext/bcmath/config.w32 +++ b/ext/bcmath/config.w32 @@ -6,7 +6,7 @@ ARG_ENABLE("bcmath", "bc style precision math functions", "yes"); if (PHP_BCMATH == "yes") { EXTENSION("bcmath", "bcmath.c", null, "-Iext/bcmath/libbcmath/src /DZEND_ENABLE_STATIC_TSRMLS_CACHE=1"); ADD_SOURCES("ext/bcmath/libbcmath/src", "add.c div.c init.c neg.c \ - outofmem.c raisemod.c rt.c sub.c compare.c divmod.c int2num.c \ + outofmem.c raisemod.c sub.c compare.c divmod.c int2num.c \ num2long.c output.c recmul.c sqrt.c zero.c debug.c doaddsub.c \ nearzero.c num2str.c raise.c rmzero.c str2num.c", "bcmath"); diff --git a/ext/bcmath/libbcmath/src/bcmath.h b/ext/bcmath/libbcmath/src/bcmath.h index b83ba13558d..f0ab49fc528 100644 --- a/ext/bcmath/libbcmath/src/bcmath.h +++ b/ext/bcmath/libbcmath/src/bcmath.h @@ -151,8 +151,6 @@ _PROTOTYPE(void bc_out_num, (bc_num num, int o_base, void (* out_char)(int), /* Prototypes needed for external utility routines. */ -_PROTOTYPE(void bc_rt_warn, (char *mesg ,...)); -_PROTOTYPE(void bc_rt_error, (char *mesg ,...)); _PROTOTYPE(void bc_out_of_memory, (void)); #define bc_new_num(length, scale) _bc_new_num_ex((length), (scale), 0) diff --git a/ext/bcmath/libbcmath/src/raise.c b/ext/bcmath/libbcmath/src/raise.c index c625d4e5264..c7838be5975 100644 --- a/ext/bcmath/libbcmath/src/raise.c +++ b/ext/bcmath/libbcmath/src/raise.c @@ -55,10 +55,10 @@ bc_raise (bc_num num1, bc_num num2, bc_num *result, int scale) /* Check the exponent for scale digits and convert to a long. */ if (num2->n_scale != 0) - bc_rt_warn ("non-zero scale in exponent"); + php_error_docref (NULL, E_WARNING, "non-zero scale in exponent"); exponent = bc_num2long (num2); if (exponent == 0 && (num2->n_len > 1 || num2->n_value[0] != 0)) - bc_rt_error ("exponent too large in raise"); + php_error_docref (NULL, E_WARNING, "exponent too large"); /* Special case if exponent is a zero. */ if (exponent == 0) diff --git a/ext/bcmath/libbcmath/src/raisemod.c b/ext/bcmath/libbcmath/src/raisemod.c index 821dddb870e..a3154b55cd8 100644 --- a/ext/bcmath/libbcmath/src/raisemod.c +++ b/ext/bcmath/libbcmath/src/raisemod.c @@ -80,21 +80,21 @@ bc_raisemod (bc_num base, bc_num expo, bc_num mod, bc_num *result, int scale) /* Check the base for scale digits. */ if (power->n_scale != 0) { - bc_rt_warn ("non-zero scale in base"); + php_error_docref (NULL, E_WARNING, "non-zero scale in base"); _bc_truncate (&power); } /* Check the exponent for scale digits. */ if (exponent->n_scale != 0) { - bc_rt_warn ("non-zero scale in exponent"); + php_error_docref (NULL, E_WARNING, "non-zero scale in exponent"); _bc_truncate (&exponent); } /* Check the modulus for scale digits. */ if (modulus->n_scale != 0) { - bc_rt_warn ("non-zero scale in modulus"); + php_error_docref (NULL, E_WARNING, "non-zero scale in modulus"); _bc_truncate (&modulus); } diff --git a/ext/bcmath/libbcmath/src/rt.c b/ext/bcmath/libbcmath/src/rt.c deleted file mode 100644 index 5f4d46527c7..00000000000 --- a/ext/bcmath/libbcmath/src/rt.c +++ /dev/null @@ -1,65 +0,0 @@ -/* rt.c: bcmath library file. */ -/* - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - Copyright (C) 2000 Philip A. Nelson - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. (COPYING.LIB) - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to: - - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111-1307 USA. - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include "bcmath.h" -#include "private.h" - - -void bc_rt_warn (char *mesg ,...) -{ - va_list args; - char error_mesg [255]; - - va_start (args, mesg); - vsnprintf (error_mesg, sizeof(error_mesg), mesg, args); - va_end (args); - - fprintf (stderr, "bc math warning: %s\n", error_mesg); -} - - -void bc_rt_error (char *mesg ,...) -{ - va_list args; - char error_mesg [255]; - - va_start (args, mesg); - vsnprintf (error_mesg, sizeof(error_mesg), mesg, args); - va_end (args); - - fprintf (stderr, "bc math error: %s\n", error_mesg); -} diff --git a/ext/bcmath/tests/bcpow_error1.phpt b/ext/bcmath/tests/bcpow_error1.phpt new file mode 100644 index 00000000000..1075986587f --- /dev/null +++ b/ext/bcmath/tests/bcpow_error1.phpt @@ -0,0 +1,15 @@ +--TEST-- +bcpow() does not support non-integral exponents +--SKIPIF-- + +--FILE-- + +===DONE=== +--EXPECTF-- +Warning: bcpow(): non-zero scale in exponent in %s on line %d +string(1) "1" +===DONE=== diff --git a/ext/bcmath/tests/bcpow_error2.phpt b/ext/bcmath/tests/bcpow_error2.phpt new file mode 100644 index 00000000000..c58a7370878 --- /dev/null +++ b/ext/bcmath/tests/bcpow_error2.phpt @@ -0,0 +1,15 @@ +--TEST-- +bcpow() does not support exponents >= 2**63 +--SKIPIF-- + +--FILE-- + +===DONE=== +--EXPECTF-- +Warning: bcpow(): exponent too large in %s on line %d +string(1) "1" +===DONE=== diff --git a/ext/bcmath/tests/bug72093-win32.phpt b/ext/bcmath/tests/bug72093-win32.phpt deleted file mode 100644 index a9b2077823f..00000000000 --- a/ext/bcmath/tests/bug72093-win32.phpt +++ /dev/null @@ -1,18 +0,0 @@ ---TEST-- -Bug 72093: bcpowmod accepts negative scale and corrupts _one_ definition ---SKIPIF-- - ---FILE-- - ---EXPECTF-- -string(1) "1" -string(3) "0.0" -bc math warning: non-zero scale in exponent diff --git a/ext/bcmath/tests/bug72093.phpt b/ext/bcmath/tests/bug72093.phpt index 911af5698fc..3aca87a39c4 100644 --- a/ext/bcmath/tests/bug72093.phpt +++ b/ext/bcmath/tests/bug72093.phpt @@ -3,9 +3,6 @@ Bug 72093: bcpowmod accepts negative scale and corrupts _one_ definition --SKIPIF-- --FILE-- --EXPECTF-- string(1) "1" -bc math warning: non-zero scale in exponent + +Warning: bcpowmod(): non-zero scale in exponent in %s on line %d string(3) "0.0" diff --git a/ext/bcmath/tests/bug75178-win32.phpt b/ext/bcmath/tests/bug75178-win32.phpt deleted file mode 100644 index bae590fb5b3..00000000000 --- a/ext/bcmath/tests/bug75178-win32.phpt +++ /dev/null @@ -1,21 +0,0 @@ ---TEST-- -Bug #75178 (bcpowmod() misbehaves for non-integer base or modulus) ---SKIPIF-- - ---FILE-- - -===DONE=== ---EXPECT-- -string(5) "1.000" -string(5) "1.000" -===DONE=== -bc math warning: non-zero scale in base -bc math warning: non-zero scale in modulus diff --git a/ext/bcmath/tests/bug75178.phpt b/ext/bcmath/tests/bug75178.phpt index bdfa25a2e17..e7661755ad6 100644 --- a/ext/bcmath/tests/bug75178.phpt +++ b/ext/bcmath/tests/bug75178.phpt @@ -3,9 +3,6 @@ Bug #75178 (bcpowmod() misbehaves for non-integer base or modulus) --SKIPIF-- --FILE-- ===DONE=== ---EXPECT-- -bc math warning: non-zero scale in base +--EXPECTF-- +Warning: bcpowmod(): non-zero scale in base in %s on line %d string(5) "1.000" -bc math warning: non-zero scale in modulus + +Warning: bcpowmod(): non-zero scale in modulus in %s on line %d string(5) "1.000" ===DONE===