gnucash stable: Multiple changes pushed

John Ralls jralls at code.gnucash.org
Fri May 16 18:55:13 EDT 2025


Updated	 via  https://github.com/Gnucash/gnucash/commit/fc5ec5d3 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/7ff08b27 (commit)
	from  https://github.com/Gnucash/gnucash/commit/ebc40776 (commit)



commit fc5ec5d3074a75e7e506c8935852df0b6de2a728
Author: John Ralls <jralls at ceridwen.us>
Date:   Fri May 16 15:50:33 2025 -0700

    Register: Ensure splits belong to transaction.
    
    In the register we have a high likelihood of processing transactions that
    are being edited, so when traversing transaction split lists always ensure
    that the split still belongs to the transaction before including it in
    whatever we're doing.
    
     # Please enter the commit message for your changes. Lines starting

diff --git a/gnucash/register/ledger-core/split-register-control.cpp b/gnucash/register/ledger-core/split-register-control.cpp
index 52400915cd..d1e098e100 100644
--- a/gnucash/register/ledger-core/split-register-control.cpp
+++ b/gnucash/register/ledger-core/split-register-control.cpp
@@ -62,6 +62,11 @@ check_imbalance_fraction (const SplitRegister *reg,
         for (auto node = xaccTransGetSplitList (trans); node;
              node = g_list_next (node))
         {
+            auto split{GNC_SPLIT(node->data)};
+
+            if (!(split && xaccTransStillHasSplit (trans, split)))
+                continue;
+
             auto acc = xaccSplitGetAccount (GNC_SPLIT(node->data));
             if (xaccAccountGetCommodity (acc) == imbal_comm &&
                 imbal_mon->value.denom > xaccAccountGetCommoditySCU (acc))
@@ -694,6 +699,10 @@ gnc_find_split_in_trans_by_memo (Transaction *trans, const char *memo,
     for (GList *n = xaccTransGetSplitList (trans); n; n = n->next)
     {
         auto split = GNC_SPLIT(n->data);
+
+        if (!(split && xaccTransStillHasSplit (trans, split)))
+            continue;
+
         if (unit_price)
         {
             gnc_numeric price = xaccSplitGetSharePrice (split);
@@ -945,7 +954,8 @@ gnc_split_register_auto_completion (SplitRegister *reg,
             for (GList *n = xaccTransGetSplitList (trans); n; n = n->next)
             {
                 auto s = GNC_SPLIT(n->data);
-                if (default_account == xaccSplitGetAccount (s))
+                if (s && xaccTransStillHasSplit (trans, s) &&
+                    default_account == xaccSplitGetAccount (s))
                 {
                     blank_split = s;
                     info->blank_split_guid = *xaccSplitGetGUID (blank_split);
diff --git a/gnucash/register/ledger-core/split-register-copy-ops.c b/gnucash/register/ledger-core/split-register-copy-ops.c
index fcc688009c..11e783e530 100644
--- a/gnucash/register/ledger-core/split-register-copy-ops.c
+++ b/gnucash/register/ledger-core/split-register-copy-ops.c
@@ -357,7 +357,7 @@ FloatingTxn *gnc_txn_to_float_txn (Transaction *txn, gboolean use_cut_semantics)
     for (iter = xaccTransGetSplitList (txn); iter ; iter = iter->next)
     {
         Split *split = iter->data;
-        if (split)
+        if (split && xaccTransStillHasSplit (txn, split))
         {
             FloatingSplit *fs = gnc_split_to_float_split (split);
             ft->m_splits = g_list_prepend (ft->m_splits, fs);
diff --git a/gnucash/register/ledger-core/split-register-load.c b/gnucash/register/ledger-core/split-register-load.c
index 1a61222776..1b8fb309ab 100644
--- a/gnucash/register/ledger-core/split-register-load.c
+++ b/gnucash/register/ledger-core/split-register-load.c
@@ -272,6 +272,10 @@ add_quickfill_completions (TableLayout* layout, Transaction* trans,
     for (GList *n = xaccTransGetSplitList (trans); n; n = n->next)
     {
         Split *s = n->data;
+
+        if (!xaccTransStillHasSplit (trans, s))
+            continue;
+
         gnc_quickfill_cell_add_completion (
             (QuickFillCell*) gnc_table_layout_get_cell (layout, MEMO_CELL),
             xaccSplitGetMemo (s));
diff --git a/gnucash/register/ledger-core/split-register-model.c b/gnucash/register/ledger-core/split-register-model.c
index 5a86c9003c..1a456e8a38 100644
--- a/gnucash/register/ledger-core/split-register-model.c
+++ b/gnucash/register/ledger-core/split-register-model.c
@@ -107,6 +107,10 @@ gnc_split_register_get_rbaln (VirtualLocation virt_loc, gpointer user_data,
         for (node = xaccTransGetSplitList (trans); node; node = node->next)
         {
             Split* secondary = node->data;
+
+            if (!xaccTransStillHasSplit (trans, secondary))
+              continue;
+
             i++;
 
             if (subaccounts)
@@ -2193,6 +2197,10 @@ gnc_split_register_confirm (VirtualLocation virt_loc, gpointer user_data)
         for (GList *node = xaccTransGetSplitList (trans); node; node = node->next)
         {
             Split* split = node->data;
+
+            if (!xaccTransStillHasSplit (trans, split))
+                continue;
+
             if (xaccSplitGetReconcile (split) == YREC)
             {
                 gchar* name = gnc_account_get_full_name (xaccSplitGetAccount (split));
diff --git a/gnucash/register/ledger-core/split-register.c b/gnucash/register/ledger-core/split-register.c
index badd84f50b..d5c9959647 100644
--- a/gnucash/register/ledger-core/split-register.c
+++ b/gnucash/register/ledger-core/split-register.c
@@ -1140,7 +1140,7 @@ gnc_split_register_change_blank_split_ref (SplitRegister* reg, Split* split)
     for (GList *n = xaccTransGetSplitList (trans); n; n = n->next)
     {
         Split *s = n->data;
-        if (s != current_blank_split)
+        if (s != current_blank_split && xaccTransStillHasSplit (trans, s))
         {
             if (blank_split_account == xaccSplitGetAccount (s))
                 pref_split = s;  // prefer same account
@@ -1153,6 +1153,8 @@ gnc_split_register_change_blank_split_ref (SplitRegister* reg, Split* split)
         info->blank_split_guid = *xaccSplitGetGUID (pref_split);
     else if (other_split != NULL)
         info->blank_split_guid = *xaccSplitGetGUID (other_split);
+    else
+      info->blank_split_guid = *guid_null();
 }
 
 void

commit 7ff08b2775236e8d30fc3f40d8e729d44652cec4
Author: John Ralls <jralls at ceridwen.us>
Date:   Fri May 16 15:17:42 2025 -0700

    Bug 799597 - Crash when deleting all splits in General Journal
    
    Allow creating a new blank split in an existing transaction.

diff --git a/gnucash/register/ledger-core/split-register-load.c b/gnucash/register/ledger-core/split-register-load.c
index d6963ed316..1a61222776 100644
--- a/gnucash/register/ledger-core/split-register-load.c
+++ b/gnucash/register/ledger-core/split-register-load.c
@@ -281,7 +281,6 @@ add_quickfill_completions (TableLayout* layout, Transaction* trans,
 static Split*
 create_blank_split (Account* default_account, SRInfo* info)
 {
-    Transaction* new_trans;
     gboolean currency_from_account = TRUE;
     Split* blank_split = NULL;
     /* Determine the proper currency to use for this transaction.
@@ -300,14 +299,21 @@ create_blank_split (Account* default_account, SRInfo* info)
     }
 
     gnc_suspend_gui_refresh();
+    Transaction *pending_trans = xaccTransLookup (&info->pending_trans_guid,
+                                                  gnc_get_current_book());
 
-    new_trans = xaccMallocTransaction (gnc_get_current_book());
+    if (!pending_trans)
+    {
+        pending_trans = xaccMallocTransaction (gnc_get_current_book());
+        xaccTransBeginEdit (pending_trans);
+        xaccTransSetCurrency (pending_trans, currency);
+        xaccTransSetDatePostedSecsNormalized (pending_trans,
+                                              info->last_date_entered);
+        info->pending_trans_guid = *xaccTransGetGUID (pending_trans);
+    }
 
-    xaccTransBeginEdit (new_trans);
-    xaccTransSetCurrency (new_trans, currency);
-    xaccTransSetDatePostedSecsNormalized (new_trans, info->last_date_entered);
     blank_split = xaccMallocSplit (gnc_get_current_book());
-    xaccSplitSetParent (blank_split, new_trans);
+    xaccSplitSetParent (blank_split, pending_trans);
     /* We don't want to commit this transaction yet, because the split
        doesn't even belong to an account yet.  But, we don't want to
        set this transaction as the pending transaction either, because
@@ -476,13 +482,8 @@ gnc_split_register_load (SplitRegister* reg, GList* slist,
 
     /* make sure we have a blank split */
     if (blank_split == NULL)
-    {
-        /* Wouldn't it be a bug to open the new transaction if there was
-         * already a pending transaction?
-        */
-        g_assert (pending_trans == NULL);
         blank_split = create_blank_split (default_account, info);
-    }
+
     blank_trans = xaccSplitGetParent (blank_split);
 
     DEBUG ("blank_split=%p, blank_trans=%p, pending_trans=%p",



Summary of changes:
 .../ledger-core/split-register-control.cpp         | 12 ++++++++-
 .../register/ledger-core/split-register-copy-ops.c |  2 +-
 gnucash/register/ledger-core/split-register-load.c | 29 +++++++++++++---------
 .../register/ledger-core/split-register-model.c    |  8 ++++++
 gnucash/register/ledger-core/split-register.c      |  4 ++-
 5 files changed, 40 insertions(+), 15 deletions(-)



More information about the gnucash-changes mailing list