[pan2] Fix error found by valgrind: 3, 175, 168 (192 direct, 3, 174, 976 indirect) bytes in 6 blocks are defini



commit 4c08134a55735589963b3a20ddca8c0b2acb56e4
Author: Olaf Seibert <rhialto falu nl>
Date:   Tue Mar 15 01:16:02 2016 +0100

    Fix error found by valgrind: 3,175,168 (192 direct, 3,174,976 indirect) bytes in 6 blocks are definitely 
lost in loss record 11,299 of 11,299
    
       at 0x4C2BBCF: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
       by 0x6D2F578: g_malloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.2)
       by 0x6D46762: g_slice_alloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.2)
       by 0x6D46DFD: g_slice_alloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.2)
       by 0x6AC0371: g_type_create_instance (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4600.2)
       by 0x6AA238A: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4600.2)
       by 0x6AA3C70: g_object_newv (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4600.2)
       by 0x790DDFD: g_mime_parser_new_with_stream (in /usr/lib/x86_64-linux-gnu/libgmime-2.6.so.0.620.0)
       by 0x549441: pan::mime::construct_message(_GMimeStream**, int, pan::GPGDecErr&) (mime-utils.cc:1145)
       by 0x5394EE: pan::ArticleCache::get_message(std::vector<pan::Quark, std::allocator<pan::Quark> > 
const&, pan::GPGDecErr&) const (article-cache.cc:433)
       by 0x47EE75: pan::BodyPane::set_article(pan::Article const&) (body-pane.cc:1344)
       by 0x4698F0: on_progress_finished (gui.cc:1005)
       by 0x4698F0: non-virtual thunk to pan::GUI::on_progress_finished(pan::Progress&, int) (gui.cc:1000)
       by 0x565C8A: fire_finished (progress.cc:50)
       by 0x565C8A: pan::Progress::set_finished(int) (progress.cc:150)
       by 0x50F8E5: pan::TaskArticle::update_work(pan::NNTP*) (task-article.cc:206)
       by 0x50F2AC: pan::TaskArticle::TaskArticle(pan::ServerRank const&, pan::GroupServer const&, 
pan::Article const&, pan::ArticleCache&, pan::ArticleRead&, pan::TaskArticle::ArticleActionType const&, 
pan::Progress::Listener*, pan::TaskArticle::SaveMode, pan::Quark const&, char const*, 
pan::TaskArticle::SaveOptions const&) (task-article.cc:162)
       by 0x469A67: pan::GUI::do_read_selected_article() (gui.cc:1023)
       by 0x6A9D014: g_closure_invoke (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4600.2)
       by 0x6AAF060: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4600.2)
       by 0x6AB7DFB: g_signal_emit_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4600.2)
       by 0x6AB812E: g_signal_emit (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4600.2)
    
    because the error is in a loop and could be run every time an article is loaded,
    the lost memory can be arbitrarily large.

 pan/usenet-utils/mime-utils.cc |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)
---
diff --git a/pan/usenet-utils/mime-utils.cc b/pan/usenet-utils/mime-utils.cc
index 923ac55..c4f9287 100644
--- a/pan/usenet-utils/mime-utils.cc
+++ b/pan/usenet-utils/mime-utils.cc
@@ -1134,16 +1134,17 @@ mime :: construct_message (GMimeStream    ** istreams,
     pan_return_val_if_fail (GMIME_IS_STREAM(istreams[i]), NULL);
 
   // build the GMimeMessages
-  GMimeParser * parser;// = g_mime_parser_new ();
   GMimeMessage ** messages = g_new (GMimeMessage*, qty);
 
   for (int i=0; i<qty; ++i) {
-    parser = g_mime_parser_new_with_stream (istreams[i]);
+    GMimeParser* parser = g_mime_parser_new_with_stream (istreams[i]);
     messages[i] = g_mime_parser_construct_message(parser);
     g_object_unref(parser);
     g_mime_stream_reset(istreams[i]);
     parser = g_mime_parser_new_with_stream (istreams[i]);
     GMimeObject* part = g_mime_parser_construct_part(parser);
+    g_object_unref (parser);
+    parser = NULL;
     GMimeContentType * type = g_mime_object_get_content_type (part);
     const bool multipart (GMIME_IS_MULTIPART_SIGNED(part) || GMIME_IS_MULTIPART_ENCRYPTED(part));
 #ifdef HAVE_GMIME_CRYPTO
@@ -1203,7 +1204,6 @@ mime :: construct_message (GMimeStream    ** istreams,
 
     g_object_unref (part);
   }
-  g_object_unref (parser);
 
   if (qty > 1) // fold multiparts together
   {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]