Fixes to connection freeing crashes
[runtime.git] / apps / silcd / packet_send.c
index 7e19280e1649376bb4ab38c8a7afe5431d86b470..b65943779222b58db3ba054bb670b62ef00bd1bd 100644 (file)
@@ -295,7 +295,7 @@ void silc_server_packet_send_to_channel(SilcServer server,
   int k;
 
   /* This doesn't send channel message packets */
-  assert(type != SILC_PACKET_CHANNEL_MESSAGE);
+  SILC_ASSERT(type != SILC_PACKET_CHANNEL_MESSAGE);
 
   /* If there are global users in the channel we will send the message
      first to our router for further routing. */
@@ -399,6 +399,8 @@ void silc_server_packet_send_to_channel(SilcServer server,
 static SilcBool
 silc_server_packet_relay_to_channel_encrypt(SilcServer server,
                                            SilcPacketStream sender,
+                                           void *sender_id,
+                                           SilcIdType sender_type,
                                            SilcChannelEntry channel,
                                            unsigned char *data,
                                            unsigned int data_len)
@@ -451,8 +453,9 @@ silc_server_packet_relay_to_channel_encrypt(SilcServer server,
 
     memcpy(iv, data + (data_len - iv_len - mac_len), iv_len);
 
-    src_id.type = SILC_ID_SERVER;
-    src_id.u.server_id = *((SilcServerEntry)idata)->id;
+    SILC_ASSERT(sender_type == SILC_ID_CLIENT);
+    src_id.type = SILC_ID_CLIENT;
+    src_id.u.client_id = *((SilcClientID *)sender_id);
     dst_id.type = SILC_ID_CHANNEL;
     dst_id.u.channel_id = *channel->id;
 
@@ -502,6 +505,7 @@ void silc_server_packet_relay_to_channel(SilcServer server,
      channel key. If the channel key does not exist, then we know we
      don't have a single local user on the channel. */
   if (!silc_server_packet_relay_to_channel_encrypt(server, sender_sock,
+                                                  sender_id, sender_type,
                                                   channel, data,
                                                   data_len))
     return;
@@ -1438,10 +1442,11 @@ void silc_server_send_channel_key(SilcServer server,
   tmp_len = strlen(cipher);
   packet = silc_channel_key_payload_encode(cid_len, cid, tmp_len, cipher,
                                            channel->key_len / 8, channel->key);
-  silc_server_packet_send_to_channel(server, sender, channel,
-                                    SILC_PACKET_CHANNEL_KEY,
-                                     route, TRUE, packet->data,
-                                    silc_buffer_len(packet));
+  if (packet)
+    silc_server_packet_send_to_channel(server, sender, channel,
+                                      SILC_PACKET_CHANNEL_KEY,
+                                       route, TRUE, packet->data,
+                                      silc_buffer_len(packet));
   silc_buffer_free(packet);
 }