comparison libpurple/protocols/msn/slpmsg_part.c @ 31768:8cf9270acf4c

Add a maximum length when parsing the P2P wire data.
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Thu, 10 Mar 2011 05:00:17 +0000
parents 9562a7baa9e4
children eb1bbaae3427
comparison
equal deleted inserted replaced
31767:a01d958f7b26 31768:8cf9270acf4c
32 { 32 {
33 MsnSlpMessagePart *part; 33 MsnSlpMessagePart *part;
34 34
35 part = g_new0(MsnSlpMessagePart, 1); 35 part = g_new0(MsnSlpMessagePart, 1);
36 36
37 if (info) 37 part->info = info;
38 part->info = msn_p2p_info_dup(info);
39 38
40 part->ack_cb = msn_slpmsgpart_ack; 39 part->ack_cb = msn_slpmsgpart_ack;
41 part->nak_cb = msn_slpmsgpart_nak; 40 part->nak_cb = msn_slpmsgpart_nak;
42 41
43 return msn_slpmsgpart_ref(part); 42 return msn_slpmsgpart_ref(part);
44 } 43 }
45 44
46 MsnSlpMessagePart *msn_slpmsgpart_new_from_data(const char *data, size_t data_len) 45 MsnSlpMessagePart *msn_slpmsgpart_new_from_data(const char *data, size_t data_len)
47 { 46 {
48 MsnSlpMessagePart *part; 47 MsnSlpMessagePart *part;
48 MsnP2PInfo *info;
49 size_t len; 49 size_t len;
50 int body_len; 50 int body_len;
51 51
52 if (data_len < P2P_PACKET_HEADER_SIZE) { 52 info = msn_p2p_info_new(MSN_P2P_VERSION_ONE);
53
54 /* Extract the binary SLP header */
55 len = msn_p2p_header_from_wire(info, data, data_len);
56 if (len == 0) {
57 msn_p2p_info_free(info);
53 return NULL; 58 return NULL;
54 } 59 }
55
56 part = msn_slpmsgpart_new(NULL);
57 part->info = msn_p2p_info_new(MSN_P2P_VERSION_ONE);
58
59 /* Extract the binary SLP header */
60 len = msn_p2p_header_from_wire(part->info, data);
61 data += len; 60 data += len;
61 part = msn_slpmsgpart_new(info);
62 62
63 /* Extract the body */ 63 /* Extract the body */
64 body_len = data_len - len - P2P_PACKET_FOOTER_SIZE; 64 body_len = data_len - len - P2P_PACKET_FOOTER_SIZE;
65 /* msg->body_len = msg->msnslp_header.length; */ 65 /* msg->body_len = msg->msnslp_header.length; */
66 66