libpurple 32535:a97104490e3e: Patch from fain: check whether the...

commits at adium.im commits at adium.im
Wed Oct 23 14:26:31 UTC 2013


details:	http://hg.adium.im/libpurple/rev/a97104490e3e
revision:	32535:a97104490e3e
branch:		adium-1.5.x
author:		Thijs Alkemade <me at thijsalkema.de>
date:		Wed Oct 23 16:22:26 2013 +0200

Patch from fain: check whether the passed arguments are equal to the current values in the setters of ft.c before freeing them. This should fix crashes when receiving file transfers.

Refs #15755

diffs (66 lines):

diff -r c8e809dffa1d -r a97104490e3e libpurple/ft.c
--- a/libpurple/ft.c	Thu Feb 21 23:07:08 2013 +0100
+++ b/libpurple/ft.c	Wed Oct 23 16:22:26 2013 +0200
@@ -914,9 +914,10 @@
 purple_xfer_set_message(PurpleXfer *xfer, const char *message)
 {
 	g_return_if_fail(xfer != NULL);
-
-	g_free(xfer->message);
-	xfer->message = g_strdup(message);
+	if (message != xfer->message) {
+		g_free(xfer->message);
+		xfer->message = g_strdup(message);
+	}
 }
 
 void
@@ -924,8 +925,10 @@
 {
 	g_return_if_fail(xfer != NULL);
 
-	g_free(xfer->filename);
-	xfer->filename = g_strdup(filename);
+	if (filename != xfer->filename) {
+		g_free(xfer->filename);
+		xfer->filename = g_strdup(filename);
+	}
 }
 
 void
@@ -933,8 +936,10 @@
 {
 	g_return_if_fail(xfer != NULL);
 
-	g_free(xfer->local_filename);
-	xfer->local_filename = g_strdup(filename);
+	if (filename != xfer->local_filename) {
+		g_free(xfer->local_filename);
+		xfer->local_filename = g_strdup(filename);
+	}
 }
 
 void
@@ -1679,8 +1684,9 @@
 {
 	PurpleXferPrivData *priv = g_hash_table_lookup(xfers_data, xfer);
 
-	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);
@@ -1691,6 +1697,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




More information about the commits mailing list