diff --git a/CHANGES b/CHANGES index 4154ff20a..c4f050072 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,17 @@ Changelog +Daniel (5 May 2006) +- Roland Blom filed bug report #1481217 + (http://curl.haxx.se/bug/view.cgi?id=1481217), with follow-ups by Michele + Bini and David Byron. libcurl previously wrongly used GetLastError() on + windows to get error details after socket-related function calls, when it + really should use WSAGetLastError() instead. + + When changing to this, the former function Curl_ourerrno() is now instead + called Curl_sockerrno() as it is necessary to only use it to get errno from + socket-related functions as otherwise it won't work as intended on Windows. + Daniel (4 May 2006) - Mark Eichin submitted bug report #1480821 (http://curl.haxx.se/bug/view.cgi?id=1480821) He found and identified a diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 1fe83f38c..f4f2230d7 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -20,6 +20,7 @@ This release includes the following changes: This release includes the following bugfixes: + o WSAGetLastError() is now used (better) on Windows o GnuTLS non-block case that could cause data trashing o deflate code survives lack of zlib header o CURLOPT_INTERFACE works with hostname @@ -47,6 +48,6 @@ advice from friends like these: Dan Fandrich, Ilja van Sprundel, David McCreedy, Tor Arntsen, Xavier Bouchoux, David Byron, Michele Bini, Ates Goral, Katie Wang, Robson Braga Araujo, - Ale Vesely, Paul Querna, Gisle Vanem, Mark Eichin + Ale Vesely, Paul Querna, Gisle Vanem, Mark Eichin, Roland Blom Thanks! (and sorry if I forgot to mention someone) diff --git a/lib/connect.c b/lib/connect.c index b3372f42a..1ba87099f 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -114,13 +114,13 @@ singleipconnect(struct connectdata *conn, bool *connected); /* - * Curl_ourerrno() returns the errno (or equivalent) on this platform to - * hide platform specific for the function that calls this. + * Curl_sockerrno() returns the *socket-related* errno (or equivalent) on this + * platform to hide platform specific for the function that calls this. */ -int Curl_ourerrno(void) +int Curl_sockerrno(void) { #ifdef WIN32 - return (int)GetLastError(); + return (int)WSAGetLastError(); #else return errno; #endif @@ -330,7 +330,7 @@ static CURLcode bindlocal(struct connectdata *conn, if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, data->set.device, strlen(data->set.device)+1) != 0) { /* printf("Failed to BINDTODEVICE, socket: %d device: %s error: %s\n", - sockfd, data->set.device, Curl_strerror(Curl_ourerrno())); */ + sockfd, data->set.device, Curl_strerror(Curl_sockerrno())); */ infof(data, "SO_BINDTODEVICE %s failed\n", data->set.device); /* This is typically "errno 1, error: Operation not permitted" if @@ -408,7 +408,7 @@ static CURLcode bindlocal(struct connectdata *conn, break; } while(1); - data->state.os_errno = Curl_ourerrno(); + data->state.os_errno = Curl_sockerrno(); failf(data, "bind failure: %s", Curl_strerror(conn, data->state.os_errno)); return CURLE_HTTP_PORT_FAILED; @@ -452,7 +452,7 @@ static bool verifyconnect(curl_socket_t sockfd, int *error) if( -1 == getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (void *)&err, &errSize)) - err = Curl_ourerrno(); + err = Curl_sockerrno(); #ifdef _WIN32_WCE /* Always returns this error, bug in CE? */ @@ -471,7 +471,7 @@ static bool verifyconnect(curl_socket_t sockfd, int *error) #else (void)sockfd; if (error) - *error = Curl_ourerrno(); + *error = Curl_sockerrno(); #endif return rc; } @@ -610,7 +610,7 @@ CURLcode Curl_is_connected(struct connectdata *conn, infof(data, "Connection failed\n"); if(trynextip(conn, sockindex, connected)) { - error = Curl_ourerrno(); + error = Curl_sockerrno(); data->state.os_errno = error; failf(data, "Failed connect to %s:%d; %s", conn->host.name, conn->port, Curl_strerror(conn,error)); @@ -642,7 +642,7 @@ static void tcpnodelay(struct connectdata *conn, if(setsockopt(sockfd, proto, TCP_NODELAY, (void *)&onoff, sizeof(onoff)) < 0) infof(data, "Could not set TCP_NODELAY: %s\n", - Curl_strerror(conn, Curl_ourerrno())); + Curl_strerror(conn, Curl_sockerrno())); else infof(data,"TCP_NODELAY set\n"); #else @@ -664,7 +664,7 @@ static void nosigpipe(struct connectdata *conn, if(setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&onoff, sizeof(onoff)) < 0) infof(data, "Could not set SO_NOSIGPIPE: %s\n", - Curl_strerror(conn, Curl_ourerrno())); + Curl_strerror(conn, Curl_sockerrno())); } #else #define nosigpipe(x,y) @@ -717,7 +717,7 @@ singleipconnect(struct connectdata *conn, rc = 0; if(-1 == rc) { - error = Curl_ourerrno(); + error = Curl_sockerrno(); switch (error) { case EINPROGRESS: diff --git a/lib/connect.h b/lib/connect.h index 50a9e3464..0f593817f 100644 --- a/lib/connect.h +++ b/lib/connect.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2005, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2006, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -37,7 +37,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, bool *connected /* truly connected? */ ); -int Curl_ourerrno(void); +int Curl_sockerrno(void); CURLcode Curl_store_ip_addr(struct connectdata *conn); diff --git a/lib/dict.c b/lib/dict.c index 1c687292f..b7efa02a1 100644 --- a/lib/dict.c +++ b/lib/dict.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2005, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2006, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -38,8 +38,6 @@ #include #endif -#include - #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) #include #include diff --git a/lib/file.c b/lib/file.c index d39b12d43..7415d8a78 100644 --- a/lib/file.c +++ b/lib/file.c @@ -37,8 +37,6 @@ #include #endif -#include - #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) #include #include diff --git a/lib/ftp.c b/lib/ftp.c index 9b6ba2154..8f328ab91 100644 --- a/lib/ftp.c +++ b/lib/ftp.c @@ -29,7 +29,6 @@ #include #include #include -#include #ifdef HAVE_UNISTD_H #include @@ -60,10 +59,6 @@ #endif #endif -#if defined(WIN32) && defined(__GNUC__) || defined(__MINGW32__) -#include -#endif - #if (defined(NETWARE) && defined(__NOVELL_LIBC__)) #undef in_addr_t #define in_addr_t unsigned long @@ -492,7 +487,8 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */ switch (Curl_select(sockfd, CURL_SOCKET_BAD, interval_ms)) { case -1: /* select() error, stop reading */ result = CURLE_RECV_ERROR; - failf(data, "FTP response aborted due to select() error: %d", errno); + failf(data, "FTP response aborted due to select() error: %d", + Curl_sockerrno()); break; case 0: /* timeout */ if(Curl_pgrsUpdate(conn)) @@ -871,7 +867,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn, portsock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (portsock == CURL_SOCKET_BAD) { - error = Curl_ourerrno(); + error = Curl_sockerrno(); continue; } break; @@ -903,7 +899,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn, ((struct sockaddr_in6 *)sa)->sin6_port =0; if(bind(portsock, (struct sockaddr *)sa, sslen) < 0) { - failf(data, "bind failed: %s", Curl_strerror(conn, Curl_ourerrno())); + failf(data, "bind failed: %s", Curl_strerror(conn, Curl_sockerrno())); sclose(portsock); return CURLE_FTP_PORT_FAILED; } @@ -914,14 +910,14 @@ static CURLcode ftp_state_use_port(struct connectdata *conn, sslen = sizeof(ss); if(getsockname(portsock, (struct sockaddr *)sa, &sslen)<0) { failf(data, "getsockname() failed: %s", - Curl_strerror(conn, Curl_ourerrno()) ); + Curl_strerror(conn, Curl_sockerrno()) ); return CURLE_FTP_PORT_FAILED; } /* step 4, listen on the socket */ if (listen(portsock, 1) < 0) { - error = Curl_ourerrno(); + error = Curl_sockerrno(); sclose(portsock); failf(data, "socket failure: %s", Curl_strerror(conn, error)); return CURLE_FTP_PORT_FAILED; diff --git a/lib/hostares.c b/lib/hostares.c index 6ea6e51d5..0f438477c 100644 --- a/lib/hostares.c +++ b/lib/hostares.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2005, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2006, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -24,7 +24,6 @@ #include "setup.h" #include -#include #ifdef HAVE_MALLOC_H /* Win32 */ #include @@ -208,7 +207,7 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn, break; tvp = ares_timeout(data->state.areschannel, &store, &tv); count = select(nfds, &read_fds, &write_fds, NULL, tvp); - if (count < 0 && errno != EINVAL) + if (count < 0 && Curl_sockerrno() != EINVAL) break; ares_process(data->state.areschannel, &read_fds, &write_fds); diff --git a/lib/hostasyn.c b/lib/hostasyn.c index f9e9edbef..63d138934 100644 --- a/lib/hostasyn.c +++ b/lib/hostasyn.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2005, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2006, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -24,7 +24,6 @@ #include "setup.h" #include -#include #ifdef HAVE_MALLOC_H /* Win32 */ #include diff --git a/lib/hostip.c b/lib/hostip.c index 407c6b2f8..ca08524ea 100644 --- a/lib/hostip.c +++ b/lib/hostip.c @@ -24,7 +24,6 @@ #include "setup.h" #include -#include #ifdef HAVE_MALLOC_H /* Win32 */ #include diff --git a/lib/hostip6.c b/lib/hostip6.c index 693b98e4c..2168f255f 100644 --- a/lib/hostip6.c +++ b/lib/hostip6.c @@ -24,7 +24,6 @@ #include "setup.h" #include -#include #ifdef HAVE_MALLOC_H #include diff --git a/lib/hostsyn.c b/lib/hostsyn.c index 30dc4963a..fecde5f63 100644 --- a/lib/hostsyn.c +++ b/lib/hostsyn.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2005, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2006, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -24,7 +24,6 @@ #include "setup.h" #include -#include #ifdef HAVE_MALLOC_H #include diff --git a/lib/http.c b/lib/http.c index 5a43f2478..3b6d57977 100644 --- a/lib/http.c +++ b/lib/http.c @@ -37,8 +37,6 @@ #include #endif -#include - #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) #include #include diff --git a/lib/http_negotiate.c b/lib/http_negotiate.c index f407d5090..70062f85a 100644 --- a/lib/http_negotiate.c +++ b/lib/http_negotiate.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2005, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2006, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -34,7 +34,6 @@ #include #include #include -#include #include "urldata.h" #include "sendf.h" diff --git a/lib/sendf.c b/lib/sendf.c index a9cb58363..c922ce38e 100644 --- a/lib/sendf.c +++ b/lib/sendf.c @@ -335,7 +335,7 @@ CURLcode Curl_write(struct connectdata *conn, bytes_written = (ssize_t)swrite(sockfd, mem, len); if(-1 == bytes_written) { - int err = Curl_ourerrno(); + int err = Curl_sockerrno(); if( #ifdef WSAEWOULDBLOCK @@ -466,7 +466,7 @@ int Curl_read(struct connectdata *conn, /* connection data */ nread = sread(sockfd, buf, buffersize); if(-1 == nread) { - int err = Curl_ourerrno(); + int err = Curl_sockerrno(); #ifdef WIN32 if(WSAEWOULDBLOCK == err) #else diff --git a/lib/ssluse.c b/lib/ssluse.c index 1623f9822..ce1947bac 100644 --- a/lib/ssluse.c +++ b/lib/ssluse.c @@ -1611,7 +1611,7 @@ Curl_ossl_connect_common(struct connectdata *conn, } else { /* anything that gets here is fatally bad */ - failf(data, "select on SSL socket, errno: %d", Curl_ourerrno()); + failf(data, "select on SSL socket, errno: %d", Curl_sockerrno()); return CURLE_SSL_CONNECT_ERROR; } } /* while()-loop for the select() */ @@ -1691,7 +1691,7 @@ int Curl_ossl_send(struct connectdata *conn, return 0; case SSL_ERROR_SYSCALL: failf(conn->data, "SSL_write() returned SYSCALL, errno = %d\n", - Curl_ourerrno()); + Curl_sockerrno()); return -1; case SSL_ERROR_SSL: /* A failure in the SSL library occurred, usually a protocol error. @@ -1743,7 +1743,7 @@ ssize_t Curl_ossl_recv(struct connectdata *conn, /* connection data */ sslerror = ERR_get_error(); failf(conn->data, "SSL read: %s, errno %d", ERR_error_string(sslerror, error_buffer), - Curl_ourerrno() ); + Curl_sockerrno() ); return -1; } } diff --git a/lib/telnet.c b/lib/telnet.c index 2384dda5b..a609cd092 100644 --- a/lib/telnet.c +++ b/lib/telnet.c @@ -36,7 +36,6 @@ #ifdef HAVE_SYS_STAT_H #include #endif -#include #if defined(WIN32) #include diff --git a/lib/tftp.c b/lib/tftp.c index 9c459a975..d8a23b036 100644 --- a/lib/tftp.c +++ b/lib/tftp.c @@ -582,7 +582,7 @@ CURLcode Curl_tftp_connect(struct connectdata *conn, bool *done) conn->ip_addr->ai_addrlen); if(rc) { failf(conn->data, "bind() failed; %s\n", - Curl_strerror(conn,Curl_ourerrno())); + Curl_strerror(conn, Curl_sockerrno())); return CURLE_COULDNT_CONNECT; } @@ -645,7 +645,7 @@ CURLcode Curl_tftp(struct connectdata *conn, bool *done) if(rc == -1) { /* bail out */ - int error = Curl_ourerrno(); + int error = Curl_sockerrno(); failf(data, "%s\n", Curl_strerror(conn, error)); event = TFTP_EVENT_ERROR; }