comparison mcabber/src/jab_iq.c @ 1574:d8a016f76ff7

Fix segfaults when receiving malformed XEP-0146 packets
author franky@veqlargh.fs
date Tue, 20 Jan 2009 08:48:11 +0100
parents 3df441efb7c2
children 8e52ce94eee0
comparison
equal deleted inserted replaced
1564:4b6cfaa6898b 1574:d8a016f76ff7
1191 // priority like gossip and gajim do (misc) 1191 // priority like gossip and gajim do (misc)
1192 y = xmlnode_insert_tag(x, "field"); 1192 y = xmlnode_insert_tag(x, "field");
1193 xmlnode_put_attrib(y, "type", "text-multi"); 1193 xmlnode_put_attrib(y, "type", "text-multi");
1194 xmlnode_put_attrib(y, "var", "status-message"); 1194 xmlnode_put_attrib(y, "var", "status-message");
1195 xmlnode_put_attrib(y, "label", "Message"); 1195 xmlnode_put_attrib(y, "label", "Message");
1196 } else if (!strcmp(action, "cancel")) { 1196 } else if (action && !strcmp(action, "cancel")) {
1197 xmlnode_put_attrib(command, "status", "canceled"); 1197 xmlnode_put_attrib(command, "status", "canceled");
1198 } else { // (if sessionid and not canceled) 1198 } else { // (if sessionid and not canceled)
1199 y = xmlnode_get_tag(x, "x?xmlns=jabber:x:data"); 1199 y = xmlnode_get_tag(x, "x?xmlns=jabber:x:data");
1200 if (y) { 1200 if (y) {
1201 char *value, *message; 1201 char *value, *message;
1202 value = xmlnode_get_tag_data(xmlnode_get_tag(y, "field?var=status"), 1202 value = xmlnode_get_tag_data(xmlnode_get_tag(y, "field?var=status"),
1203 "value"); 1203 "value");
1204 message = xmlnode_get_tag_data(xmlnode_get_tag(y, 1204 message = xmlnode_get_tag_data(xmlnode_get_tag(y,
1205 "field?var=status-message"), "value"); 1205 "field?var=status-message"), "value");
1206 for (s = adhoc_status_list; !s->name || strcmp(s->name, value); s++); 1206 if (value) {
1207 if (s->name) { 1207 for (s = adhoc_status_list; s->name && strcmp(s->name, value); s++);
1208 char *status = g_strdup_printf("%s %s", s->status, 1208 if (s->name) {
1209 message ? message : ""); 1209 char *status = g_strdup_printf("%s %s", s->status,
1210 cmd_setstatus(NULL, status); 1210 message ? message : "");
1211 g_free(status); 1211 cmd_setstatus(NULL, status);
1212 xmlnode_put_attrib(command, "status", "completed"); 1212 g_free(status);
1213 xmlnode_put_attrib(iq, "type", "result"); 1213 xmlnode_put_attrib(command, "status", "completed");
1214 xmlnode_insert_dataform_result_message(command, 1214 xmlnode_put_attrib(iq, "type", "result");
1215 "Status has been changed"); 1215 xmlnode_insert_dataform_result_message(command,
1216 "Status has been changed");
1217 }
1216 } 1218 }
1217 } 1219 }
1218 } 1220 }
1219 if (sessionid) 1221 if (sessionid)
1220 xmlnode_put_attrib(command, "sessionid", sessionid); 1222 xmlnode_put_attrib(command, "sessionid", sessionid);
1293 xmlnode_put_attrib(field, "var", "groupchats"); 1295 xmlnode_put_attrib(field, "var", "groupchats");
1294 xmlnode_put_attrib(field, "label", "Groupchats: "); 1296 xmlnode_put_attrib(field, "label", "Groupchats: ");
1295 xmlnode_insert_tag(field, "required"); 1297 xmlnode_insert_tag(field, "required");
1296 1298
1297 foreach_buddy(ROSTER_TYPE_ROOM, &_callback_foreach_buddy_groupchat, &field); 1299 foreach_buddy(ROSTER_TYPE_ROOM, &_callback_foreach_buddy_groupchat, &field);
1298 } else if (!strcmp(action, "cancel")) { 1300 } else if (action && !strcmp(action, "cancel")) {
1299 xmlnode_put_attrib(command, "status", "canceled"); 1301 xmlnode_put_attrib(command, "status", "canceled");
1300 } else { // (if sessionid and not canceled) 1302 } else { // (if sessionid and not canceled)
1301 xmlnode form = xmlnode_get_tag(x, "x?xmlns=jabber:x:data"); 1303 xmlnode form = xmlnode_get_tag(x, "x?xmlns=jabber:x:data");
1302 if (form) { 1304 if (form) {
1303 xmlnode x, gc; 1305 xmlnode x, gc;