From: Pekka Riikonen Date: Mon, 16 Dec 2002 18:53:52 +0000 (+0000) Subject: Fixed SERVER_SIGNOFF notify handling on backup router. X-Git-Tag: silc.client.0.9.11~21 X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=24d590c43203580c422725fcf3e3940ad64e5d81 Fixed SERVER_SIGNOFF notify handling on backup router. Backup router do not remove clients from locally connected disconnecting servers but expects SERVER_SIGNOFF from router. --- diff --git a/CHANGES b/CHANGES index 1a10bd75..d960e2aa 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,25 @@ +Mon Dec 16 19:33:05 EET 2002 Pekka Riikonen + + * Fixed double free in async host lookup code. Affected file + lib/silcutil/silcsockconn.c. + + * On backup router handle now the SERVER_SIGNOFF from router + for local connected servers too, and close the connections. + + Do not process them as normally signing off servers when they + really signoff by sending EOF fe, but always assume that + router sends the SERVER_SIGNOFF. + + Affected files silcd/server.c and silcd/packet_receive.c. + + * Fixed socket unsetting when closing connections. Affected + files silcd/server.c and silcd/packet_send.c. + + * Do not print the nickname in SERVER_SIGNOFF if we do not + have it. Prevents asserts in Irssi core. It is possible we + don't have the nick if it was just being resolved when server + signoff. Affected file irssi/src/silc/core/client_ops.c. + Thu Dec 12 23:22:50 EET 2002 Pekka Riikonen * Fixed autonick crashbug in client library. Affected file diff --git a/apps/silcd/idlist.c b/apps/silcd/idlist.c index df7eba0a..9acdd068 100644 --- a/apps/silcd/idlist.c +++ b/apps/silcd/idlist.c @@ -295,8 +295,10 @@ int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry) if (!silc_idcache_del_by_context(id_list->servers, entry)) return FALSE; - SILC_LOG_DEBUG(("Deleting server %s", entry->server_name ? - entry->server_name : "")); + SILC_LOG_DEBUG(("Deleting server %s id %s", entry->server_name ? + entry->server_name : "", + entry->id ? + silc_id_render(entry->id, SILC_ID_SERVER) : "")); /* Free data */ silc_free(entry->server_name); diff --git a/apps/silcd/packet_receive.c b/apps/silcd/packet_receive.c index 29744f2c..1fa6f752 100644 --- a/apps/silcd/packet_receive.c +++ b/apps/silcd/packet_receive.c @@ -1306,9 +1306,20 @@ void silc_server_notify(SilcServer server, } silc_free(server_id); - /* Sending SERVER_SIGNOFF is not right way to signoff local connection */ - if (SILC_IS_LOCAL(server_entry)) + /* For local entrys SERVER_SIGNOFF is processed only on backup router. + It is possible that router sends server signoff for a server. If + backup router has it as local connection it will be closed. */ + if (SILC_IS_LOCAL(server_entry) && + server->server_type == SILC_BACKUP_ROUTER) { + sock = server_entry->connection; + SILC_LOG_DEBUG(("Closing connection %s after SERVER_SIGNOFF", + sock->hostname)); + SILC_SET_DISCONNECTING(sock); + if (sock->user_data) + silc_server_free_sock_user_data(server, sock, NULL); + silc_server_close_connection(server, sock); break; + } /* Remove all servers that are originated from this server, and remove the clients of those servers too. */ diff --git a/apps/silcd/packet_send.c b/apps/silcd/packet_send.c index d8d27c7b..8e3ab0f2 100644 --- a/apps/silcd/packet_send.c +++ b/apps/silcd/packet_send.c @@ -38,12 +38,24 @@ int silc_server_packet_send_real(SilcServer server, if (SILC_IS_DISCONNECTING(sock)) return -1; - /* We do not force anymore packet sending */ - force_send = FALSE; - /* Send the packet */ - ret = silc_packet_send(sock, force_send); + ret = silc_packet_send(sock, FALSE); if (ret != -2) { + if (ret == -1) { + SILC_LOG_ERROR(("Error sending packet to connection " + "%s:%d [%s]", sock->hostname, sock->port, + (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" : + sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" : + sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" : + "Router"))); + + SILC_SET_DISCONNECTING(sock); + if (sock->user_data) + silc_server_free_sock_user_data(server, sock, NULL); + silc_server_close_connection(server, sock); + return ret; + } + server->stat.packets_sent++; return ret; } @@ -1995,7 +2007,6 @@ void silc_server_packet_queue_purge(SilcServer server, (SILC_IS_DISCONNECTED(sock) == FALSE)) { server->stat.packets_sent++; silc_packet_send(sock, TRUE); - SILC_SET_CONNECTION_FOR_INPUT(server->schedule, sock->sock); SILC_UNSET_OUTBUF_PENDING(sock); silc_buffer_clear(sock->outbuf); } diff --git a/apps/silcd/server.c b/apps/silcd/server.c index d7f33838..539b9d30 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -2929,6 +2929,8 @@ void silc_server_close_connection(SilcServer server, char tmp[128]; if (!server->sockets[sock->sock] && SILC_IS_DISCONNECTED(sock)) { + silc_schedule_unset_listen_fd(server->schedule, sock->sock); + silc_schedule_task_del_by_fd(server->schedule, sock->sock); silc_schedule_task_add(server->schedule, sock->sock, silc_server_close_connection_final, (void *)sock, 0, 1, SILC_TASK_TIMEOUT, @@ -2945,9 +2947,6 @@ void silc_server_close_connection(SilcServer server, sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" : "Router"), tmp[0] ? tmp : "")); - /* We won't listen for this connection anymore */ - silc_schedule_unset_listen_fd(server->schedule, sock->sock); - /* Unregister all tasks */ silc_schedule_task_del_by_fd(server->schedule, sock->sock); @@ -2972,6 +2971,9 @@ void silc_server_close_connection(SilcServer server, } } + /* We won't listen for this connection anymore */ + silc_schedule_unset_listen_fd(server->schedule, sock->sock); + silc_schedule_task_add(server->schedule, sock->sock, silc_server_close_connection_final, (void *)sock, 0, 1, SILC_TASK_TIMEOUT, @@ -3209,11 +3211,15 @@ void silc_server_free_sock_user_data(SilcServer server, SILC_TASK_PRI_NORMAL); } + SILC_SERVER_SEND_OPERS(server, FALSE, TRUE, SILC_NOTIFY_TYPE_NONE, + ("Server %s signoff", user_data->server_name)); + if (!backup_router) { /* Remove all servers that are originated from this server, and remove the clients of those servers too. */ silc_server_remove_servers_by_server(server, user_data, TRUE); +#if 0 /* Remove the clients that this server owns as they will become invalid now too. For backup router the server is actually coming from the primary router, so mark that as the owner @@ -3223,6 +3229,7 @@ void silc_server_free_sock_user_data(SilcServer server, silc_server_remove_clients_by_server(server, server->router, user_data, TRUE); else +#endif silc_server_remove_clients_by_server(server, user_data, user_data, TRUE);