From 3bd6b2f960126cc0e8428e09a0c0e6e5c6c881f6 Mon Sep 17 00:00:00 2001 From: hiro Date: Fri, 26 Aug 2005 08:18:12 +0000 Subject: fixed socket resource leak on Win32. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@517 ee746299-78ed-0310-b773-934348b2243d --- ChangeLog | 8 ++++++++ ChangeLog.ja | 7 +++++++ src/socket.c | 40 ++++++++++++++++++++++------------------ 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index 979eec8a..2232d32c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-08-26 + + * src/socket.c: use g_io_channel_shutdown() instead of deprecated + g_io_channel_close(). + sock_close(): use g_io_channel_shutdown() instead of directly + calling close() (fixes resource leak on Win32). + fd_close(): call closesocket() on Win32. + 2005-08-25 * src/folderview.c: folderview_button_pressed(): expand/collapse diff --git a/ChangeLog.ja b/ChangeLog.ja index e9165be0..97792a9d 100644 --- a/ChangeLog.ja +++ b/ChangeLog.ja @@ -1,3 +1,10 @@ +2005-08-26 + + * src/socket.c: deprecated な g_io_channel_close() でなく + g_io_channel_shutdown() を使用するようにした。 + sock_close(): 直接 close() を呼ばずに g_io_channel_shutdown() + を使用するようにした(Win32 でリソースがリークするのを修正)。 + 2005-08-25 * src/folderview.c: folderview_button_pressed(): ダブルクリックで diff --git a/src/socket.c b/src/socket.c index 785433e9..17063ab1 100644 --- a/src/socket.c +++ b/src/socket.c @@ -200,7 +200,7 @@ gint fd_connect_unix(const gchar *path) strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1); if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - close(sock); + fd_close(sock); return -1; } @@ -229,13 +229,13 @@ gint fd_open_unix(const gchar *path) if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); - close(sock); + fd_close(sock); return -1; } if (listen(sock, 1) < 0) { perror("listen"); - close(sock); + fd_close(sock); return -1; } @@ -581,7 +581,7 @@ static gint sock_connect_by_getaddrinfo(const gchar *hostname, gushort port) (sock, ai->ai_addr, ai->ai_addrlen, io_timeout) == 0) break; - close(sock); + fd_close(sock); } if (res != NULL) @@ -619,7 +619,7 @@ SockInfo *sock_connect(const gchar *hostname, gushort port) if (sock_connect_by_hostname(sock, hostname, port) < 0) { if (errno != 0) perror("connect"); - close(sock); + fd_close(sock); return NULL; } #endif /* INET6 */ @@ -670,13 +670,13 @@ static gboolean sock_connect_async_cb(GIOChannel *source, len = sizeof(val); if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &val, &len) < 0) { perror("getsockopt"); - close(fd); + fd_close(fd); sock_connect_address_list_async(conn_data); return FALSE; } if (val != 0) { - close(fd); + fd_close(fd); sock_connect_address_list_async(conn_data); return FALSE; } @@ -762,7 +762,7 @@ gint sock_connect_async_cancel(gint id) if (conn_data->io_tag > 0) g_source_remove(conn_data->io_tag); if (conn_data->channel) { - g_io_channel_close(conn_data->channel); + g_io_channel_shutdown(conn_data->channel, FALSE, NULL); g_io_channel_unref(conn_data->channel); } @@ -799,7 +799,7 @@ static gint sock_connect_address_list_async(SockConnectData *conn_data) break; } else { perror("connect"); - close(sock); + fd_close(sock); } } else break; @@ -880,7 +880,7 @@ static gboolean sock_get_address_info_async_cb(GIOChannel *source, addr_list = g_list_append(addr_list, addr_data); } - g_io_channel_close(source); + g_io_channel_shutdown(source, FALSE, NULL); g_io_channel_unref(source); kill(lookup_data->child_pid, SIGKILL); @@ -1016,7 +1016,7 @@ static gint sock_get_address_info_async_cancel(SockLookupData *lookup_data) if (lookup_data->io_tag > 0) g_source_remove(lookup_data->io_tag); if (lookup_data->channel) { - g_io_channel_close(lookup_data->channel); + g_io_channel_shutdown(lookup_data->channel, FALSE, NULL); g_io_channel_unref(lookup_data->channel); } @@ -1368,26 +1368,30 @@ gint sock_peek(SockInfo *sock, gchar *buf, gint len) gint sock_close(SockInfo *sock) { - gint ret; - if (!sock) return 0; - if (sock->sock_ch) - g_io_channel_unref(sock->sock_ch); - #if USE_SSL if (sock->ssl) ssl_done_socket(sock); #endif - ret = fd_close(sock->sock); + + if (sock->sock_ch) { + g_io_channel_shutdown(sock->sock_ch, FALSE, NULL); + g_io_channel_unref(sock->sock_ch); + } + g_free(sock->hostname); g_free(sock); - return ret; + return 0; } gint fd_close(gint fd) { +#ifdef G_OS_WIN32 + return closesocket(fd); +#else return close(fd); +#endif } -- cgit v1.2.3