/pidgin/main: cf498d4b54bb: Update internal libgadu to 1.12.1

Tomasz Wasilczyk twasilczyk at pidgin.im
Sat May 9 08:54:15 EDT 2015


Changeset: cf498d4b54bb789c6e97aea88471b637c6a1f3a2
Author:	 Tomasz Wasilczyk <twasilczyk at pidgin.im>
Date:	 2015-05-09 14:54 +0200
Branch:	 release-2.x.y
URL: https://hg.pidgin.im/pidgin/main/rev/cf498d4b54bb

Description:

Update internal libgadu to 1.12.1

diffstat:

 ChangeLog                                 |     3 +
 libpurple/protocols/gg/lib/config.h       |     2 +-
 libpurple/protocols/gg/lib/dcc.c          |    11 +-
 libpurple/protocols/gg/lib/handlers.c     |    76 +-
 libpurple/protocols/gg/lib/libgadu.c      |     3 +-
 libpurple/protocols/gg/lib/packets.pb-c.c |   839 ++-
 libpurple/protocols/gg/lib/packets.pb-c.h |   106 +-
 libpurple/protocols/gg/lib/protobuf-c.c   |  5378 ++++++++++++++++------------
 libpurple/protocols/gg/lib/protobuf-c.h   |  1492 +++++--
 libpurple/protocols/gg/lib/protobuf.h     |     2 +-
 libpurple/protocols/gg/lib/protocol.h     |     6 +-
 libpurple/protocols/gg/lib/pubdir50.c     |     2 +-
 libpurple/protocols/gg/lib/sha1.c         |    12 +-
 13 files changed, 4713 insertions(+), 3219 deletions(-)

diffs (truncated from 10145 to 300 lines):

diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -10,6 +10,9 @@ version 2.10.12 (MM/DD/YY):
 		* SILC 1.1.12
 	* Remove support for Tcl plugins
 
+	Gadu-Gadu:
+	* Updated internal libgadu to version 1.12.1.
+
 version 2.10.11 (11/23/14):
 	General:
 	* Fix handling of Self-Signed SSL/TLS Certificates when using the NSS
diff --git a/libpurple/protocols/gg/lib/config.h b/libpurple/protocols/gg/lib/config.h
--- a/libpurple/protocols/gg/lib/config.h
+++ b/libpurple/protocols/gg/lib/config.h
@@ -5,7 +5,7 @@
 /* libpurple's config */
 #include <config.h>
 
-#define GG_LIBGADU_VERSION "1.12.0"
+#define GG_LIBGADU_VERSION "1.12.1"
 
 /* Defined if libgadu was compiled for bigendian machine. */
 #undef GG_CONFIG_BIGENDIAN
