comparison libpurple/protocols/simple/sipmsg.c @ 24370:b4964c3f5f7c

Fix a potential leak, thanks to "KuSh". Fixes #7465.
author Daniel Atallah <daniel.atallah@gmail.com>
date Fri, 07 Nov 2008 02:49:23 +0000
parents 189abce087ab
children ff8a91b1f795
comparison
equal deleted inserted replaced
24369:f4cb55854e87 24370:b4964c3f5f7c
54 return smsg; 54 return smsg;
55 } 55 }
56 56
57 struct sipmsg *sipmsg_parse_header(const gchar *header) { 57 struct sipmsg *sipmsg_parse_header(const gchar *header) {
58 struct sipmsg *msg = g_new0(struct sipmsg,1); 58 struct sipmsg *msg = g_new0(struct sipmsg,1);
59 gchar **lines = g_strsplit(header,"\r\n",0); 59 gchar **parts, **lines = g_strsplit(header,"\r\n",0);
60 gchar **parts; 60 gchar *dummy, *dummy2, *tmp;
61 gchar *dummy;
62 gchar *dummy2;
63 gchar *tmp;
64 const gchar *tmp2; 61 const gchar *tmp2;
65 int i=1; 62 int i = 1;
66 if(!lines[0]) return NULL; 63
64 if(!lines[0]) {
65 g_strfreev(lines);
66 g_free(msg);
67 return NULL;
68 }
69
67 parts = g_strsplit(lines[0], " ", 3); 70 parts = g_strsplit(lines[0], " ", 3);
68 if(!parts[0] || !parts[1] || !parts[2]) { 71 if(!parts[0] || !parts[1] || !parts[2]) {
69 g_strfreev(parts); 72 g_strfreev(parts);
70 g_strfreev(lines); 73 g_strfreev(lines);
71 g_free(msg); 74 g_free(msg);
72 return NULL; 75 return NULL;
73 } 76 }
77
74 if(strstr(parts[0],"SIP")) { /* numeric response */ 78 if(strstr(parts[0],"SIP")) { /* numeric response */
75 msg->method = g_strdup(parts[2]); 79 msg->method = g_strdup(parts[2]);
76 msg->response = strtol(parts[1],NULL,10); 80 msg->response = strtol(parts[1],NULL,10);
77 } else { /* request */ 81 } else { /* request */
78 msg->method = g_strdup(parts[0]); 82 msg->method = g_strdup(parts[0]);
79 msg->target = g_strdup(parts[1]); 83 msg->target = g_strdup(parts[1]);
80 msg->response = 0; 84 msg->response = 0;
81 } 85 }
82 g_strfreev(parts); 86 g_strfreev(parts);
87
83 for(i=1; lines[i] && strlen(lines[i])>2; i++) { 88 for(i=1; lines[i] && strlen(lines[i])>2; i++) {
84 parts = g_strsplit(lines[i], ":", 2); 89 parts = g_strsplit(lines[i], ":", 2);
85 if(!parts[0] || !parts[1]) { 90 if(!parts[0] || !parts[1]) {
86 g_strfreev(parts); 91 g_strfreev(parts);
87 g_strfreev(lines); 92 g_strfreev(lines);
102 } 107 }
103 sipmsg_add_header(msg, parts[0], dummy2); 108 sipmsg_add_header(msg, parts[0], dummy2);
104 g_strfreev(parts); 109 g_strfreev(parts);
105 } 110 }
106 g_strfreev(lines); 111 g_strfreev(lines);
112
107 tmp2 = sipmsg_find_header(msg, "Content-Length"); 113 tmp2 = sipmsg_find_header(msg, "Content-Length");
108 if (tmp2 != NULL) 114 if (tmp2 != NULL)
109 msg->bodylen = strtol(tmp2, NULL, 10); 115 msg->bodylen = strtol(tmp2, NULL, 10);
116
110 if(msg->response) { 117 if(msg->response) {
111 tmp2 = sipmsg_find_header(msg, "CSeq"); 118 tmp2 = sipmsg_find_header(msg, "CSeq");
112 if(!tmp2) { 119 if(!tmp2) {
113 /* SHOULD NOT HAPPEN */ 120 /* SHOULD NOT HAPPEN */
114 msg->method = 0; 121 msg->method = 0;
116 parts = g_strsplit(tmp2, " ", 2); 123 parts = g_strsplit(tmp2, " ", 2);
117 msg->method = g_strdup(parts[1]); 124 msg->method = g_strdup(parts[1]);
118 g_strfreev(parts); 125 g_strfreev(parts);
119 } 126 }
120 } 127 }
128
121 return msg; 129 return msg;
122 } 130 }
123 131
124 void sipmsg_print(const struct sipmsg *msg) { 132 void sipmsg_print(const struct sipmsg *msg) {
125 GSList *cur; 133 GSList *cur;