diff --git a/lib/strerror.c b/lib/strerror.c index a85c216a5..83a96dda1 100644 --- a/lib/strerror.c +++ b/lib/strerror.c @@ -49,6 +49,10 @@ #include "curl_memory.h" #include "memdebug.h" +#if defined(WIN32) || defined(_WIN32_WCE) +#define PRESERVE_WINDOWS_ERROR_CODE +#endif + const char * curl_easy_strerror(CURLcode error) { @@ -432,6 +436,10 @@ curl_share_strerror(CURLSHcode error) static const char * get_winsock_error (int err, char *buf, size_t len) { +#ifdef PRESERVE_WINDOWS_ERROR_CODE + DWORD old_win_err = GetLastError(); +#endif + int old_errno = errno; const char *p; #ifndef CURL_DISABLE_VERBOSE_STRINGS @@ -611,6 +619,15 @@ get_winsock_error (int err, char *buf, size_t len) #endif strncpy(buf, p, len); buf [len-1] = '\0'; + + if(errno != old_errno) + errno = old_errno; + +#ifdef PRESERVE_WINDOWS_ERROR_CODE + if(old_win_err != GetLastError()) + SetLastError(old_win_err); +#endif + return buf; } #endif /* USE_WINSOCK */ @@ -628,19 +645,16 @@ get_winsock_error (int err, char *buf, size_t len) */ const char *Curl_strerror(struct connectdata *conn, int err) { +#ifdef PRESERVE_WINDOWS_ERROR_CODE + DWORD old_win_err = GetLastError(); +#endif + int old_errno = errno; char *buf, *p; size_t max; - int old_errno; -#ifdef WIN32 - DWORD old_win_err; -#endif + DEBUGASSERT(conn); DEBUGASSERT(err >= 0); - old_errno = errno; -#ifdef WIN32 - old_win_err = GetLastError(); -#endif buf = conn->syserr_buf; max = sizeof(conn->syserr_buf)-1; *buf = '\0'; @@ -727,12 +741,14 @@ const char *Curl_strerror(struct connectdata *conn, int err) p = strrchr(buf, '\r'); if(p && (p - buf) >= 1) *p = '\0'; -#ifdef WIN32 + + if(errno != old_errno) + errno = old_errno; + +#ifdef PRESERVE_WINDOWS_ERROR_CODE if(old_win_err != GetLastError()) SetLastError(old_win_err); #endif - if(errno != old_errno) - errno = old_errno; return buf; } @@ -740,17 +756,19 @@ const char *Curl_strerror(struct connectdata *conn, int err) #ifdef USE_WINDOWS_SSPI const char *Curl_sspi_strerror (struct connectdata *conn, int err) { +#ifdef PRESERVE_WINDOWS_ERROR_CODE + DWORD old_win_err = GetLastError(); +#endif + int old_errno = errno; + const char *txt; + char *outbuf; + size_t outmax; #ifndef CURL_DISABLE_VERBOSE_STRINGS char txtbuf[80]; char msgbuf[sizeof(conn->syserr_buf)]; char *p, *str, *msg = NULL; bool msg_formatted = FALSE; - int old_errno; - DWORD old_win_err; #endif - const char *txt; - char *outbuf; - size_t outmax; DEBUGASSERT(conn); @@ -760,9 +778,6 @@ const char *Curl_sspi_strerror (struct connectdata *conn, int err) #ifndef CURL_DISABLE_VERBOSE_STRINGS - old_errno = errno; - old_win_err = GetLastError(); - switch(err) { case SEC_E_OK: txt = "No error"; @@ -1062,12 +1077,6 @@ const char *Curl_sspi_strerror (struct connectdata *conn, int err) strncpy(outbuf, str, outmax); } - if(old_win_err != GetLastError()) - SetLastError(old_win_err); - - if(errno != old_errno) - errno = old_errno; - #else if(err == SEC_E_OK) @@ -1081,6 +1090,14 @@ const char *Curl_sspi_strerror (struct connectdata *conn, int err) outbuf[outmax] = '\0'; + if(errno != old_errno) + errno = old_errno; + +#ifdef PRESERVE_WINDOWS_ERROR_CODE + if(old_win_err != GetLastError()) + SetLastError(old_win_err); +#endif + return outbuf; } #endif /* USE_WINDOWS_SSPI */ diff --git a/tests/libtest/lib505.c b/tests/libtest/lib505.c index 0c128c666..ad5d214c6 100644 --- a/tests/libtest/lib505.c +++ b/tests/libtest/lib505.c @@ -42,7 +42,6 @@ int test(char *URL) int hd; struct_stat file_info; struct curl_slist *hl; - int error; struct curl_slist *headerlist=NULL; const char *buf_1 = "RNFR 505"; @@ -55,9 +54,8 @@ int test(char *URL) hd_src = fopen(libtest_arg2, "rb"); if(NULL == hd_src) { - error = errno; fprintf(stderr, "fopen failed with error: %d %s\n", - error, strerror(error)); + errno, strerror(errno)); fprintf(stderr, "Error opening file: %s\n", libtest_arg2); return TEST_ERR_MAJOR_BAD; /* if this happens things are major weird */ } @@ -66,9 +64,8 @@ int test(char *URL) hd = fstat(fileno(hd_src), &file_info); if(hd == -1) { /* can't open file, bail out */ - error = errno; fprintf(stderr, "fstat() failed with error: %d %s\n", - error, strerror(error)); + errno, strerror(errno)); fprintf(stderr, "ERROR: cannot open file %s\n", libtest_arg2); fclose(hd_src); return TEST_ERR_MAJOR_BAD; diff --git a/tests/libtest/lib525.c b/tests/libtest/lib525.c index f468efa25..715b7fbe2 100644 --- a/tests/libtest/lib525.c +++ b/tests/libtest/lib525.c @@ -35,7 +35,6 @@ int test(char *URL) CURL *curl = NULL; FILE *hd_src = NULL; int hd; - int error; struct_stat file_info; CURLM *m = NULL; int running; @@ -55,9 +54,8 @@ int test(char *URL) hd_src = fopen(libtest_arg2, "rb"); if(NULL == hd_src) { - error = errno; fprintf(stderr, "fopen failed with error: %d (%s)\n", - error, strerror(error)); + errno, strerror(errno)); fprintf(stderr, "Error opening file: (%s)\n", libtest_arg2); return TEST_ERR_FOPEN; } @@ -66,9 +64,8 @@ int test(char *URL) hd = fstat(fileno(hd_src), &file_info); if(hd == -1) { /* can't open file, bail out */ - error = errno; fprintf(stderr, "fstat() failed with error: %d (%s)\n", - error, strerror(error)); + errno, strerror(errno)); fprintf(stderr, "ERROR: cannot open file (%s)\n", libtest_arg2); fclose(hd_src); return TEST_ERR_FSTAT; diff --git a/tests/libtest/lib541.c b/tests/libtest/lib541.c index 9aa4a0826..94a26a4b7 100644 --- a/tests/libtest/lib541.c +++ b/tests/libtest/lib541.c @@ -38,7 +38,6 @@ int test(char *URL) FILE *hd_src; int hd; struct_stat file_info; - int error; if(!libtest_arg2) { fprintf(stderr, "Usage: \n"); @@ -47,9 +46,8 @@ int test(char *URL) hd_src = fopen(libtest_arg2, "rb"); if(NULL == hd_src) { - error = errno; fprintf(stderr, "fopen failed with error: %d %s\n", - error, strerror(error)); + errno, strerror(errno)); fprintf(stderr, "Error opening file: %s\n", libtest_arg2); return -2; /* if this happens things are major weird */ } @@ -58,9 +56,8 @@ int test(char *URL) hd = fstat(fileno(hd_src), &file_info); if(hd == -1) { /* can't open file, bail out */ - error = errno; fprintf(stderr, "fstat() failed with error: %d %s\n", - error, strerror(error)); + errno, strerror(errno)); fprintf(stderr, "ERROR: cannot open file %s\n", libtest_arg2); fclose(hd_src); return TEST_ERR_MAJOR_BAD; diff --git a/tests/libtest/lib582.c b/tests/libtest/lib582.c index 23772be59..f55e5de71 100644 --- a/tests/libtest/lib582.c +++ b/tests/libtest/lib582.c @@ -228,7 +228,6 @@ int test(char *URL) CURL *curl = NULL; FILE *hd_src = NULL; int hd; - int error; struct_stat file_info; CURLM *m = NULL; struct ReadWriteSockets sockets = {{NULL, 0, 0}, {NULL, 0, 0}}; @@ -244,9 +243,8 @@ int test(char *URL) hd_src = fopen(libtest_arg2, "rb"); if(NULL == hd_src) { - error = errno; fprintf(stderr, "fopen() failed with error: %d (%s)\n", - error, strerror(error)); + errno, strerror(errno)); fprintf(stderr, "Error opening file: (%s)\n", libtest_arg2); return TEST_ERR_FOPEN; } @@ -255,9 +253,8 @@ int test(char *URL) hd = fstat(fileno(hd_src), &file_info); if(hd == -1) { /* can't open file, bail out */ - error = errno; fprintf(stderr, "fstat() failed with error: %d (%s)\n", - error, strerror(error)); + errno, strerror(errno)); fprintf(stderr, "ERROR: cannot open file (%s)\n", libtest_arg2); fclose(hd_src); return TEST_ERR_FSTAT; diff --git a/tests/libtest/lib591.c b/tests/libtest/lib591.c index c04d3fbae..53ede3fcd 100644 --- a/tests/libtest/lib591.c +++ b/tests/libtest/lib591.c @@ -44,15 +44,13 @@ int test(char *URL) int msgs_left; CURLMsg *msg; FILE *upload = NULL; - int error; start_test_timing(); upload = fopen(libtest_arg3, "rb"); if(!upload) { - error = errno; fprintf(stderr, "fopen() failed with error: %d (%s)\n", - error, strerror(error)); + errno, strerror(errno)); fprintf(stderr, "Error opening file: (%s)\n", libtest_arg3); return TEST_ERR_FOPEN; }