--- a/libpurple/xfer.c Mon Jun 12 01:00:04 2017 +0000 +++ b/libpurple/xfer.c Mon Jun 12 17:48:37 2017 -0300 @@ -977,8 +977,10 @@ g_return_if_fail(priv != NULL); - g_free(priv->message); - priv->message = g_strdup(message); + if (message != priv->message) { + g_free(priv->message); + priv->message = g_strdup(message); + } g_object_notify_by_pspec(G_OBJECT(xfer), properties[PROP_MESSAGE]); } @@ -1000,8 +1002,10 @@ g_return_if_fail(priv != NULL); - g_free(priv->filename); - priv->filename = g_strdup(filename); + if (filename != priv->filename) { + g_free(priv->filename); + priv->filename = g_strdup(filename); + } g_object_notify_by_pspec(G_OBJECT(xfer), properties[PROP_FILENAME]); } @@ -1013,8 +1017,10 @@ g_return_if_fail(priv != NULL); - g_free(priv->local_filename); - priv->local_filename = g_strdup(filename); + if (filename != priv->local_filename) { + g_free(priv->local_filename); + priv->local_filename = g_strdup(filename); + } g_object_notify_by_pspec(G_OBJECT(xfer), properties[PROP_LOCAL_FILENAME]); } @@ -1917,8 +1923,9 @@ g_return_if_fail(priv != NULL); - g_free(priv->thumbnail_data); - g_free(priv->thumbnail_mimetype); + /* Hold onto these in case they are equal to passed-in pointers */ + gpointer *old_thumbnail_data = priv->thumbnail_data; + const gchar *old_mimetype = priv->thumbnail_mimetype; if (thumbnail && size > 0) { priv->thumbnail_data = g_memdup(thumbnail, size); @@ -1929,6 +1936,10 @@ priv->thumbnail_size = 0; priv->thumbnail_mimetype = NULL; } + + /* Now it's safe to free the pointers */ + g_free(old_thumbnail_data); + g_free(old_mimetype); } void