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