gnucash maint: Multiple changes pushed

John Ralls jralls at code.gnucash.org
Sat Jul 10 15:19:08 EDT 2021


Updated	 via  https://github.com/Gnucash/gnucash/commit/083035ae (commit)
	 via  https://github.com/Gnucash/gnucash/commit/f51474d9 (commit)
	from  https://github.com/Gnucash/gnucash/commit/659e43f9 (commit)



commit 083035aee7e5b6d8ef62632df818068b2ab870e6
Merge: 659e43f93 f51474d9b
Author: John Ralls <jralls at ceridwen.us>
Date:   Sat Jul 10 12:15:28 2021 -0700

    Merge Simon Arlott's 'bug-798234' into maint.


commit f51474d9bb1131fa0c4cc5b4d648f1d7944cefb5
Author: Simon Arlott <sa.me.uk>
Date:   Wed Jul 7 20:56:58 2021 +0100

    Bug 798234 - Cut Transaction discards the reference to the description/memo strings so that Paste Transaction will paste uninitialised data (or other strings)
    
    When a transaction is cut, any globally unique description and memo strings
    that are referenced by FloatingTxn/FloatingSplit will refer to memory that
    has been freed. This results in uninitialised data (or other strings) being
    inserted when the transaction is pasted.
    
    These strings are in the string cache so take a new reference to them when
    copying them to the FloatingTxn/FloatingSplit.
    
    Fix memory leaks of FloatingTxn and FloatingSplit when they're used
    temporarily.
    
    Fix memory leak in FloatingTxn by freeing the m_splits list too.

diff --git a/gnucash/register/ledger-core/split-register-copy-ops.c b/gnucash/register/ledger-core/split-register-copy-ops.c
index 1461a9fc6..5b4b6a786 100644
--- a/gnucash/register/ledger-core/split-register-copy-ops.c
+++ b/gnucash/register/ledger-core/split-register-copy-ops.c
@@ -103,13 +103,13 @@ void gnc_float_split_set_transaction (FloatingSplit *fs, Transaction *transactio
 void gnc_float_split_set_memo (FloatingSplit *fs, const char *memo)
 {
     g_return_if_fail (fs);
-    fs->m_memo = memo;
+    CACHE_REPLACE (fs->m_memo, memo);
 };
 
 void gnc_float_split_set_action (FloatingSplit *fs, const char *action)
 {
     g_return_if_fail (fs);
-    fs->m_action = action;
+    CACHE_REPLACE (fs->m_action, action);
 };
 
 void gnc_float_split_set_reconcile_state (FloatingSplit *fs, char reconcile_state)
@@ -152,8 +152,8 @@ FloatingSplit *gnc_split_to_float_split (Split *split)
     fs->m_split = split;
     fs->m_account = xaccSplitGetAccount (split);
     fs->m_transaction = xaccSplitGetParent (split);
-    fs->m_memo = xaccSplitGetMemo (split);
-    fs->m_action = xaccSplitGetAction (split);
+    fs->m_memo = CACHE_INSERT (xaccSplitGetMemo (split));
+    fs->m_action = CACHE_INSERT (xaccSplitGetAction (split));
     fs->m_reconcile_state = xaccSplitGetReconcile (split);
     fs->m_reconcile_date = xaccSplitGetDateReconciled (split);
     fs->m_amount = xaccSplitGetAmount (split);
@@ -186,6 +186,15 @@ void gnc_float_split_to_split (const FloatingSplit *fs, Split *split)
     }
 }
 
