From 2bbbad29cd0ba861f8f4e93a5d7dd85a7fdb35fd Mon Sep 17 00:00:00 2001 From: Michael Graff Date: Tue, 16 Sep 2008 01:47:27 +0000 Subject: [PATCH] win32: UDP connect() would not generate an event, and so connected UDP sockets would never clean up. Fix this by doing an immediate WSAConnect() rather than an io completion port type for UDP. --- CHANGES | 5 +++ lib/isc/win32/socket.c | 96 +++++++++++++----------------------------- 2 files changed, 35 insertions(+), 66 deletions(-) diff --git a/CHANGES b/CHANGES index a958527465..047cc338cd 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,8 @@ +2443. [bug] win32: UDP connect() would not generate an event, + and so connected UDP sockets would never clean up. + Fix this by doing an immediate WSAConnect() rather + than an io completion port type for UDP. + 2442. [bug] A lock could be destroyed twice. [RT# 18626] --- 9.5.1b2 released --- diff --git a/lib/isc/win32/socket.c b/lib/isc/win32/socket.c index 6d05ba5904..07f032f44d 100644 --- a/lib/isc/win32/socket.c +++ b/lib/isc/win32/socket.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: socket.c,v 1.52.94.23 2008/09/11 23:46:38 tbox Exp $ */ +/* $Id: socket.c,v 1.52.94.24 2008/09/16 01:47:27 explorer Exp $ */ /* This code uses functions which are only available on Server 2003 and * higher, and Windows XP and higher. @@ -86,14 +86,6 @@ LPFN_CONNECTEX ISCConnectEx; LPFN_ACCEPTEX ISCAcceptEx; LPFN_GETACCEPTEXSOCKADDRS ISCGetAcceptExSockaddrs; -/* - * 0 = no debugging, 1 = write to file "socket.log" in working directory. - */ -#define XXXMLG_DEBUG 0 -#if XXXMLG_DEBUG -FILE *logfile = NULL; -#endif - /* * Run expensive internal consistancy checks. */ @@ -823,20 +815,10 @@ socket_log(int lineno, isc_socket_t *sock, isc_sockaddr_t *address, char msgbuf[2048]; char peerbuf[256]; va_list ap; -#if XXXMLG_DEBUG - char timebuf[128]; - isc_time_t now; -#endif -#if XXXMLG_DEBUG - isc_time_now(&now); - isc_time_formattimestamp(&now, timebuf, sizeof timebuf); -#endif -#if XXXMLG_DEBUG == 0 if (!isc_log_wouldlog(isc_lctx, level)) return; -#endif va_start(ap, fmt); vsnprintf(msgbuf, sizeof(msgbuf), fmt, ap); @@ -846,28 +828,14 @@ socket_log(int lineno, isc_socket_t *sock, isc_sockaddr_t *address, isc_log_iwrite(isc_lctx, category, module, level, msgcat, msgset, message, "socket %p line %d: %s", sock, lineno, msgbuf); -#if XXXMLG_DEBUG - if (logfile) - fprintf(logfile, "%s socket %p line %d: %s:\n", - timebuf, sock, lineno, msgbuf); -#endif } else { isc_sockaddr_format(address, peerbuf, sizeof(peerbuf)); isc_log_iwrite(isc_lctx, category, module, level, msgcat, msgset, message, "socket %p line %d peer %s: %s", sock, lineno, peerbuf, msgbuf); -#if XXXMLG_DEBUG - if (logfile) - fprintf(logfile, "%s socket %p line %d: %s: %s\n", - timebuf, sock, lineno, peerbuf, msgbuf); -#endif } -#if XXXMLG_DEBUG - if (logfile) - fflush(logfile); -#endif } /* @@ -2479,10 +2447,6 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp, if (maxsocks != 0) return (ISC_R_NOTIMPLEMENTED); -#if XXXMLG_DEBUG - logfile = fopen("socket.log", "w"); -#endif - manager = isc_mem_get(mctx, sizeof(*manager)); if (manager == NULL) return (ISC_R_NOMEMORY); @@ -2534,11 +2498,6 @@ isc_socketmgr_destroy(isc_socketmgr_t **managerp) { int i; isc_mem_t *mctx; -#if XXXMLG_DEBUG - if (logfile) - fclose(logfile); -#endif - /* * Destroy a socket manager. */ @@ -3345,34 +3304,39 @@ isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr, } ISC_LINK_INIT(cdev, ev_link); - /* - * Queue io completion for an accept(). - */ - lpo = (IoCompletionInfo *)HeapAlloc(hHeapHandle, - HEAP_ZERO_MEMORY, - sizeof(IoCompletionInfo)); - lpo->cdev = cdev; - lpo->request_type = SOCKET_CONNECT; + if (sock->type == isc_sockettype_tcp) { + /* + * Queue io completion for an accept(). + */ + lpo = (IoCompletionInfo *)HeapAlloc(hHeapHandle, + HEAP_ZERO_MEMORY, + sizeof(IoCompletionInfo)); + lpo->cdev = cdev; + lpo->request_type = SOCKET_CONNECT; - sock->address = *addr; - ISCConnectEx(sock->fd, &addr->type.sa, addr->length, - NULL, 0, NULL, (LPOVERLAPPED)lpo); + sock->address = *addr; + ISCConnectEx(sock->fd, &addr->type.sa, addr->length, + NULL, 0, NULL, (LPOVERLAPPED)lpo); - /* - * Attach to task. - */ - isc_task_attach(task, &ntask); - cdev->ev_sender = ntask; + /* + * Attach to task. + */ + isc_task_attach(task, &ntask); + cdev->ev_sender = ntask; - sock->pending_connect = 1; - _set_state(sock, SOCK_CONNECT); - - /* - * Enqueue the request. - */ - sock->connect_ev = cdev; - sock->pending_iocp++; + sock->pending_connect = 1; + _set_state(sock, SOCK_CONNECT); + /* + * Enqueue the request. + */ + sock->connect_ev = cdev; + sock->pending_iocp++; + } else { + WSAConnect(sock->fd, &addr->type.sa, addr->length, NULL, NULL, NULL, NULL); + cdev->result = ISC_R_SUCCESS; + isc_task_send(task, (isc_event_t **)&cdev); + } CONSISTENT(sock); UNLOCK(&sock->lock);