changeset 31347:4bc5b483699e

first can be NULL here, obviously, We don't want any NULL-pointer dereferences.
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Sat, 06 Nov 2010 02:35:40 +0000
parents bc85e62fdb19
children b09ec659a9f5
files libpurple/protocols/msn/cmdproc.c
diffstat 1 files changed, 29 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/libpurple/protocols/msn/cmdproc.c	Thu Nov 04 05:00:05 2010 +0000
+++ b/libpurple/protocols/msn/cmdproc.c	Sat Nov 06 02:35:40 2010 +0000
@@ -211,37 +211,39 @@
 
 				MsnMessage *first = g_hash_table_lookup(cmdproc->multiparts, message_id);
 				chunk = strtol(chunk_text, NULL, 10);
-				if (first == NULL) {
+				if (first != NULL) {
+					if (first->received_chunks != chunk) {
+						/*
+						 * We received an out of order chunk number (i.e. not the
+						 * next one in the sequence).  Not sure if this can happen
+						 * legitimately, but we definitely don't handle it right
+						 * now.
+						 */
+						g_hash_table_remove(cmdproc->multiparts, message_id);
+						return;
+					}
+
+					/* Chunk is from 1 to total-1 (doesn't count first one) */
+					purple_debug_info("msn", "Received chunk %d of %d, message_id: '%s'\n",
+							chunk + 1, first->total_chunks, message_id);
+					first->body = g_realloc(first->body, first->body_len + msg->body_len);
+					memcpy(first->body + first->body_len, msg->body, msg->body_len);
+					first->body_len += msg->body_len;
+					first->received_chunks++;
+					if (first->received_chunks != first->total_chunks)
+						/* We're waiting for more chunks */
+						return;
+
+					/*
+					 * We have all the chunks for this message, great!  Send
+					 * it along... The caller takes care of freeing the old one.
+					 */
+					msg = first;
+				} else {
 					purple_debug_error("msn",
 					                   "Unable to find first chunk of message_id '%s' to correspond with chunk %d.\n",
 					                   message_id, chunk + 1);
-				} else if (first->received_chunks != chunk) {
-					/*
-					 * We received an out of order chunk number (i.e. not the
-					 * next one in the sequence).  Not sure if this can happen
-					 * legitimately, but we definitely don't handle it right
-					 * now.
-					 */
-					g_hash_table_remove(cmdproc->multiparts, message_id);
-					return;
 				}
-
-				/* Chunk is from 1 to total-1 (doesn't count first one) */
-				purple_debug_info("msn", "Received chunk %d of %d, message_id: '%s'\n",
-						chunk + 1, first->total_chunks, message_id);
-				first->body = g_realloc(first->body, first->body_len + msg->body_len);
-				memcpy(first->body + first->body_len, msg->body, msg->body_len);
-				first->body_len += msg->body_len;
-				first->received_chunks++;
-				if (first->received_chunks != first->total_chunks)
-					/* We're waiting for more chunks */
-					return;
-
-				/*
-				 * We have all the chunks for this message, great!  Send
-				 * it along... The caller takes care of freeing the old one.
-				 */
-				msg = first;
 			} else {
 				purple_debug_error("msn", "Received MessageId '%s' with no chunk number!\n", message_id);
 			}