mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
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:
parent
e625bc2f2c
commit
68ec80e68d
@ -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. */
|
||||||
|
Loading…
Reference in New Issue
Block a user