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