When detaching client, which results into closing of the actual connection
it is important to abort any active protocols, such as rekeys, because
they cannot be completed with detached clients.
SilcClientID *client_id = (SilcClientID *)q->sock;
SilcClientEntry client;
SilcPacketStream sock;
SilcClientID *client_id = (SilcClientID *)q->sock;
SilcClientEntry client;
SilcPacketStream sock;
+ SilcIDListData idata;
+
client = silc_idlist_find_client_by_id(server->local_list, client_id,
TRUE, NULL);
if (client && client->connection) {
sock = client->connection;
client = silc_idlist_find_client_by_id(server->local_list, client_id,
TRUE, NULL);
if (client && client->connection) {
sock = client->connection;
+ SILC_LOG_DEBUG(("Detaching client %s",
+ silc_id_render(client->id, SILC_ID_CLIENT)));
+
/* Stop rekey for the client. */
silc_server_stop_rekey(server, client);
/* Stop rekey for the client. */
silc_server_stop_rekey(server, client);
+ /* Abort any active protocol */
+ idata = silc_packet_get_context(sock);
+ if (idata && idata->sconn && idata->sconn->op) {
+ SILC_LOG_DEBUG(("Abort active protocol"));
+ silc_async_abort(idata->sconn->op, NULL, NULL);
+ idata->sconn->op = NULL;
+ }
+
/* Close the connection on our side */
client->router = NULL;
client->connection = NULL;
/* Close the connection on our side */
client->router = NULL;
client->connection = NULL;