+void gnc_float_split_free (FloatingSplit *fs)
+{
+    g_return_if_fail (fs);
+
+    CACHE_REMOVE (fs->m_memo);
+    CACHE_REMOVE (fs->m_action);
+    g_free (fs);
+}
+
 /* accessors */
 Transaction *gnc_float_txn_get_txn (const FloatingTxn *ft)
 {
@@ -294,25 +303,25 @@ void gnc_float_txn_set_date_posted (FloatingTxn *ft, time64 date_posted)
 void gnc_float_txn_set_num (FloatingTxn *ft, const char *num)
 {
     g_return_if_fail (ft);
-    ft->m_num = num;
+    CACHE_REPLACE (ft->m_num, num);
 };
 
 void gnc_float_txn_set_description (FloatingTxn *ft, const char *description)
 {
     g_return_if_fail (ft);
-    ft->m_description = description;
+    CACHE_REPLACE (ft->m_description, description);
 };
 
 void gnc_float_txn_set_notes (FloatingTxn *ft, const char *notes)
 {
     g_return_if_fail (ft);
-    ft->m_notes = notes;
+    CACHE_REPLACE (ft->m_notes, notes);
 };
 
 void gnc_float_txn_set_doclink (FloatingTxn *ft, const char *doclink)
 {
     g_return_if_fail (ft);
-    ft->m_doclink = doclink;
+    CACHE_REPLACE (ft->m_doclink, doclink);
 };
 
 void gnc_float_txn_set_splits (FloatingTxn *ft, SplitList *splits)
@@ -342,11 +351,11 @@ FloatingTxn *gnc_txn_to_float_txn (Transaction *txn, gboolean use_cut_semantics)
     if (use_cut_semantics)
     {
         ft->m_date_posted = xaccTransGetDate (txn);
-        ft->m_num = xaccTransGetNum (txn);
+        ft->m_num = CACHE_INSERT (xaccTransGetNum (txn));
     }
-    ft->m_description = xaccTransGetDescription (txn);
-    ft->m_notes = xaccTransGetNotes (txn);
-    ft->m_doclink = xaccTransGetDocLink (txn);
+    ft->m_description = CACHE_INSERT (xaccTransGetDescription (txn));
+    ft->m_notes = CACHE_INSERT (xaccTransGetNotes (txn));
+    ft->m_doclink = CACHE_INSERT (xaccTransGetDocLink (txn));
 
     for (iter = xaccTransGetSplitList (txn); iter ; iter = iter->next)
     {
@@ -427,3 +436,15 @@ void gnc_float_txn_to_txn_swap_accounts (const FloatingTxn *ft, Transaction *txn
     if (do_commit)
         xaccTransCommitEdit (txn);
 }
+
+void gnc_float_txn_free (FloatingTxn *ft)
+{
+    g_return_if_fail (ft);
+
+    CACHE_REMOVE (ft->m_num);
+    CACHE_REMOVE (ft->m_description);
+    CACHE_REMOVE (ft->m_notes);
+    CACHE_REMOVE (ft->m_doclink);
+    g_list_free_full (ft->m_splits, (GDestroyNotify)gnc_float_split_free);
+    g_free (ft);
+}
diff --git a/gnucash/register/ledger-core/split-register-copy-ops.h b/gnucash/register/ledger-core/split-register-copy-ops.h
index bbfa694f0..707353136 100644
--- a/gnucash/register/ledger-core/split-register-copy-ops.h
+++ b/gnucash/register/ledger-core/split-register-copy-ops.h
@@ -84,6 +84,8 @@ void gnc_float_split_set_value (FloatingSplit *fs, gnc_numeric value);
 FloatingSplit *gnc_split_to_float_split (Split *split);
 void gnc_float_split_to_split (const FloatingSplit *fs, Split *split);
 
+void gnc_float_split_free (FloatingSplit *fs);
+
 /* accessors */
 Transaction *gnc_float_txn_get_txn (const FloatingTxn *ft);
 gnc_commodity *gnc_float_txn_get_currency (const FloatingTxn *ft);
@@ -116,4 +118,6 @@ FloatingTxn *gnc_txn_to_float_txn (Transaction *txn, gboolean use_cut_semantics)
 void gnc_float_txn_to_txn (const FloatingTxn *ft, Transaction *txn, gboolean do_commit);
 void gnc_float_txn_to_txn_swap_accounts (const FloatingTxn *ft, Transaction *txn, Account *acct1, Account *acct2, gboolean do_commit);
 
+void gnc_float_txn_free (FloatingTxn *ft);
+
 #endif
diff --git a/gnucash/register/ledger-core/split-register.c b/gnucash/register/ledger-core/split-register.c
index 68e01c549..0c31a81a8 100644
--- a/gnucash/register/ledger-core/split-register.c
+++ b/gnucash/register/ledger-core/split-register.c
@@ -100,6 +100,7 @@ gnc_copy_split_onto_split (Split* from, Split* to, gboolean use_cut_semantics)
         return;
 
     gnc_float_split_to_split (fs, to);
+    gnc_float_split_free (fs);
 }
 
 void
@@ -117,6 +118,7 @@ gnc_copy_trans_onto_trans (Transaction* from, Transaction* to,
         return;
 
     gnc_float_txn_to_txn (ft, to, do_commit);
+    gnc_float_txn_free (ft);
 }
 
 static int
@@ -819,9 +821,9 @@ gnc_split_register_copy_current_internal (SplitRegister* reg,
 
     /* unprotect the old object, if any */
     if (copied_item.ftype == GNC_TYPE_SPLIT)
-        g_free (copied_item.fs);
+        gnc_float_split_free (copied_item.fs);
     if (copied_item.ftype == GNC_TYPE_TRANSACTION)
-        g_free (copied_item.ft);
+        gnc_float_txn_free (copied_item.ft);
     copied_item.ftype = 0;
 
     if (new_fs)
diff --git a/gnucash/register/ledger-core/test/utest-split-register-copy-ops.c b/gnucash/register/ledger-core/test/utest-split-register-copy-ops.c
index 9723f973d..46c8ce9e2 100644
--- a/gnucash/register/ledger-core/test/utest-split-register-copy-ops.c
+++ b/gnucash/register/ledger-core/test/utest-split-register-copy-ops.c
@@ -276,7 +276,7 @@ test_gnc_split_to_float_split (Fixture *fixture, gconstpointer pData)
     g_assert_true (gnc_numeric_equal(fs->m_value, xaccSplitGetValue (s)));
     g_assert_true (gnc_numeric_equal(fs->m_amount, xaccSplitGetAmount (s)));
 
-    g_free (fs);
+    gnc_float_split_free (fs);
 }
 /* gnc_float_split_to_split
 void gnc_float_split_to_split (const FloatingSplit *fs, Split *split)// C: 2 in 1  Local: 1:0:0
@@ -412,9 +412,7 @@ test_gnc_txn_to_float_txn (Fixture *fixture, gconstpointer pData)
 
     g_assert_null (fsiter->next);
 
-    g_list_free_full(ft->m_splits, g_free);
-    ft->m_splits = NULL;
-    g_free (ft);
+    gnc_float_txn_free (ft);
 }
 static void
 test_gnc_txn_to_float_txn_cut_semantics (Fixture *fixture, gconstpointer pData)
@@ -471,9 +469,7 @@ test_gnc_txn_to_float_txn_cut_semantics (Fixture *fixture, gconstpointer pData)
 
     g_assert_null (fsiter->next);
 
-    g_list_free_full(ft->m_splits, g_free);
-    ft->m_splits = NULL;
-    g_free (ft);
+    gnc_float_txn_free (ft);
 }
 
 



Summary of changes:
 .../register/ledger-core/split-register-copy-ops.c | 45 ++++++++++++++++------
 .../register/ledger-core/split-register-copy-ops.h |  4 ++
 gnucash/register/ledger-core/split-register.c      |  6 ++-
 .../test/utest-split-register-copy-ops.c           | 10 ++---
 4 files changed, 44 insertions(+), 21 deletions(-)



More information about the gnucash-changes mailing list