From ca62782d93805206a2ae053b9a078b80c88cc594 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Tue, 7 Jul 2015 12:03:37 -0700 Subject: [PATCH] Fix up double-frees or frees of unallocated objects in KVP. Revealed by ensuring that KvpFrame and KvpValue deep-destroy their contents. --- src/backend/dbi/test/test-backend-dbi-basic.cpp | 2 +- src/backend/xml/test/test-kvp-frames.cpp | 1 - src/engine/Split.c | 2 +- src/engine/test/utest-Split.cpp | 4 ++-- src/libqof/qof/test/test-kvp-frame.cpp | 1 + 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backend/dbi/test/test-backend-dbi-basic.cpp b/src/backend/dbi/test/test-backend-dbi-basic.cpp index cd00f22435..4ea5418be9 100644 --- a/src/backend/dbi/test/test-backend-dbi-basic.cpp +++ b/src/backend/dbi/test/test-backend-dbi-basic.cpp @@ -109,7 +109,7 @@ setup_memory (Fixture *fixture, gconstpointer pData) frame->set("string-val", new KvpValue("abcdefghijklmnop")); auto guid = qof_instance_get_guid (QOF_INSTANCE(acct1)); - frame->set("guid-val", new KvpValue(const_cast(guid))); + frame->set("guid-val", new KvpValue(const_cast(guid_copy(guid)))); gnc_account_append_child (root, acct1); diff --git a/src/backend/xml/test/test-kvp-frames.cpp b/src/backend/xml/test/test-kvp-frames.cpp index 5fd4c8f5e7..dca51d1adf 100644 --- a/src/backend/xml/test/test-kvp-frames.cpp +++ b/src/backend/xml/test/test-kvp-frames.cpp @@ -120,7 +120,6 @@ test_kvp_frames1(void) test_kvp_copy_compare(i, test_frame1, test_val1, test_key); test_kvp_copy_get_slot(i, test_frame1, test_val1, test_key); - delete test_val1; g_free(test_key); delete test_frame1; } diff --git a/src/engine/Split.c b/src/engine/Split.c index a8d5f17a05..8d6142d85f 100644 --- a/src/engine/Split.c +++ b/src/engine/Split.c @@ -2051,7 +2051,7 @@ xaccSplitAddPeerSplit (Split *split, const Split *other_split, guid = qof_instance_get_guid (QOF_INSTANCE (other_split)); xaccTransBeginEdit (split->parent); qof_instance_kvp_add_guid (QOF_INSTANCE (split), "lot-split", - timespec_now(), "peer_guid", guid); + timespec_now(), "peer_guid", guid_copy(guid)); mark_split (split); qof_instance_set_dirty (QOF_INSTANCE (split)); xaccTransCommitEdit (split->parent); diff --git a/src/engine/test/utest-Split.cpp b/src/engine/test/utest-Split.cpp index d692b6a264..aa201ef4f6 100644 --- a/src/engine/test/utest-Split.cpp +++ b/src/engine/test/utest-Split.cpp @@ -319,7 +319,7 @@ test_xaccDupeSplit (Fixture *fixture, gconstpointer pData) } /* xaccSplitCloneNoKvp Split * -xaccSplitCloneNoKvp (const Split *s)// C: 1 +xaccSplitCloneNoKvp (const Split *s)// C: 1 */ static void test_xaccSplitCloneNoKvp (Fixture *fixture, gconstpointer pData) @@ -743,7 +743,7 @@ test_xaccSplitDetermineGainStatus (Fixture *fixture, gconstpointer pData) g_assert (fixture->split->gains_split == NULL); g_assert_cmpint (fixture->split->gains, ==, GAINS_STATUS_A_VDIRTY | GAINS_STATUS_DATE_DIRTY); - fixture->split->inst.kvp_data->set("gains-source", new KvpValue(const_cast(g_guid))); + fixture->split->inst.kvp_data->set("gains-source", new KvpValue(const_cast(guid_copy(g_guid)))); g_assert (fixture->split->gains_split == NULL); fixture->split->gains = GAINS_STATUS_UNKNOWN; xaccSplitDetermineGainStatus (fixture->split); diff --git a/src/libqof/qof/test/test-kvp-frame.cpp b/src/libqof/qof/test/test-kvp-frame.cpp index 4f30dd8f5e..956f38b1b1 100644 --- a/src/libqof/qof/test/test-kvp-frame.cpp +++ b/src/libqof/qof/test/test-kvp-frame.cpp @@ -179,6 +179,7 @@ TEST_F (KvpFrameTest, GetSlotPath) EXPECT_EQ (nullptr, t_root.set(path2, v2)); EXPECT_EQ (v1, t_root.get_slot(path1)); EXPECT_EQ (nullptr, t_root.get_slot(path2)); + t_root.set_path(path1, nullptr); t_root.set_path(path3, v1); EXPECT_EQ (v1, t_root.get_slot(path3a)); }