« Return to Thread: [rfc][icedtea-web] Fix 2 memory leaks in C++ side of icedtea-web plugin

[rfc][icedtea-web] Fix 2 memory leaks in C++ side of icedtea-web plugin

by Adam Domurad :: Rate this Message:

| View in Thread

This patch fixes two memory leaks in the C++ side of the plugin, and
removes a misleading (ie, wrong) comment.

The g_strsplit was stumbled on, and then searching for (alloc\(|free\()
was fairly good at highlighting malloc/free pairs (of which one a free
was missing.)

ChangeLog:
2012-06-15  Adam Domurad  <adomurad@...>

        Fixed two memory leaks
        * plugin/icedteanp/IcedTeaNPPlugin.cc
        (consume_message): Call to g_strsplit matched with call to g_strfreev.
        * plugin/icedteanp/IcedTeaPluginUtils.cc
        (post): Removed copy of string, which assumed consumer freed string
        (which was not true and not always possible)


[memleak-fix.patch]

diff --git a/plugin/icedteanp/IcedTeaNPPlugin.cc b/plugin/icedteanp/IcedTeaNPPlugin.cc
--- a/plugin/icedteanp/IcedTeaNPPlugin.cc
+++ b/plugin/icedteanp/IcedTeaNPPlugin.cc
@@ -1303,11 +1303,14 @@ void consume_message(gchar* message) {
         g_free(cookie_info);
         cookie_info = NULL;
       }
+      g_strfreev (parts);
+      parts = NULL;
     }
   else
     {
         g_print ("  Unable to handle message: %s\n", message);
     }
+
 }
 
 void get_instance_from_id(int id, NPP& instance)
diff --git a/plugin/icedteanp/IcedTeaPluginUtils.cc b/plugin/icedteanp/IcedTeaPluginUtils.cc
--- a/plugin/icedteanp/IcedTeaPluginUtils.cc
+++ b/plugin/icedteanp/IcedTeaPluginUtils.cc
@@ -1124,27 +1124,23 @@ MessageBus::unSubscribe(BusSubscriber* b
 void
 MessageBus::post(const char* message)
 {
- char* msg = (char*) malloc(sizeof(char)*strlen(message) + 1);
  bool message_consumed = false;
 
- // consumer frees this memory
- strcpy(msg, message);
-
  PLUGIN_DEBUG("Trying to lock %p...\n", &msg_queue_mutex);
  pthread_mutex_lock(&subscriber_mutex);
 
-    PLUGIN_DEBUG("Message %s received on bus. Notifying subscribers.\n", msg);
+    PLUGIN_DEBUG("Message %s received on bus. Notifying subscribers.\n", message);
 
     std::list<BusSubscriber*>::const_iterator i;
     for( i = subscribers.begin(); i != subscribers.end() && !message_consumed; ++i ) {
-     PLUGIN_DEBUG("Notifying subscriber %p of %s\n", *i, msg);
-     message_consumed = ((BusSubscriber*) *i)->newMessageOnBus(msg);
+     PLUGIN_DEBUG("Notifying subscriber %p of %s\n", *i, message);
+     message_consumed = ((BusSubscriber*) *i)->newMessageOnBus(message);
     }
 
     pthread_mutex_unlock(&subscriber_mutex);
 
     if (!message_consumed)
-     PLUGIN_DEBUG("Warning: No consumer found for message %s\n", msg);
+     PLUGIN_DEBUG("Warning: No consumer found for message %s\n", message);
 
     PLUGIN_DEBUG("%p unlocked...\n", &msg_queue_mutex);
 }

 « Return to Thread: [rfc][icedtea-web] Fix 2 memory leaks in C++ side of icedtea-web plugin