Handle failed memory allocations in packet sending silc.client.1.1.5
authorPekka Riikonen <priikone@silcnet.org>
Sun, 31 Aug 2008 07:58:11 +0000 (10:58 +0300)
committerPekka Riikonen <priikone@silcnet.org>
Sun, 31 Aug 2008 07:58:11 +0000 (10:58 +0300)
apps/silcd/command.c
apps/silcd/packet_send.c

index 77d0eb6472b946bb2793e7c109cbd961fab8a593..8040467f6af703b3c57d7813dc75a63f49b78f3d 100644 (file)
@@ -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:
index b65943779222b58db3ba054bb670b62ef00bd1bd..efc334cd1069803872a5df09a4eef7ccf511d821 100644 (file)
@@ -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);
 }