# HG changeset patch # User Mark Doliner # Date 1271056432 0 # Node ID 0fb628a28e5c75d4f3bc517f05d6a8d6421b883f # Parent 48e15c705add0e4ab5d5b313664fdb37a54425d8 Two SIMPLE changes: * Close the listener socket when disconnected. Otherwise we leak the socket and eventually run out of sockets to listen on, because we listen on a range of 100 sockets * Initialize the time_t before calling ctime diff -r 48e15c705add -r 0fb628a28e5c libpurple/protocols/simple/simple.c --- a/libpurple/protocols/simple/simple.c Mon Apr 12 07:10:48 2010 +0000 +++ b/libpurple/protocols/simple/simple.c Mon Apr 12 07:13:52 2010 +0000 @@ -1663,7 +1663,7 @@ struct simple_account_data *sip = gc->proto_data; struct sipmsg *msg; int len; - time_t currtime; + time_t currtime = time(NULL); static char buffer[65536]; if((len = recv(source, buffer, sizeof(buffer) - 1, 0)) > 0) { @@ -1777,10 +1777,14 @@ return; } + /* + * TODO: Is it correct to set sip->fd to the listenfd? For the TCP + * listener we set sip->listenfd, but maybe UDP is different? + * Maybe we use the same fd for outgoing data or something? + */ sip->fd = listenfd; sip->listenport = purple_network_get_port_from_fd(sip->fd); - sip->listenfd = sip->fd; sip->listenpa = purple_input_add(sip->fd, PURPLE_INPUT_READ, simple_udp_process, sip->gc); @@ -1982,6 +1986,14 @@ } connection_free_all(sip); + if (sip->listenpa) + purple_input_remove(sip->listenpa); + if (sip->tx_handler) + purple_input_remove(sip->tx_handler); + if (sip->resendtimeout) + purple_timeout_remove(sip->resendtimeout); + if (sip->registertimeout) + purple_timeout_remove(sip->registertimeout); if (sip->query_data != NULL) purple_dnsquery_destroy(sip->query_data); @@ -1991,6 +2003,11 @@ if (sip->listen_data != NULL) purple_network_listen_cancel(sip->listen_data); + if (sip->fd >= 0) + close(sip->fd); + if (sip->listenfd >= 0) + close(sip->listenfd); + g_free(sip->servername); g_free(sip->username); g_free(sip->password); @@ -2008,14 +2025,6 @@ if (sip->txbuf) purple_circ_buffer_destroy(sip->txbuf); g_free(sip->realhostname); - if (sip->listenpa) - purple_input_remove(sip->listenpa); - if (sip->tx_handler) - purple_input_remove(sip->tx_handler); - if (sip->resendtimeout) - purple_timeout_remove(sip->resendtimeout); - if (sip->registertimeout) - purple_timeout_remove(sip->registertimeout); g_free(sip); gc->proto_data = NULL;