Correctly remove expired Resources
authorMark Ryan <mark.d.ryan@intel.com>
Fri, 17 Aug 2012 11:51:29 +0000 (13:51 +0200)
committerJens Georg <mail@jensge.org>
Sat, 18 Aug 2012 10:00:46 +0000 (12:00 +0200)
Fixes a crash in GUPnP.  In the current code, Resource objects are not
always correctly removed from the resource_browser->priv->resources
hash table when they expire.  This can lead to a crash in GUPnP when
the application tries to destroy its context manager.

https://bugzilla.gnome.org/show_bug.cgi?id=682099

libgssdp/gssdp-resource-browser.c

index d68ca8b..f80de4a 100644 (file)
@@ -591,6 +591,7 @@ resource_expire (gpointer user_data)
         GSSDPResourceBrowser *resource_browser;
         Resource *resource;
         char *usn;
+        char *canonical_usn;
 
         resource = user_data;
         resource_browser = resource->resource_browser;
@@ -601,13 +602,24 @@ resource_expire (gpointer user_data)
         usn = resource->usn;
         resource->usn = NULL;
 
-        g_hash_table_remove (resource->resource_browser->priv->resources, usn);
+        if (resource_browser->priv->version > 0) {
+                char *version;
+
+                version = g_strrstr (usn, ":");
+                canonical_usn = g_strndup (usn, version - usn);
+        } else {
+                canonical_usn = g_strdup (usn);
+        }
+
+        g_hash_table_remove (resource->resource_browser->priv->resources,
+                             canonical_usn);
 
         g_signal_emit (resource_browser,
                        signals[RESOURCE_UNAVAILABLE],
                        0,
                        usn);
         g_free (usn);
+        g_free (canonical_usn);
 
         return FALSE;
 }