gnucash maint: [gnc_scm_to_numeric] create NaN gnc_numeric instead of runtime error
Christopher Lam
clam at code.gnucash.org
Mon Nov 23 08:51:58 EST 2020
Updated via https://github.com/Gnucash/gnucash/commit/a1c517b4 (commit)
from https://github.com/Gnucash/gnucash/commit/8f329921 (commit)
commit a1c517b4ba107818ed289833ba9f1318cc01ed4d
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Mon Nov 23 21:33:35 2020 +0800
[gnc_scm_to_numeric] create NaN gnc_numeric instead of runtime error
If guile calls a C function which expects gnc_numeric but sends a
non-number, it will create a gnc_numeric_error object. This will allow
error gnc_numeric to be handled elsewhere.
Also the overflow gnc_numeric was incorrectly created.
diff --git a/bindings/guile/gnc-engine-guile.c b/bindings/guile/gnc-engine-guile.c
index ada25aab5..36915cd64 100644
--- a/bindings/guile/gnc-engine-guile.c
+++ b/bindings/guile/gnc-engine-guile.c
@@ -1721,11 +1721,21 @@ gnc_scm2query (SCM query_scm)
gnc_numeric
gnc_scm_to_numeric(SCM gncnum)
{
- if (scm_is_signed_integer(scm_numerator(gncnum), INT64_MIN, INT64_MAX) &&
- scm_is_signed_integer(scm_denominator(gncnum), INT64_MIN, INT64_MAX))
- return gnc_numeric_create(scm_to_int64(scm_numerator(gncnum)),
- scm_to_int64(scm_denominator(gncnum)));
- return gnc_numeric_create(0, GNC_ERROR_OVERFLOW);
+ SCM num, denom;
+
+ /* Not a number. */
+ if (!scm_is_number (gncnum))
+ return gnc_numeric_error (GNC_ERROR_ARG);
+
+ num = scm_numerator (gncnum);
+ denom = scm_denominator (gncnum);
+
+ /* scm overflows 64-bit numbers */
+ if (!scm_is_signed_integer (num, INT64_MIN, INT64_MAX) ||
+ !scm_is_signed_integer (denom, INT64_MIN, INT64_MAX))
+ return gnc_numeric_error (GNC_ERROR_OVERFLOW);
+
+ return gnc_numeric_create (scm_to_int64 (num), scm_to_int64 (denom));
}
SCM
Summary of changes:
bindings/guile/gnc-engine-guile.c | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
More information about the gnucash-changes
mailing list