From: Pekka Riikonen Date: Sun, 31 Aug 2008 07:58:11 +0000 (+0300) Subject: Handle failed memory allocations in packet sending X-Git-Tag: silc.client.1.1.5 X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=ad10dc073b3684e02f5fa14449463c1122bd4cb2 Handle failed memory allocations in packet sending --- diff --git a/apps/silcd/command.c b/apps/silcd/command.c index 77d0eb64..8040467f 100644 --- a/apps/silcd/command.c +++ b/apps/silcd/command.c @@ -1289,7 +1289,7 @@ SILC_SERVER_CMD_FUNC(invite) /* Send invite list back only if the list was modified, or no arguments was given. */ - type = 0; + ttype = 0; argc = silc_argument_get_arg_num(cmd->args); if (argc == 1) ttype = 1; @@ -1303,7 +1303,7 @@ SILC_SERVER_CMD_FUNC(invite) 2, tmp, len, 3, ttype && list ? list->data : NULL, - type && list ? silc_buffer_len(list) : 0); + ttype && list ? silc_buffer_len(list) : 0); silc_buffer_free(list); out: diff --git a/apps/silcd/packet_send.c b/apps/silcd/packet_send.c index b6594377..efc334cd 100644 --- a/apps/silcd/packet_send.c +++ b/apps/silcd/packet_send.c @@ -771,6 +771,10 @@ void silc_server_send_notify(SilcServer server, va_start(ap, argc); packet = silc_notify_payload_encode(type, argc, ap); + if (!packet) { + va_end(ap); + return; + } silc_server_packet_send(server, sock, SILC_PACKET_NOTIFY, broadcast ? SILC_PACKET_FLAG_BROADCAST : 0, packet->data, silc_buffer_len(packet)); @@ -801,9 +805,10 @@ void silc_server_send_notify_args(SilcServer server, SilcBuffer packet; packet = silc_notify_payload_encode_args(type, argc, args); - silc_server_packet_send(server, sock, SILC_PACKET_NOTIFY, - broadcast ? SILC_PACKET_FLAG_BROADCAST : 0, - packet->data, silc_buffer_len(packet)); + if (packet) + silc_server_packet_send(server, sock, SILC_PACKET_NOTIFY, + broadcast ? SILC_PACKET_FLAG_BROADCAST : 0, + packet->data, silc_buffer_len(packet)); silc_buffer_free(packet); } @@ -821,10 +826,11 @@ void silc_server_send_notify_channel_change(SilcServer server, idp1 = silc_id_payload_encode((void *)old_id, SILC_ID_CHANNEL); idp2 = silc_id_payload_encode((void *)new_id, SILC_ID_CHANNEL); - silc_server_send_notify(server, sock, broadcast, - SILC_NOTIFY_TYPE_CHANNEL_CHANGE, - 2, idp1->data, silc_buffer_len(idp1), - idp2->data, silc_buffer_len(idp2)); + if (idp1 && idp2) + silc_server_send_notify(server, sock, broadcast, + SILC_NOTIFY_TYPE_CHANNEL_CHANGE, + 2, idp1->data, silc_buffer_len(idp1), + idp2->data, silc_buffer_len(idp2)); silc_buffer_free(idp1); silc_buffer_free(idp2); } @@ -844,11 +850,12 @@ void silc_server_send_notify_nick_change(SilcServer server, idp1 = silc_id_payload_encode((void *)old_id, SILC_ID_CLIENT); idp2 = silc_id_payload_encode((void *)new_id, SILC_ID_CLIENT); - silc_server_send_notify(server, sock, broadcast, - SILC_NOTIFY_TYPE_NICK_CHANGE, - 3, idp1->data, silc_buffer_len(idp1), - idp2->data, silc_buffer_len(idp2), - nickname, nickname ? strlen(nickname) : 0); + if (idp1 && idp2) + silc_server_send_notify(server, sock, broadcast, + SILC_NOTIFY_TYPE_NICK_CHANGE, + 3, idp1->data, silc_buffer_len(idp1), + idp2->data, silc_buffer_len(idp2), + nickname, nickname ? strlen(nickname) : 0); silc_buffer_free(idp1); silc_buffer_free(idp2); } @@ -866,9 +873,11 @@ void silc_server_send_notify_join(SilcServer server, idp1 = silc_id_payload_encode((void *)client_id, SILC_ID_CLIENT); idp2 = silc_id_payload_encode((void *)channel->id, SILC_ID_CHANNEL); - silc_server_send_notify(server, sock, broadcast, SILC_NOTIFY_TYPE_JOIN, - 2, idp1->data, silc_buffer_len(idp1), - idp2->data, silc_buffer_len(idp2)); + + if (idp1 && idp2) + silc_server_send_notify(server, sock, broadcast, SILC_NOTIFY_TYPE_JOIN, + 2, idp1->data, silc_buffer_len(idp1), + idp2->data, silc_buffer_len(idp2)); silc_buffer_free(idp1); silc_buffer_free(idp2); } @@ -885,9 +894,10 @@ void silc_server_send_notify_leave(SilcServer server, SilcBuffer idp; idp = silc_id_payload_encode((void *)client_id, SILC_ID_CLIENT); - silc_server_send_notify_dest(server, sock, broadcast, (void *)channel->id, - SILC_ID_CHANNEL, SILC_NOTIFY_TYPE_LEAVE, - 1, idp->data, silc_buffer_len(idp)); + if (idp) + silc_server_send_notify_dest(server, sock, broadcast, (void *)channel->id, + SILC_ID_CHANNEL, SILC_NOTIFY_TYPE_LEAVE, + 1, idp->data, silc_buffer_len(idp)); silc_buffer_free(idp); } @@ -910,6 +920,8 @@ void silc_server_send_notify_cmode(SilcServer server, unsigned char mode[4], ulimit[4]; idp = silc_id_payload_encode((void *)id, id_type); + if (!idp) + return; SILC_PUT32_MSB(mode_mask, mode); if (founder_key) fkey = silc_public_key_payload_encode(founder_key); @@ -955,6 +967,8 @@ void silc_server_send_notify_cumode(SilcServer server, idp1 = silc_id_payload_encode((void *)id, id_type); idp2 = silc_id_payload_encode((void *)target, SILC_ID_CLIENT); + if (!idp1 || !idp2) + return; SILC_PUT32_MSB(mode_mask, mode); if (founder_key) fkey = silc_public_key_payload_encode(founder_key); @@ -986,10 +1000,11 @@ void silc_server_send_notify_signoff(SilcServer server, SilcBuffer idp; idp = silc_id_payload_encode((void *)client_id, SILC_ID_CLIENT); - silc_server_send_notify(server, sock, broadcast, - SILC_NOTIFY_TYPE_SIGNOFF, - message ? 2 : 1, idp->data, silc_buffer_len(idp), - message, message ? strlen(message): 0); + if (idp) + silc_server_send_notify(server, sock, broadcast, + SILC_NOTIFY_TYPE_SIGNOFF, + message ? 2 : 1, idp->data, silc_buffer_len(idp), + message, message ? strlen(message): 0); silc_buffer_free(idp); } @@ -1008,12 +1023,13 @@ void silc_server_send_notify_topic_set(SilcServer server, SilcBuffer idp; idp = silc_id_payload_encode(id, id_type); - silc_server_send_notify_dest(server, sock, broadcast, - (void *)channel->id, SILC_ID_CHANNEL, - SILC_NOTIFY_TYPE_TOPIC_SET, - topic ? 2 : 1, - idp->data, silc_buffer_len(idp), - topic, topic ? strlen(topic) : 0); + if (idp) + silc_server_send_notify_dest(server, sock, broadcast, + (void *)channel->id, SILC_ID_CHANNEL, + SILC_NOTIFY_TYPE_TOPIC_SET, + topic ? 2 : 1, + idp->data, silc_buffer_len(idp), + topic, topic ? strlen(topic) : 0); silc_buffer_free(idp); } @@ -1035,11 +1051,13 @@ void silc_server_send_notify_kicked(SilcServer server, idp1 = silc_id_payload_encode((void *)client_id, SILC_ID_CLIENT); idp2 = silc_id_payload_encode((void *)kicker, SILC_ID_CLIENT); - silc_server_send_notify_dest(server, sock, broadcast, (void *)channel->id, - SILC_ID_CHANNEL, SILC_NOTIFY_TYPE_KICKED, 3, - idp1->data, silc_buffer_len(idp1), - comment, comment ? strlen(comment) : 0, - idp2->data, silc_buffer_len(idp2)); + + if (idp1 && idp2) + silc_server_send_notify_dest(server, sock, broadcast, (void *)channel->id, + SILC_ID_CHANNEL, SILC_NOTIFY_TYPE_KICKED, 3, + idp1->data, silc_buffer_len(idp1), + comment, comment ? strlen(comment) : 0, + idp2->data, silc_buffer_len(idp2)); silc_buffer_free(idp1); silc_buffer_free(idp2); } @@ -1060,11 +1078,13 @@ void silc_server_send_notify_killed(SilcServer server, idp1 = silc_id_payload_encode(client_id, SILC_ID_CLIENT); idp2 = silc_id_payload_encode(killer, killer_type); - silc_server_send_notify_dest(server, sock, broadcast, (void *)client_id, - SILC_ID_CLIENT, SILC_NOTIFY_TYPE_KILLED, - 3, idp1->data, silc_buffer_len(idp1), - comment, comment ? strlen(comment) : 0, - idp2->data, silc_buffer_len(idp2)); + + if (idp1 && idp2) + silc_server_send_notify_dest(server, sock, broadcast, (void *)client_id, + SILC_ID_CLIENT, SILC_NOTIFY_TYPE_KILLED, + 3, idp1->data, silc_buffer_len(idp1), + comment, comment ? strlen(comment) : 0, + idp2->data, silc_buffer_len(idp2)); silc_buffer_free(idp1); silc_buffer_free(idp2); } @@ -1085,10 +1105,11 @@ void silc_server_send_notify_umode(SilcServer server, idp = silc_id_payload_encode((void *)client_id, SILC_ID_CLIENT); SILC_PUT32_MSB(mode_mask, mode); - silc_server_send_notify(server, sock, broadcast, - SILC_NOTIFY_TYPE_UMODE_CHANGE, 2, - idp->data, silc_buffer_len(idp), - mode, 4); + if (idp) + silc_server_send_notify(server, sock, broadcast, + SILC_NOTIFY_TYPE_UMODE_CHANGE, 2, + idp->data, silc_buffer_len(idp), + mode, 4); silc_buffer_free(idp); } @@ -1106,12 +1127,14 @@ void silc_server_send_notify_ban(SilcServer server, SilcBuffer idp; idp = silc_id_payload_encode((void *)channel->id, SILC_ID_CHANNEL); - silc_server_send_notify(server, sock, broadcast, - SILC_NOTIFY_TYPE_BAN, 3, - idp->data, silc_buffer_len(idp), - action ? action : NULL, action ? 1 : 0, - list ? list->data : NULL, - list ? silc_buffer_len(list) : 0); + + if (idp) + silc_server_send_notify(server, sock, broadcast, + SILC_NOTIFY_TYPE_BAN, 3, + idp->data, silc_buffer_len(idp), + action ? action : NULL, action ? 1 : 0, + list ? list->data : NULL, + list ? silc_buffer_len(list) : 0); silc_buffer_free(idp); } @@ -1132,14 +1155,17 @@ void silc_server_send_notify_invite(SilcServer server, idp = silc_id_payload_encode((void *)channel->id, SILC_ID_CHANNEL); idp2 = silc_id_payload_encode((void *)client_id, SILC_ID_CLIENT); - silc_server_send_notify(server, sock, broadcast, - SILC_NOTIFY_TYPE_INVITE, 5, - idp->data, silc_buffer_len(idp), - channel->channel_name, strlen(channel->channel_name), - idp2->data, silc_buffer_len(idp2), - action ? action : NULL, action ? 1 : 0, - list ? list->data : NULL, - list ? silc_buffer_len(list) : 0); + + if (idp && idp2) + silc_server_send_notify(server, sock, broadcast, + SILC_NOTIFY_TYPE_INVITE, 5, + idp->data, silc_buffer_len(idp), + channel->channel_name, + strlen(channel->channel_name), + idp2->data, silc_buffer_len(idp2), + action ? action : NULL, action ? 1 : 0, + list ? list->data : NULL, + list ? silc_buffer_len(list) : 0); silc_buffer_free(idp); silc_buffer_free(idp2); } @@ -1159,6 +1185,8 @@ void silc_server_send_notify_watch(SilcServer server, unsigned char mode[4], n[2]; idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT); + if (!idp) + return; SILC_PUT16_MSB(type, n); SILC_PUT32_MSB(client->mode, mode); if (public_key) @@ -1192,6 +1220,10 @@ void silc_server_send_notify_dest(SilcServer server, va_start(ap, argc); packet = silc_notify_payload_encode(type, argc, ap); + if (!packet) { + va_end(ap); + return; + } silc_server_packet_send_dest(server, sock, SILC_PACKET_NOTIFY, broadcast ? SILC_PACKET_FLAG_BROADCAST : 0, dest_id, dest_id_type, @@ -1232,10 +1264,11 @@ void silc_server_send_notify_to_channel(SilcServer server, va_start(ap, argc); packet = silc_notify_payload_encode(type, argc, ap); - silc_server_packet_send_to_channel(server, sender, channel, - SILC_PACKET_NOTIFY, route_notify, - send_to_clients, - packet->data, silc_buffer_len(packet)); + if (packet) + silc_server_packet_send_to_channel(server, sender, channel, + SILC_PACKET_NOTIFY, route_notify, + send_to_clients, + packet->data, silc_buffer_len(packet)); silc_buffer_free(packet); va_end(ap); } @@ -1277,6 +1310,10 @@ void silc_server_send_notify_on_channels(SilcServer server, va_start(ap, argc); packet = silc_notify_payload_encode(type, argc, ap); + if (!packet) { + va_end(ap); + return; + } data = packet->data; data_len = silc_buffer_len(packet); @@ -1370,9 +1407,10 @@ void silc_server_send_new_id(SilcServer server, SILC_LOG_DEBUG(("Sending new ID")); idp = silc_id_payload_encode(id, id_type); - silc_server_packet_send(server, sock, SILC_PACKET_NEW_ID, - broadcast ? SILC_PACKET_FLAG_BROADCAST : 0, - idp->data, silc_buffer_len(idp)); + if (idp) + silc_server_packet_send(server, sock, SILC_PACKET_NEW_ID, + broadcast ? SILC_PACKET_FLAG_BROADCAST : 0, + idp->data, silc_buffer_len(idp)); silc_buffer_free(idp); } @@ -1401,10 +1439,10 @@ void silc_server_send_new_channel(SilcServer server, /* Encode the channel payload */ packet = silc_channel_payload_encode(channel_name, name_len, cid, channel_id_len, mode); - - silc_server_packet_send(server, sock, SILC_PACKET_NEW_CHANNEL, - broadcast ? SILC_PACKET_FLAG_BROADCAST : 0, - packet->data, silc_buffer_len(packet)); + if (packet) + silc_server_packet_send(server, sock, SILC_PACKET_NEW_CHANNEL, + broadcast ? SILC_PACKET_FLAG_BROADCAST : 0, + packet->data, silc_buffer_len(packet)); silc_buffer_free(packet); } @@ -1468,8 +1506,9 @@ void silc_server_send_command(SilcServer server, va_start(ap, argc); packet = silc_command_payload_encode_vap(command, ident, argc, ap); - silc_server_packet_send(server, sock, SILC_PACKET_COMMAND, 0, - packet->data, silc_buffer_len(packet)); + if (packet) + silc_server_packet_send(server, sock, SILC_PACKET_COMMAND, 0, + packet->data, silc_buffer_len(packet)); silc_buffer_free(packet); va_end(ap); } @@ -1495,8 +1534,9 @@ void silc_server_send_command_reply(SilcServer server, packet = silc_command_reply_payload_encode_vap(command, status, error, ident, argc, ap); - silc_server_packet_send(server, sock, SILC_PACKET_COMMAND_REPLY, 0, - packet->data, silc_buffer_len(packet)); + if (packet) + silc_server_packet_send(server, sock, SILC_PACKET_COMMAND_REPLY, 0, + packet->data, silc_buffer_len(packet)); silc_buffer_free(packet); va_end(ap); } @@ -1524,9 +1564,10 @@ void silc_server_send_dest_command_reply(SilcServer server, packet = silc_command_reply_payload_encode_vap(command, status, error, ident, argc, ap); - silc_server_packet_send_dest(server, sock, SILC_PACKET_COMMAND_REPLY, 0, - dst_id, dst_id_type, packet->data, - silc_buffer_len(packet)); + if (packet) + silc_server_packet_send_dest(server, sock, SILC_PACKET_COMMAND_REPLY, 0, + dst_id, dst_id_type, packet->data, + silc_buffer_len(packet)); silc_buffer_free(packet); va_end(ap); } @@ -1541,6 +1582,9 @@ void silc_server_send_connection_auth_request(SilcServer server, SilcBuffer packet; packet = silc_buffer_alloc(4); + if (!packet) + return; + silc_buffer_pull_tail(packet, silc_buffer_truelen(packet)); silc_buffer_format(packet, SILC_STR_UI_SHORT(conn_type), @@ -1714,8 +1758,9 @@ void silc_server_send_opers_notify(SilcServer server, va_start(ap, argc); packet = silc_notify_payload_encode(type, argc, ap); - silc_server_send_opers(server, SILC_PACKET_NOTIFY, 0, - route, local, packet->data, silc_buffer_len(packet)); + if (packet) + silc_server_send_opers(server, SILC_PACKET_NOTIFY, 0, + route, local, packet->data, silc_buffer_len(packet)); silc_buffer_free(packet); va_end(ap); }