Mercurial > pidgin
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; |