Bug 798203 - g_assert fault while reversing transaction

* Re-commit the original transaction to ensure that there aren't
any stray trading splits.
* If the original and cloned transactions have a different number of
splits don't leak the cloned transaction.
* Check that the cloned transaction isn't NULL before trying to invert
it.
This commit is contained in:
John Ralls 2021-06-12 13:23:36 -07:00
parent e625bc2f2c
commit 68ec80e68d

View File

@ -676,24 +676,20 @@ Transaction *
xaccTransClone (const Transaction *from) xaccTransClone (const Transaction *from)
{ {
Transaction *to = xaccTransCloneNoKvp (from); Transaction *to = xaccTransCloneNoKvp (from);
GList *lfrom, *lto;
if (g_list_length (to->splits) != g_list_length (from->splits))
{
PERR ("Cloned transaction has different number of splits from original");
xaccTransDestroy (to);
return NULL;
}
xaccTransBeginEdit (to); xaccTransBeginEdit (to);
qof_instance_copy_kvp (QOF_INSTANCE (to), QOF_INSTANCE (from)); qof_instance_copy_kvp (QOF_INSTANCE (to), QOF_INSTANCE (from));
g_return_val_if_fail (g_list_length (to->splits) == g_list_length (from->splits),
NULL);
lfrom = from->splits; for (GList* lfrom = from->splits, *lto = to->splits; lfrom && lto;
lto = to->splits; lfrom = g_list_next (lfrom), lto = g_list_next (lto))
/* lfrom and lto are known to be of equal length via above
g_return_val_if_fail */
while (lfrom != NULL)
{
xaccSplitCopyKvp (lfrom->data, lto->data); xaccSplitCopyKvp (lfrom->data, lto->data);
lfrom = lfrom->next;
lto = lto->next;
}
xaccTransCommitEdit (to); xaccTransCommitEdit (to);
return to; return to;
@ -2818,7 +2814,15 @@ xaccTransReverse (Transaction *orig)
GValue v = G_VALUE_INIT; GValue v = G_VALUE_INIT;
g_return_val_if_fail(orig, NULL); g_return_val_if_fail(orig, NULL);
/* First edit, dirty, and commit orig to ensure that any trading
* splits are correctly balanced.
*/
xaccTransBeginEdit (orig);
qof_instance_set_dirty (QOF_INSTANCE (orig));
xaccTransCommitEdit (orig);
trans = xaccTransClone(orig); trans = xaccTransClone(orig);
g_return_val_if_fail (trans, NULL);
xaccTransBeginEdit(trans); xaccTransBeginEdit(trans);
/* Reverse the values on each split. Clear per-split info. */ /* Reverse the values on each split. Clear per-split info. */