Index: squid/src/ssl.c diff -c squid/src/ssl.c:1.118.2.7 squid/src/ssl.c:1.118.2.9 *** squid/src/ssl.c:1.118.2.7 Mon Sep 27 12:07:30 2004 --- squid/src/ssl.c Mon Mar 21 12:39:29 2005 *************** *** 75,80 **** --- 75,92 ---- #endif static void + sslAbort(SslStateData * sslState) + { + debug(26, 3) ("sslAbort: FD %d/%d\n", sslState->client.fd, sslState->server.fd); + cbdataLock(sslState); + if (sslState->client.fd> -1) + comm_close(sslState->client.fd); + if (sslState->server.fd> -1) + comm_close(sslState->server.fd); + cbdataUnlock(sslState); + } + + static void sslServerClosed(int fd, void *data) { SslStateData *sslState = data; *************** *** 92,100 **** debug(26, 3) ("sslClientClosed: FD %d\n", fd); assert(fd == sslState->client.fd); sslState->client.fd = -1; ! if (sslState->server.fd != -1) ! comm_close(sslState->server.fd); ! else sslStateFree(sslState); } --- 104,110 ---- debug(26, 3) ("sslClientClosed: FD %d\n", fd); assert(fd == sslState->client.fd); sslState->client.fd = -1; ! if (sslState->server.fd == -1) sslStateFree(sslState); } *************** *** 152,158 **** sslState, Config.Timeout.read); } ! } else if (sslState->client.len == 0) { comm_close(sslState->server.fd); } if (!sslState->connected) { --- 162,168 ---- sslState, Config.Timeout.read); } ! } else if (sslState->client.len == 0 && sslState->server.fd> -1) { comm_close(sslState->server.fd); } if (!sslState->connected) { *************** *** 183,191 **** sslState, Config.Timeout.read); } ! } else if (sslState->client.fd == -1) { ! /* client already closed, nothing more to do */ ! } else if (sslState->server.len == 0) { comm_close(sslState->client.fd); } } --- 193,199 ---- sslState, Config.Timeout.read); } ! } else if (sslState->server.len == 0 && sslState->client.fd> -1) { comm_close(sslState->client.fd); } } *************** *** 262,268 **** debug(50, level) ("sslReadClient: FD %d: read failure: %s\n", fd, xstrerror()); if (!ignoreErrno(errno)) ! comm_close(fd); } else if (len == 0) { comm_close(fd); } --- 270,276 ---- debug(50, level) ("sslReadClient: FD %d: read failure: %s\n", fd, xstrerror()); if (!ignoreErrno(errno)) ! sslAbort(sslState); } else if (len == 0) { comm_close(fd); } *************** *** 303,309 **** debug(50, ignoreErrno(errno) ? 3 : 1) ("sslWriteServer: FD %d: write failure: %s.\n", fd, xstrerror()); if (!ignoreErrno(errno)) ! comm_close(fd); } if (cbdataValid(sslState)) sslSetSelect(sslState); --- 311,317 ---- debug(50, ignoreErrno(errno) ? 3 : 1) ("sslWriteServer: FD %d: write failure: %s.\n", fd, xstrerror()); if (!ignoreErrno(errno)) ! sslAbort(sslState); } if (cbdataValid(sslState)) sslSetSelect(sslState); *************** *** 347,353 **** debug(50, ignoreErrno(errno) ? 3 : 1) ("sslWriteClient: FD %d: write failure: %s.\n", fd, xstrerror()); if (!ignoreErrno(errno)) ! comm_close(fd); } if (cbdataValid(sslState)) sslSetSelect(sslState); --- 355,361 ---- debug(50, ignoreErrno(errno) ? 3 : 1) ("sslWriteClient: FD %d: write failure: %s.\n", fd, xstrerror()); if (!ignoreErrno(errno)) ! sslAbort(sslState); } if (cbdataValid(sslState)) sslSetSelect(sslState); *************** *** 359,365 **** { SslStateData *sslState = data; debug(26, 3) ("sslTimeout: FD %d\n", fd); ! comm_close(sslState->client.fd); } static void --- 367,373 ---- { SslStateData *sslState = data; debug(26, 3) ("sslTimeout: FD %d\n", fd); ! sslAbort(sslState); } static void *************** *** 383,389 **** static void ! sslConnectDone(int fdnotused, int status, void *data) { SslStateData *sslState = data; request_t *request = sslState->request; --- 391,397 ---- static void ! sslConnectDone(int fd, int status, void *data) { SslStateData *sslState = data; request_t *request = sslState->request; *************** *** 399,404 **** --- 407,413 ---- sslState->host); if (status == COMM_ERR_DNS) { debug(26, 4) ("sslConnect: Unknown host: %s\n", sslState->host); + comm_close(fd); err = errorCon(ERR_DNS_FAIL, HTTP_NOT_FOUND); *sslState->status_ptr = HTTP_NOT_FOUND; err->request = requestLink(request); *************** *** 407,412 **** --- 416,422 ---- err->callback_data = sslState; errorSend(sslState->client.fd, err); } else if (status != COMM_OK) { + comm_close(fd); err = errorCon(ERR_CONNECT_FAIL, HTTP_SERVICE_UNAVAILABLE); *sslState->status_ptr = HTTP_SERVICE_UNAVAILABLE; err->xerrno = errno;