From 55401f49c984e35e652eb590bdcefa07387ddd44 Mon Sep 17 00:00:00 2001 From: Skywing Date: Fri, 20 Jun 2008 16:19:32 -0500 Subject: [PATCH] Fix double free in silcd. --- apps/silcd/command.c | 9 ++++++++- apps/silcd/server_util.c | 11 ++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/apps/silcd/command.c b/apps/silcd/command.c index 8040467f..d8d105c5 100644 --- a/apps/silcd/command.c +++ b/apps/silcd/command.c @@ -1472,12 +1472,19 @@ SILC_SERVER_CMD_FUNC(kill) /* Do normal signoff for the destination client */ sock = remote_client->connection; + + if (sock) + silc_packet_stream_ref(sock); + silc_server_remove_from_channels(server, NULL, remote_client, TRUE, (char *)"Killed", TRUE, TRUE); silc_server_free_sock_user_data(server, sock, comment ? comment : (unsigned char *)"Killed"); - if (sock) + if (sock) { + silc_packet_set_context(sock, NULL); silc_server_close_connection(server, sock); + silc_packet_stream_unref(sock); + } } else { /* Router operator killing */ diff --git a/apps/silcd/server_util.c b/apps/silcd/server_util.c index d2fd526c..74ce18ba 100644 --- a/apps/silcd/server_util.c +++ b/apps/silcd/server_util.c @@ -1547,8 +1547,17 @@ void silc_server_kill_client(SilcServer server, if (remote_client->connection) { /* Remove locally conneted client */ SilcPacketStream sock = remote_client->connection; + + if (sock) + silc_packet_stream_ref(sock); + silc_server_free_sock_user_data(server, sock, NULL); - silc_server_close_connection(server, sock); + + if (sock) { + silc_packet_set_context(sock, NULL); + silc_server_close_connection(server, sock); + silc_packet_stream_unref(sock); + } } else { /* Update statistics */ server->stat.clients--; -- 2.24.0