From 8ac3ab6065d79b3245f3e7ddae680f2df4cbb6fd Mon Sep 17 00:00:00 2001 From: Richard Cohen Date: Thu, 6 Jul 2023 17:01:34 +0100 Subject: [PATCH 1/2] Valgrind: fix "definitely lost" memory on error path - test-tokenizer ==54518== 147 (16 direct, 131 indirect) bytes in 1 blocks are definitely lost in loss record 246 of 267 ==54518== at 0x4843828: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==54518== by 0x6349948: g_malloc (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1) ==54518== by 0x6364C4C: g_slice_alloc0 (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1) ==54518== by 0x632E2EB: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1) ==54518== by 0x632E580: g_error_new_literal (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1) ==54518== by 0x632E64B: g_set_error_literal (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1) ==54518== by 0x632F3DB: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1) ==54518== by 0x632F9B7: g_file_get_contents (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1) ==54518== by 0x49E5E35: GncTokenizer::load_file(std::__cxx11::basic_string, std::allocator > const&) (gnc-tokenizer.cpp:51) ==54518== by 0x49F27A3: GncFwTokenizer::load_file(std::__cxx11::basic_string, std::allocator > const&) (gnc-tokenizer-fw.cpp:116) ==54518== by 0x1920A9: GncTokenizerTest_load_file_nonexisting_Test::TestBody() (test-tokenizer.cpp:93) --- gnucash/import-export/csv-imp/gnc-tokenizer.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/gnucash/import-export/csv-imp/gnc-tokenizer.cpp b/gnucash/import-export/csv-imp/gnc-tokenizer.cpp index d14ead25ba..5c1e054382 100644 --- a/gnucash/import-export/csv-imp/gnc-tokenizer.cpp +++ b/gnucash/import-export/csv-imp/gnc-tokenizer.cpp @@ -49,7 +49,11 @@ GncTokenizer::load_file(const std::string& path) GError *error = nullptr; if (!g_file_get_contents(path.c_str(), &raw_contents, &raw_length, &error)) - throw std::ifstream::failure(error->message); + { + std::string msg {error->message}; + g_error_free (error); + throw std::ifstream::failure {msg}; + } m_raw_contents = raw_contents; g_free(raw_contents); From 1943caee5591d2dee6f68c06f83210333f0dac5b Mon Sep 17 00:00:00 2001 From: Richard Cohen Date: Wed, 5 Jul 2023 17:33:26 +0100 Subject: [PATCH 2/2] Fix memory leak on error path in text_to_dom_tree() --- libgnucash/backend/xml/sixtp-dom-generators.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libgnucash/backend/xml/sixtp-dom-generators.cpp b/libgnucash/backend/xml/sixtp-dom-generators.cpp index 3a90aae72e..fca3563bbc 100644 --- a/libgnucash/backend/xml/sixtp-dom-generators.cpp +++ b/libgnucash/backend/xml/sixtp-dom-generators.cpp @@ -46,14 +46,16 @@ boolean_to_dom_tree (const char* tag, gboolean val) xmlNodePtr text_to_dom_tree (const char* tag, const char* str) { - xmlNodePtr result; - gchar* newstr = g_strdup (str); g_return_val_if_fail (tag, NULL); g_return_val_if_fail (str, NULL); - result = xmlNewNode (NULL, BAD_CAST tag); + + xmlNodePtr result = xmlNewNode (NULL, BAD_CAST tag); g_return_val_if_fail (result, NULL); + + gchar* newstr = g_strdup (str); xmlNodeAddContent (result, checked_char_cast (newstr)); g_free (newstr); + return result; }