diff options
author | Sara Golemon <pollita@php.net> | 2003-02-06 22:18:41 +0000 |
---|---|---|
committer | Sara Golemon <pollita@php.net> | 2003-02-06 22:18:41 +0000 |
commit | 874661a66ed517df9fb8dc375679fcaeb5387bdd (patch) | |
tree | 26b31d827631b84bcb3e9279dc5205bd4b630464 /ext/bcmath | |
parent | dc052fe0e5cf922b7cd526eac7572ed89361fe9e (diff) | |
download | php-git-874661a66ed517df9fb8dc375679fcaeb5387bdd.tar.gz |
bc_raise() can return a scale lower than that passed into it. While most other bcmath calls won't, it's safest to do a quick check that we're only
reducing n_scale, not increasing it.
Diffstat (limited to 'ext/bcmath')
-rw-r--r-- | ext/bcmath/bcmath.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/ext/bcmath/bcmath.c b/ext/bcmath/bcmath.c index 74e5f89c5a..38b742b2f6 100644 --- a/ext/bcmath/bcmath.c +++ b/ext/bcmath/bcmath.c @@ -159,7 +159,8 @@ PHP_FUNCTION(bcadd) php_str2num(&first, Z_STRVAL_PP(left) TSRMLS_CC); php_str2num(&second, Z_STRVAL_PP(right) TSRMLS_CC); bc_add (first, second, &result, scale); - result->n_scale = scale; + if (result->n_scale > scale) + result->n_scale = scale; Z_STRVAL_P(return_value) = bc_num2str(result); Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); Z_TYPE_P(return_value) = IS_STRING; @@ -203,7 +204,8 @@ PHP_FUNCTION(bcsub) php_str2num(&first, Z_STRVAL_PP(left) TSRMLS_CC); php_str2num(&second, Z_STRVAL_PP(right) TSRMLS_CC); bc_sub (first, second, &result, scale); - result->n_scale = scale; + if (result->n_scale > scale) + result->n_scale = scale; Z_STRVAL_P(return_value) = bc_num2str(result); Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); Z_TYPE_P(return_value) = IS_STRING; @@ -247,7 +249,8 @@ PHP_FUNCTION(bcmul) php_str2num(&first, Z_STRVAL_PP(left) TSRMLS_CC); php_str2num(&second, Z_STRVAL_PP(right) TSRMLS_CC); bc_multiply (first, second, &result, scale TSRMLS_CC); - result->n_scale = scale; + if (result->n_scale > scale) + result->n_scale = scale; Z_STRVAL_P(return_value) = bc_num2str(result); Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); Z_TYPE_P(return_value) = IS_STRING; @@ -292,7 +295,8 @@ PHP_FUNCTION(bcdiv) php_str2num(&second, Z_STRVAL_PP(right) TSRMLS_CC); switch (bc_divide (first, second, &result, scale TSRMLS_CC)) { case 0: /* OK */ - result->n_scale = scale; + if (result->n_scale > scale) + result->n_scale = scale; Z_STRVAL_P(return_value) = bc_num2str(result); Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); Z_TYPE_P(return_value) = IS_STRING; @@ -370,7 +374,8 @@ PHP_FUNCTION(bcpowmod) php_str2num(&second, right TSRMLS_CC); php_str2num(&mod, modulous TSRMLS_CC); bc_raisemod(first, second, mod, &result, scale TSRMLS_CC); - result->n_scale = scale; + if (result->n_scale > scale) + result->n_scale = scale; Z_STRVAL_P(return_value) = bc_num2str(result); Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); Z_TYPE_P(return_value) = IS_STRING; @@ -415,7 +420,8 @@ PHP_FUNCTION(bcpow) php_str2num(&first, Z_STRVAL_PP(left) TSRMLS_CC); php_str2num(&second, Z_STRVAL_PP(right) TSRMLS_CC); bc_raise (first, second, &result, scale TSRMLS_CC); - result->n_scale = scale; + if (result->n_scale > scale) + result->n_scale = scale; Z_STRVAL_P(return_value) = bc_num2str(result); Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); Z_TYPE_P(return_value) = IS_STRING; @@ -455,7 +461,8 @@ PHP_FUNCTION(bcsqrt) bc_init_num(&result TSRMLS_CC); php_str2num(&result, Z_STRVAL_PP(left) TSRMLS_CC); if (bc_sqrt (&result, scale TSRMLS_CC) != 0) { - result->n_scale = scale; + if (result->n_scale > scale) + result->n_scale = scale; Z_STRVAL_P(return_value) = bc_num2str(result); Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); Z_TYPE_P(return_value) = IS_STRING; |