From 5c5b627cb147ecc8f7816e66abf60bbaedb98ce7 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 30 Sep 2024 12:49:52 -0700 Subject: [PATCH] Bug 799423 - Crash when creating ETF transaction Don't keep the old split if it's a trading split. The balance code regenerates those, invalidating the pointer. --- .../ledger-core/split-register-control.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/gnucash/register/ledger-core/split-register-control.cpp b/gnucash/register/ledger-core/split-register-control.cpp index 1c38c7d3fea..a44d2649457 100644 --- a/gnucash/register/ledger-core/split-register-control.cpp +++ b/gnucash/register/ledger-core/split-register-control.cpp @@ -364,6 +364,12 @@ gnc_split_register_check_account (SplitRegister *reg, return TRUE; } +static inline bool +is_trading_split (Split* split) +{ + return xaccAccountGetType (xaccSplitGetAccount (split)) == ACCT_TYPE_TRADING; +} + static void gnc_split_register_move_cursor (VirtualLocation *p_new_virt_loc, gpointer user_data) @@ -374,10 +380,10 @@ gnc_split_register_move_cursor (VirtualLocation *p_new_virt_loc, Transaction *pending_trans; Transaction *new_trans; Transaction *old_trans; - Split *old_trans_split; + Split *old_trans_split{nullptr}; Split *new_trans_split; Split *new_split; - Split *old_split; + Split *old_split{nullptr}; CursorClass new_class; CursorClass old_class; gboolean exact_traversal; @@ -399,10 +405,13 @@ gnc_split_register_move_cursor (VirtualLocation *p_new_virt_loc, info = gnc_split_register_get_info (reg); /* The transaction we are coming from */ - old_split = gnc_split_register_get_current_split (reg); + if (auto s{gnc_split_register_get_current_split (reg)}; !is_trading_split(s)) + old_split = s; old_trans = gnc_split_register_get_current_trans (reg); - old_trans_split = - gnc_split_register_get_current_trans_split (reg, &old_trans_split_loc); + if (auto s{gnc_split_register_get_current_trans_split (reg, &old_trans_split_loc)}; + is_trading_split(s)) + old_trans_split = s; + old_class = gnc_split_register_get_current_cursor_class (reg); exact_traversal = info->exact_traversal;