gnucash unstable: Multiple changes pushed

Geert Janssens gjanssens at code.gnucash.org
Mon Oct 23 17:06:19 EDT 2017


Updated	 via  https://github.com/Gnucash/gnucash/commit/444eb1c2 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/53ef0c5b (commit)
	from  https://github.com/Gnucash/gnucash/commit/70a37a24 (commit)



commit 444eb1c28edcfc57f5cbc02a8456eb86c39f517f
Author: Geert Janssens <geert at kobaltwit.be>
Date:   Mon Oct 23 22:13:22 2017 +0200

    Improve gnc_numeric_boxed_copy_func based on discussion in PR#145
    
    In essence
    - guard against nullptr dereferencing
    - free returned values

diff --git a/gnucash/register/ledger-core/split-register-model.c b/gnucash/register/ledger-core/split-register-model.c
index 255a9e9..2c2f67e 100644
--- a/gnucash/register/ledger-core/split-register-model.c
+++ b/gnucash/register/ledger-core/split-register-model.c
@@ -2209,7 +2209,7 @@ gnc_template_register_get_debcred_entry (VirtualLocation virt_loc,
 {
     SplitRegister *reg = user_data;
     Split *split;
-    gnc_numeric *amount;
+    gnc_numeric *amount, amount2;
     const char * cell_name;
 
     split = gnc_split_register_get_split (reg, virt_loc.vcell_loc);
@@ -2228,11 +2228,18 @@ gnc_template_register_get_debcred_entry (VirtualLocation virt_loc,
         qof_instance_get (QOF_INSTANCE (split),
                           "sx-credit-numeric", &amount,
                           NULL);
+    if (!amount)
+        return "";
+
     if (gnc_numeric_zero_p (*amount))
+    {
+        g_free (amount);
         return "";
+    }
 
-    *amount = gnc_numeric_abs (*amount);
-    return xaccPrintAmount (*amount, gnc_default_print_info (FALSE));
+    amount2 = gnc_numeric_abs (*amount);
+    g_free (amount);
+    return xaccPrintAmount (amount2, gnc_default_print_info (FALSE));
 }
 
 static void
diff --git a/libgnucash/app-utils/gnc-sx-instance-model.c b/libgnucash/app-utils/gnc-sx-instance-model.c
index ea196a0..76fcef0 100644
--- a/libgnucash/app-utils/gnc-sx-instance-model.c
+++ b/libgnucash/app-utils/gnc-sx-instance-model.c
@@ -78,11 +78,12 @@ scrub_sx_split_numeric (Split* split, const char *debcred)
     const char *numeric = is_credit ?
         "sx-credit-numeric" : "sx-debit-numeric";
     char *formval;
-    gnc_numeric *numval;
+    gnc_numeric *numval = NULL;
     GHashTable *parser_vars = g_hash_table_new (g_str_hash, g_str_equal);
     char *error_loc;
     gnc_numeric amount = gnc_numeric_zero ();
     gboolean parse_result = FALSE;
+    gboolean num_val_changed = FALSE;
     qof_instance_get (QOF_INSTANCE (split),
 		  formula, &formval,
 		  numeric, &numval,
@@ -93,12 +94,15 @@ scrub_sx_split_numeric (Split* split, const char *debcred)
     if (!parse_result || g_hash_table_size (parser_vars) != 0)
         amount = gnc_numeric_zero ();
     g_hash_table_unref (parser_vars);
-    if (gnc_numeric_eq (amount, *numval))
-        return FALSE;
-    qof_instance_set (QOF_INSTANCE (split),
-		  numeric, &amount,
-		  NULL);
-    return TRUE;
+    if (!numval || !gnc_numeric_eq (amount, *numval))
+    {
+        qof_instance_set (QOF_INSTANCE (split),
+                          numeric, &amount,
+                          NULL);
+        num_val_changed = TRUE;
+    }
+    g_free (numval);
+    return num_val_changed;
 }
 
 /* Fixes error in pre-2.6.16 where the numeric slot wouldn't get changed if the
diff --git a/libgnucash/engine/gnc-numeric.cpp b/libgnucash/engine/gnc-numeric.cpp
index 0b7770a..3212245 100644
--- a/libgnucash/engine/gnc-numeric.cpp
+++ b/libgnucash/engine/gnc-numeric.cpp
@@ -1222,12 +1222,15 @@ string_to_gnc_numeric(const gchar* str, gnc_numeric *n)
  *  GValue handling
  ********************************************************************/
 static gpointer
-gnc_numeric_boxed_copy_func( gpointer in_gnc_numeric )
+gnc_numeric_boxed_copy_func( gpointer in_ptr )
 {
-    gnc_numeric* newvalue;
+    auto in_gnc_numeric = static_cast<gnc_numeric*>(in_ptr);
+    if (!in_gnc_numeric)
+        return nullptr;
 
-    newvalue = static_cast<gnc_numeric*>(g_malloc (sizeof (gnc_numeric)));
-    memcpy( newvalue, in_gnc_numeric, sizeof( gnc_numeric ) );
+    /* newvalue will be passed to g_free so we must allocate with g_malloc. */
+    auto newvalue = static_cast<gnc_numeric*>(g_malloc (sizeof (gnc_numeric)));
+    *newvalue = *in_gnc_numeric;
 
     return newvalue;
 }
diff --git a/libgnucash/engine/test/test-account-object.cpp b/libgnucash/engine/test/test-account-object.cpp
index ccc4289..9ecb2a8 100644
--- a/libgnucash/engine/test/test-account-object.cpp
+++ b/libgnucash/engine/test/test-account-object.cpp
@@ -60,6 +60,8 @@ run_test (void)
     do_test (gnc_numeric_zero_p(*end), "end balance is zero");
     do_test (gnc_numeric_zero_p(delta), "delta is zero");
     do_test (gnc_numeric_zero_p(end2), "end2 balance is zero");
+    g_free (start);
+    g_free (end);
 
     /*****/
 
@@ -75,6 +77,8 @@ run_test (void)
     do_test (gnc_numeric_zero_p(delta), "end balance matches");
     delta = gnc_numeric_sub(end2, five, GNC_DENOM_AUTO, GNC_HOW_DENOM_FIXED);
     do_test (gnc_numeric_zero_p(delta), "end2 balance matches");
+    g_free (start);
+    g_free (end);
 
     /*****/
 
diff --git a/libgnucash/engine/test/utest-Account.cpp b/libgnucash/engine/test/utest-Account.cpp
index df075bb..9fd7820 100644
--- a/libgnucash/engine/test/utest-Account.cpp
+++ b/libgnucash/engine/test/utest-Account.cpp
@@ -625,6 +625,12 @@ test_gnc_account_create_and_destroy (void)
     g_free (notes);
     g_free (tax_code);
     g_free (tax_src);
+    g_free (start_bal);
+    g_free (start_clr_bal);
+    g_free (start_rec_bal);
+    g_free (end_bal);
+    g_free (end_clr_bal);
+    g_free (end_rec_bal);
 
     g_object_unref (acc);
     /* There's no good way to test that the object has been properly
diff --git a/libgnucash/engine/test/utest-Budget.c b/libgnucash/engine/test/utest-Budget.c
index 6a2978e..38795e6 100644
--- a/libgnucash/engine/test/utest-Budget.c
+++ b/libgnucash/engine/test/utest-Budget.c
@@ -604,6 +604,12 @@ test_gnc_account_create_and_destroy (void)
     g_free (notes);
     g_free (tax_code);
     g_free (tax_src);
+    g_free (start_bal);
+    g_free (start_clr_bal);
+    g_free (start_rec_bal);
+    g_free (end_bal);
+    g_free (end_clr_bal);
+    g_free (end_rec_bal);
 
     g_object_unref (acc);
     /* There's no good way to test that the object has been properly
diff --git a/libgnucash/engine/test/utest-Split.cpp b/libgnucash/engine/test/utest-Split.cpp
index 42bf871..1fb3b5e 100644
--- a/libgnucash/engine/test/utest-Split.cpp
+++ b/libgnucash/engine/test/utest-Split.cpp
@@ -249,6 +249,8 @@ test_gnc_split_set_get_property ()
      * few leaks to save trouble; it will all work fine once the
      * refactoring is taken care of.
      */
+    g_free (r_value);
+    g_free (r_amount);
     g_object_unref (txn);
     g_object_unref (acc);
     g_object_unref (lot);

commit 53ef0c5be9f3ed7b33ac8b1c7e8bb094969a62a9
Author: Bob-IT <Bob-IT at users.noreply.github.com>
Date:   Sun Apr 23 12:22:43 2017 +0100

    Save button active on every load
    
    The gnc_numeric numval was being set with a valid numeric and hence was always different to the parsed amount.

diff --git a/libgnucash/app-utils/gnc-sx-instance-model.c b/libgnucash/app-utils/gnc-sx-instance-model.c
index bc5997a..ea196a0 100644
--- a/libgnucash/app-utils/gnc-sx-instance-model.c
+++ b/libgnucash/app-utils/gnc-sx-instance-model.c
@@ -78,7 +78,7 @@ scrub_sx_split_numeric (Split* split, const char *debcred)
     const char *numeric = is_credit ?
         "sx-credit-numeric" : "sx-debit-numeric";
     char *formval;
-    gnc_numeric numval;
+    gnc_numeric *numval;
     GHashTable *parser_vars = g_hash_table_new (g_str_hash, g_str_equal);
     char *error_loc;
     gnc_numeric amount = gnc_numeric_zero ();
@@ -93,7 +93,7 @@ scrub_sx_split_numeric (Split* split, const char *debcred)
     if (!parse_result || g_hash_table_size (parser_vars) != 0)
         amount = gnc_numeric_zero ();
     g_hash_table_unref (parser_vars);
-    if (gnc_numeric_eq (amount, numval))
+    if (gnc_numeric_eq (amount, *numval))
         return FALSE;
     qof_instance_set (QOF_INSTANCE (split),
 		  numeric, &amount,



Summary of changes:
 gnucash/register/ledger-core/split-register-model.c | 13 ++++++++++---
 libgnucash/app-utils/gnc-sx-instance-model.c        | 18 +++++++++++-------
 libgnucash/engine/gnc-numeric.cpp                   | 11 +++++++----
 libgnucash/engine/test/test-account-object.cpp      |  4 ++++
 libgnucash/engine/test/utest-Account.cpp            |  6 ++++++
 libgnucash/engine/test/utest-Budget.c               |  6 ++++++
 libgnucash/engine/test/utest-Split.cpp              |  2 ++
 7 files changed, 46 insertions(+), 14 deletions(-)



More information about the gnucash-changes mailing list