diff --git a/libpurple/protocols/gg/lib/dcc.c b/libpurple/protocols/gg/lib/dcc.c
--- a/libpurple/protocols/gg/lib/dcc.c
+++ b/libpurple/protocols/gg/lib/dcc.c
@@ -650,6 +650,7 @@ struct gg_event *gg_dcc_watch_fd(struct 
 		unsigned int utmp;
 		socklen_t res_size = sizeof(res);
 		char buf[1024], ack[] = "UDAG";
+		void *tmp_buf;
 
 		struct gg_dcc_file_info_packet {
 			struct gg_dcc_big_packet big;
@@ -799,11 +800,14 @@ struct gg_event *gg_dcc_watch_fd(struct 
 				h->state = GG_STATE_READING_FILE_HEADER;
 				h->chunk_size = sizeof(big_pkt);
 				h->chunk_offset = 0;
-				if (!(h->chunk_buf = malloc(sizeof(big_pkt)))) {
+				h->chunk_buf = NULL;
+				tmp_buf = malloc(sizeof(big_pkt));
+				if (!tmp_buf) {
 					gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() out of memory\n");
 					free(e);
 					return NULL;
 				}
+				h->chunk_buf = tmp_buf;
 				h->check = GG_CHECK_READ;
 				h->timeout = GG_DEFAULT_TIMEOUT;
 
@@ -1342,11 +1346,14 @@ struct gg_event *gg_dcc_watch_fd(struct 
 					h->timeout = GG_DEFAULT_TIMEOUT;
 					h->chunk_offset = 0;
 					h->chunk_size = sizeof(big_pkt);
-					if (!(h->chunk_buf = malloc(sizeof(big_pkt)))) {
+					h->chunk_buf = NULL;
+					tmp_buf = malloc(sizeof(big_pkt));
+					if (!tmp_buf) {
 						gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() out of memory\n");
 						free(e);
 						return NULL;
 					}
+					h->chunk_buf = tmp_buf;
 				} else {
 					h->state = GG_STATE_GETTING_FILE;
 					h->timeout = GG_DCC_TIMEOUT_GET;
diff --git a/libpurple/protocols/gg/lib/handlers.c b/libpurple/protocols/gg/lib/handlers.c
--- a/libpurple/protocols/gg/lib/handlers.c
+++ b/libpurple/protocols/gg/lib/handlers.c
@@ -48,6 +48,10 @@
 #include <string.h>
 #include <time.h>
 
+/* Ograniczenie długości listy kontaktów
+ * z pakietów GG_USERLIST_REPLY do 10MB. */
+#define GG_USERLIST_REPLY_MAX_LENGTH 10485760
+
 /**
  * \internal Struktura opisujÄ
ca funkcję obsługi pakietu.
  */
@@ -631,6 +635,13 @@ static int gg_session_handle_userlist_re
 		gg_debug_session(gs, GG_DEBUG_MISC, "userlist_reply=%p, len=%"
 			GG_SIZE_FMT "\n", gs->userlist_reply, len);
 
+		if (reply_len + len > GG_USERLIST_REPLY_MAX_LENGTH) {
+			gg_debug_session(gs, GG_DEBUG_MISC,
+				"// gg_session_handle_userlist_reply() "
+				"too many userlist replies\n");
+			return -1;
+		}
+
 		tmp = realloc(gs->userlist_reply, reply_len + len);
 
 		if (tmp == NULL) {
@@ -1737,7 +1748,7 @@ static int gg_session_handle_notify_repl
 	while (length >= sizeof(struct gg_notify_reply80)) {
 		uin_t uin = gg_fix32(n->uin);
 		int descr_len;
-		char *tmp;
+		void *tmp;
 
 		ge->event.notify60[i].uin = uin;
 		ge->event.notify60[i].status = gg_fix32(n->status);
@@ -1782,7 +1793,7 @@ static int gg_session_handle_notify_repl
 			return -1;
 		}
 
-		ge->event.notify60 = (void*) tmp;
+		ge->event.notify60 = tmp;
 		ge->event.notify60[++i].uin = 0;
 	}
 
@@ -1814,7 +1825,7 @@ static int gg_session_handle_notify_repl
 
 	while (length >= sizeof(struct gg_notify_reply77)) {
 		uin_t uin = gg_fix32(n->uin);
-		char *tmp;
+		void *tmp;
 
 		ge->event.notify60[i].uin = uin & 0x00ffffff;
 		ge->event.notify60[i].status = n->status;
@@ -1867,7 +1878,7 @@ static int gg_session_handle_notify_repl
 			return -1;
 		}
 
-		ge->event.notify60 = (void*) tmp;
+		ge->event.notify60 = tmp;
 		ge->event.notify60[++i].uin = 0;
 	}
 
@@ -1899,7 +1910,7 @@ static int gg_session_handle_notify_repl
 
 	while (length >= sizeof(struct gg_notify_reply60)) {
 		uin_t uin = gg_fix32(n->uin);
-		char *tmp;
+		void *tmp;
 
 		ge->event.notify60[i].uin = uin & 0x00ffffff;
 		ge->event.notify60[i].status = n->status;
@@ -1954,7 +1965,7 @@ static int gg_session_handle_notify_repl
 			return -1;
 		}
 
-		ge->event.notify60 = (void*) tmp;
+		ge->event.notify60 = tmp;
 		ge->event.notify60[++i].uin = 0;
 	}
 
@@ -2360,18 +2371,20 @@ static int gg_session_handle_imtoken(str
 static int gg_session_handle_pong_110(struct gg_session *gs, uint32_t type,
 	const char *ptr, size_t len, struct gg_event *ge)
 {
-	const struct gg_pong110 *pong = (const struct gg_pong110*)ptr;
-	uint32_t server_time;
+	GG110Pong *msg = gg110_pong__unpack(NULL, len, (uint8_t*)ptr);
+
+	if (!GG_PROTOBUF_VALID(gs, "GG110Pong", msg))
+		return -1;
 
 	gg_debug_session(gs, GG_DEBUG_MISC, "// gg_watch_fd_connected() "
 		"received pong110\n");
 
-	server_time = gg_fix32(pong->time);
-
 	ge->type = GG_EVENT_PONG110;
-	ge->event.pong110.time = server_time;
-
-	gg_sync_time(gs, server_time);
+	ge->event.pong110.time = msg->server_time;
+
+	gg_sync_time(gs, msg->server_time);
+
+	gg110_pong__free_unpacked(msg, NULL);
 
 	return 0;
 }
@@ -2653,7 +2666,12 @@ static int gg_session_handle_transfer_in
 	if (!GG_PROTOBUF_VALID(gs, "GG112TransferInfo", msg))
 		return -1;
 
-	gg_protobuf_expected(gs, "GG112TransferInfo.dummy1", msg->dummy1, 6);
+	/* see packets.proto */
+	if (msg->dummy1 != 5 && msg->dummy1 != 6) {
+		gg_debug_session(gs, GG_DEBUG_MISC | GG_DEBUG_WARNING,
+			"// gg_session_handle_transfer_info: "
+			"unknown dummy1 value: %d\n", msg->dummy1);
+	}
 
 	if (GG_PROTOBUF_VALID(gs, "GG112TransferInfoUin", msg->peer)) {
 		gg_protobuf_expected(gs, "GG112TransferInfoUin.dummy1",
@@ -2682,7 +2700,7 @@ static int gg_session_handle_transfer_in
 			kvp->key, kvp->value);
 	}
 
-	if (GG_PROTOBUF_VALID(gs, "GG112TransferInfoFile", msg->file)) {
+	if (msg->file && GG_PROTOBUF_VALID(gs, "GG112TransferInfoFile", msg->file)) {
 		GG112TransferInfoFile *file = msg->file;
 		gg_debug_session(gs, GG_DEBUG_MISC,
 			"// gg_session_handle_transfer_info file: "
@@ -2700,6 +2718,29 @@ static int gg_session_handle_transfer_in
 	return succ ? 0 : -1;
 }
 
+static int gg_session_handle_magic_notification(struct gg_session *gs, uint32_t type,
+	const char *ptr, size_t len, struct gg_event *ge)
+{
+	GG110MagicNotification *msg = gg110_magic_notification__unpack(NULL, len, (uint8_t*)ptr);
+	int succ = 1;
+
+	if (!GG_PROTOBUF_VALID(gs, "GG110MagicNotification", msg))
+		return -1;
+
+	gg_debug_session(gs, GG_DEBUG_MISC,
+		"// gg_session_handle_magic_notification \n");
+
+	gg_protobuf_expected(gs, "GG110MagicNotification.dummy1", msg->dummy1, 2);
+	gg_protobuf_expected(gs, "GG110MagicNotification.dummy2", msg->dummy2, 1);
+	gg_protobuf_expected(gs, "GG110MagicNotification.dummy3", msg->dummy3, 1);
+
+	succ = (gg_ack_110(gs, GG110_ACK__TYPE__MAGIC_NOTIFICATION, msg->seq, ge) == 0);
+
+	gg110_magic_notification__free_unpacked(msg, NULL);
+
+	return succ ? 0 : -1;
+}
+
 /**
  * \internal Tablica obsługiwanych pakietów
  */
@@ -2749,7 +2790,7 @@ static const gg_packet_handler_t handler
 	{ GG_USERLIST100_VERSION, GG_STATE_CONNECTED, sizeof(struct gg_userlist100_version), gg_session_handle_userlist_100_version },
 	{ GG_USERLIST100_REPLY, GG_STATE_CONNECTED, sizeof(struct gg_userlist100_reply), gg_session_handle_userlist_100_reply },
 	{ GG_IMTOKEN, GG_STATE_CONNECTED, 0, gg_session_handle_imtoken },
-	{ GG_PONG110, GG_STATE_CONNECTED, sizeof(struct gg_pong110), gg_session_handle_pong_110 },
+	{ GG_PONG110, GG_STATE_CONNECTED, 0, gg_session_handle_pong_110 },
 	{ GG_CHAT_INFO, GG_STATE_CONNECTED, 0, gg_session_handle_chat_info },
 	{ GG_CHAT_INFO_UPDATE, GG_STATE_CONNECTED, 0, gg_session_handle_chat_info_update },
 	{ GG_CHAT_CREATED, GG_STATE_CONNECTED, sizeof(struct gg_chat_created), gg_session_handle_chat_created },
@@ -2760,7 +2801,8 @@ static const gg_packet_handler_t handler
 	{ GG_OPTIONS, GG_STATE_CONNECTED, 0, gg_session_handle_options },
 	{ GG_ACCESS_INFO, GG_STATE_CONNECTED, 0, gg_session_handle_access_info },
 	{ GG_UIN_INFO, GG_STATE_CONNECTED, 0, gg_session_handle_uin_info },
-	{ GG_TRANSFER_INFO, GG_STATE_CONNECTED, 0, gg_session_handle_transfer_info }
+	{ GG_TRANSFER_INFO, GG_STATE_CONNECTED, 0, gg_session_handle_transfer_info },
+	{ GG_MAGIC_NOTIFICATION, GG_STATE_CONNECTED, 0, gg_session_handle_magic_notification }
 	/* style:maxlinelength:end-ignore */
 };
 
diff --git a/libpurple/protocols/gg/lib/libgadu.c b/libpurple/protocols/gg/lib/libgadu.c
--- a/libpurple/protocols/gg/lib/libgadu.c
+++ b/libpurple/protocols/gg/lib/libgadu.c
@@ -2123,7 +2123,6 @@ int gg_image_reply(struct gg_session *se
 	struct gg_send_msg s;
 	const char *tmp;
 	char buf[1910];
-	int res = -1;
 	gg_imgout_queue_t *queue = NULL, *queue_end = NULL;
 
 	gg_debug_session(sess, GG_DEBUG_FUNCTION, "** gg_image_reply(%p, %d, "
@@ -2212,7 +2211,7 @@ int gg_image_reply(struct gg_session *se
 	}
 	gg_image_sendout(sess);
 
-	return res;
+	return 0;
 }
 
 void gg_image_sendout(struct gg_session *sess)
diff --git a/libpurple/protocols/gg/lib/packets.pb-c.c b/libpurple/protocols/gg/lib/packets.pb-c.c
--- a/libpurple/protocols/gg/lib/packets.pb-c.c
+++ b/libpurple/protocols/gg/lib/packets.pb-c.c
@@ -1,8 +1,9 @@
 /* Generated by the protocol buffer compiler.  DO NOT EDIT! */
+/* Generated from: packets.proto */
 
 /* Do not generate deprecated warnings for self */
-#ifndef PROTOBUF_C_NO_DEPRECATED
-#define PROTOBUF_C_NO_DEPRECATED
+#ifndef PROTOBUF_C__NO_DEPRECATED
+#define PROTOBUF_C__NO_DEPRECATED
 #endif
 
 #include "packets.pb-c.h"
@@ -15,21 +16,21 @@ void   gg110_login_ok__init
 size_t gg110_login_ok__get_packed_size
                      (const GG110LoginOK *message)
 {
-  PROTOBUF_C_ASSERT (message->base.descriptor == &gg110_login_ok__descriptor);
+  assert(message->base.descriptor == &gg110_login_ok__descriptor);
   return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message));
 }
 size_t gg110_login_ok__pack
                      (const GG110LoginOK *message,
                       uint8_t       *out)
 {
-  PROTOBUF_C_ASSERT (message->base.descriptor == &gg110_login_ok__descriptor);
+  assert(message->base.descriptor == &gg110_login_ok__descriptor);
   return protobuf_c_message_pack ((const ProtobufCMessage*)message, out);



More information about the Commits mailing list