libpurple/protocols/msn/p2p.c

changeset 31759
23d8a2af70d7
parent 31523
3a58442e7b62
child 31761
de2ccb87bfe0
--- a/libpurple/protocols/msn/p2p.c	Thu May 05 07:21:14 2011 +0000
+++ b/libpurple/protocols/msn/p2p.c	Thu May 05 21:49:21 2011 +0000
@@ -204,41 +204,43 @@
 
 		case MSN_P2P_VERSION_TWO: {
 			MsnP2Pv2Header *header = &info->header.v2;
+			char *header_wire = NULL;
+			char *data_header_wire = NULL;
 
 			if (header->header_tlv != NULL)
-				header->header_len = msn_tlvlist_size(header->header_tlv) + 8;
+				header_wire = msn_tlvlist_write(header->header_tlv, (size_t *)&header->header_len);
 			else
-				header->header_len = 8;
+				header->header_len = 0;
 
 			if (header->data_tlv != NULL)
-				header->data_header_len = msn_tlvlist_size(header->data_tlv) + 8;
+				data_header_wire = msn_tlvlist_write(header->data_tlv, (size_t *)&header->data_header_len);
 			else
-				header->data_header_len = 8;
+				header->data_header_len = 0;
 
-			tmp = wire = g_new(char, header->header_len + header->data_header_len);
+			tmp = wire = g_new(char, 16 + header->header_len + header->data_header_len);
 
-			msn_push8(tmp, header->header_len);
+			msn_push8(tmp, header->header_len + 8);
 			msn_push8(tmp, header->opcode);
-			msn_push16be(tmp, header->data_header_len + header->message_len);
+			msn_push16be(tmp, header->data_header_len + 8 + header->message_len);
 			msn_push32be(tmp, header->base_id);
 
-			if (header->header_tlv != NULL) {
-				msn_tlvlist_write(tmp, header->header_len - 8, header->header_tlv);
-				tmp += header->header_len - 8;
+			if (header_wire != NULL) {
+				memcpy(tmp, header_wire, header->header_len);
+				tmp += header->header_len;
 			}
 
-			msn_push8(tmp, header->data_header_len);
+			msn_push8(tmp, header->data_header_len + 8);
 			msn_push8(tmp, header->data_tf);
 			msn_push16be(tmp, header->package_number);
 			msn_push32be(tmp, header->session_id);
 
-			if (header->data_tlv != NULL) {
-				msn_tlvlist_write(tmp, header->data_header_len - 8, header->data_tlv);
-				tmp += header->data_header_len - 8;
+			if (data_header_wire != NULL) {
+				memcpy(tmp, data_header_wire, header->data_header_len);
+				tmp += header->data_header_len;
 			}
 
 			if (len)
-				*len = header->header_len + header->data_header_len;
+				*len = header->header_len + header->data_header_len + 16;
 
 			break;
 		}
@@ -248,7 +250,6 @@
 	}
 
 	return wire;
-
 }
 
 size_t

mercurial