From cbe765c6d95fe22beff4088faa6e21948cd3b5f0 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Thu, 20 Jul 2023 18:18:39 -0700 Subject: [PATCH] Bug 798958 - gncScrubLotLinks will infinite loop in some conditions The conditions being containing a split from a voided transaction. Instead of trying to destroy zero-value splits (doomed to fail in that instance and generally rude otherwise) just remove them from the lot list. --- libgnucash/engine/ScrubBusiness.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/libgnucash/engine/ScrubBusiness.c b/libgnucash/engine/ScrubBusiness.c index 367becd9b2..0a68fc9531 100644 --- a/libgnucash/engine/ScrubBusiness.c +++ b/libgnucash/engine/ScrubBusiness.c @@ -214,13 +214,21 @@ scrub_start: if (xaccTransGetTxnType (ll_txn) == TXN_TYPE_INVOICE) continue; // next scrub lot split - // Empty splits can be removed immediately - if (gnc_numeric_zero_p (xaccSplitGetValue (sl_split)) || - gnc_numeric_zero_p(xaccSplitGetValue (sl_split))) + // Empty splits can be immediately removed from the list. + if (gnc_numeric_zero_p (xaccSplitGetValue (sl_split))) { - xaccSplitDestroy (sl_split); - modified = TRUE; - goto scrub_start; + GList *tmp_iter = sls_iter->prev; + PINFO("Removing 0-value split from the lot."); + + if (xaccTransGetReadOnly(xaccSplitGetParent(sl_split))) + gnc_lot_remove_split (scrub_lot, sl_split); + else + xaccSplitDestroy (sl_split); + + sls_iter = tmp_iter; + if (!sls_iter) + goto scrub_start; // Otherwise sls_iter->next will crash + continue; } // Iterate over all splits in the lot link transaction