Index: squid/src/ssl.c diff -c squid/src/ssl.c:1.118.2.4 squid/src/ssl.c:1.118.2.5 *** squid/src/ssl.c:1.118.2.4 Wed Aug 6 07:49:02 2003 --- squid/src/ssl.c Mon Mar 29 02:59:44 2004 *************** *** 218,224 **** if (!ignoreErrno(errno)) comm_close(fd); } else if (len == 0) { ! comm_close(sslState->server.fd); } if (cbdataValid(sslState)) sslSetSelect(sslState); --- 218,224 ---- if (!ignoreErrno(errno)) comm_close(fd); } else if (len == 0) { ! comm_close(fd); } if (cbdataValid(sslState)) sslSetSelect(sslState); *************** *** 376,385 **** --- 376,388 ---- { SslStateData *sslState = data; assert(sslState != NULL); + /* temporary lock to save our own feets (comm_close -> sslClientClosed -> Free) */ + cbdataLock(sslState); if (sslState->client.fd > -1) comm_close(sslState->client.fd); if (sslState->server.fd > -1) comm_close(sslState->server.fd); + cbdataUnlock(sslState); } *************** *** 432,437 **** --- 435,467 ---- } } + static void + sslConnectTimeout(int fd, void *data) + { + SslStateData *sslState = data; + request_t *request = sslState->request; + ErrorState *err = NULL; + if (sslState->servers->peer) + hierarchyNote(&sslState->request->hier, sslState->servers->code, + sslState->servers->peer->host); + else if (Config.onoff.log_ip_on_direct) + hierarchyNote(&sslState->request->hier, sslState->servers->code, + fd_table[sslState->server.fd].ipaddr); + else + hierarchyNote(&sslState->request->hier, sslState->servers->code, + sslState->host); + comm_close(fd); + err = errorCon(ERR_CONNECT_FAIL, HTTP_SERVICE_UNAVAILABLE); + *sslState->status_ptr = HTTP_SERVICE_UNAVAILABLE; + err->xerrno = ETIMEDOUT; + err->host = xstrdup(sslState->host); + err->port = sslState->port; + err->request = requestLink(request); + err->callback = sslErrorComplete; + err->callback_data = sslState; + errorSend(sslState->client.fd, err); + } + CBDATA_TYPE(SslStateData); void sslStart(clientHttpRequest * http, size_t * size_ptr, int *status_ptr) *************** *** 526,532 **** sslState); commSetTimeout(sslState->server.fd, Config.Timeout.connect, ! sslTimeout, sslState); peerSelect(request, NULL, --- 556,562 ---- sslState); commSetTimeout(sslState->server.fd, Config.Timeout.connect, ! sslConnectTimeout, sslState); peerSelect(request, NULL,