diff --git a/.github/scripts/codespell-ignore.words b/.github/scripts/codespell-ignore.words index b64de09d2b52..1a5e106400a6 100644 --- a/.github/scripts/codespell-ignore.words +++ b/.github/scripts/codespell-ignore.words @@ -4,7 +4,6 @@ anonymou aNULL bu -Buss clen CNA hel diff --git a/.github/scripts/codespell.sh b/.github/scripts/codespell.sh index a14d36a53be8..ac5f27dc479f 100755 --- a/.github/scripts/codespell.sh +++ b/.github/scripts/codespell.sh @@ -14,6 +14,7 @@ codespell \ --skip 'docs/THANKS' \ --skip 'projects/OS400/*' \ --skip 'projects/vms/*' \ + --skip 'RELEASE-NOTES' \ --skip 'scripts/wcurl' \ --ignore-regex '.*spellchecker:disable-line' \ --ignore-words '.github/scripts/codespell-ignore.words' \ diff --git a/CMake/win32-cache.cmake b/CMake/win32-cache.cmake index 3ddbfce7d385..c4ee6fd1b9b4 100644 --- a/CMake/win32-cache.cmake +++ b/CMake/win32-cache.cmake @@ -154,7 +154,6 @@ set(HAVE_SIGSETJMP 0) set(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1) set(HAVE_SOCKET 1) set(HAVE_SOCKETPAIR 0) -set(HAVE_STRDUP 1) set(HAVE_STRERROR_R 0) set(HAVE_STROPTS_H 0) set(HAVE_STRUCT_SOCKADDR_STORAGE 1) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8103f98aec41..20cd74542b4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -193,9 +193,6 @@ if(WIN32) # Apply to all feature checks list(APPEND CMAKE_REQUIRED_DEFINITIONS "-DWIN32_LEAN_AND_MEAN") - if(MSVC) - list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_CRT_NONSTDC_NO_DEPRECATE") # for strdup() detection - endif() set(CURL_TARGET_WINDOWS_VERSION "" CACHE STRING "Minimum target Windows version as hex string") if(CURL_TARGET_WINDOWS_VERSION) @@ -1537,7 +1534,6 @@ check_symbol_exists("send" "${CURL_INCLUDES}" HAVE_SEND) # proto/bsd check_function_exists("sendmsg" HAVE_SENDMSG) check_function_exists("sendmmsg" HAVE_SENDMMSG) check_symbol_exists("select" "${CURL_INCLUDES}" HAVE_SELECT) # proto/bsdsocket.h sys/select.h sys/socket.h -check_symbol_exists("strdup" "string.h" HAVE_STRDUP) check_symbol_exists("memrchr" "string.h" HAVE_MEMRCHR) check_symbol_exists("alarm" "unistd.h" HAVE_ALARM) check_symbol_exists("fcntl" "fcntl.h" HAVE_FCNTL) @@ -1575,11 +1571,14 @@ check_function_exists("getrlimit" HAVE_GETRLIMIT) check_function_exists("setlocale" HAVE_SETLOCALE) check_function_exists("setrlimit" HAVE_SETRLIMIT) -if(NOT WIN32) +if(WIN32) + set(HAVE_STRDUP 1) # to not define local implementation. curl uses _strdup() on Windows. +else() check_function_exists("if_nametoindex" HAVE_IF_NAMETOINDEX) # net/if.h check_function_exists("realpath" HAVE_REALPATH) check_function_exists("sched_yield" HAVE_SCHED_YIELD) check_symbol_exists("strcasecmp" "string.h" HAVE_STRCASECMP) + check_symbol_exists("strdup" "string.h" HAVE_STRDUP) check_symbol_exists("stricmp" "string.h" HAVE_STRICMP) check_symbol_exists("strcmpi" "string.h" HAVE_STRCMPI) endif() diff --git a/docs/examples/.checksrc b/docs/examples/.checksrc index 8c7b0c901e80..a9c6b4ed503f 100644 --- a/docs/examples/.checksrc +++ b/docs/examples/.checksrc @@ -5,6 +5,7 @@ allowfunc atoi allowfunc atol allowfunc calloc +allowfunc close allowfunc fclose allowfunc fdopen allowfunc fopen diff --git a/docs/internals/CODE_STYLE.md b/docs/internals/CODE_STYLE.md index 8be6592df5b8..6167eaad001f 100644 --- a/docs/internals/CODE_STYLE.md +++ b/docs/internals/CODE_STYLE.md @@ -353,6 +353,7 @@ This is the full list of functions generally banned. atoi atol calloc + close CreateFile CreateFileA CreateFileW diff --git a/lib/cf-socket.c b/lib/cf-socket.c index ebad57f371d0..8aa211367bfa 100644 --- a/lib/cf-socket.c +++ b/lib/cf-socket.c @@ -349,7 +349,7 @@ static CURLcode socket_open(struct Curl_easy *data, if(fcntl(*sockfd, F_SETFD, FD_CLOEXEC) < 0) { failf(data, "fcntl set CLOEXEC: %s", curlx_strerror(SOCKERRNO, errbuf, sizeof(errbuf))); - close(*sockfd); + sclose(*sockfd); *sockfd = CURL_SOCKET_BAD; return CURLE_COULDNT_CONNECT; } diff --git a/lib/curl_fopen.c b/lib/curl_fopen.c index 9559c0d0c4f5..3d5ee5002dbc 100644 --- a/lib/curl_fopen.c +++ b/lib/curl_fopen.c @@ -147,7 +147,7 @@ CURLcode Curl_fopen(struct Curl_easy *data, const char *filename, fail: if(fd != -1) { - close(fd); + curlx_close(fd); unlink(tempstore); } diff --git a/lib/curl_setup.h b/lib/curl_setup.h index 750ba90d2d4c..178694c66edf 100644 --- a/lib/curl_setup.h +++ b/lib/curl_setup.h @@ -89,10 +89,6 @@ #ifdef _MSC_VER /* Disable Visual Studio warnings: 4127 "conditional expression is constant" */ #pragma warning(disable:4127) -/* Avoid VS2005 and upper complaining about portable C functions. */ -#ifndef _CRT_NONSTDC_NO_DEPRECATE /* mingw-w64 v2+. MS SDK ~10+/~VS2017+. */ -#define _CRT_NONSTDC_NO_DEPRECATE /* for close(), fileno(), unlink(), etc. */ -#endif #ifndef _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS /* for getenv(), tests: sscanf() */ #endif @@ -808,6 +804,13 @@ # define read(fd, buf, count) (ssize_t)_read(fd, buf, curlx_uztoui(count)) # undef write # define write(fd, buf, count) (ssize_t)_write(fd, buf, curlx_uztoui(count)) +/* Avoid VS2005+ _CRT_NONSTDC_NO_DEPRECATE warnings about non-portable funcs */ +# undef fileno +# define fileno(fh) _fileno(fh) +# undef unlink +# define unlink(fn) _unlink(fn) +# undef isatty +# define isatty(fd) _isatty(fd) #endif /* diff --git a/lib/curlx/fopen.h b/lib/curlx/fopen.h index a395590d8e0f..e78a474b975c 100644 --- a/lib/curlx/fopen.h +++ b/lib/curlx/fopen.h @@ -50,14 +50,18 @@ int curlx_win32_open(const char *filename, int oflag, ...); int curlx_win32_rename(const char *oldpath, const char *newpath); #define CURLX_FOPEN_LOW(fname, mode) curlx_win32_fopen(fname, mode) #define CURLX_FREOPEN_LOW(fname, mode, fh) curlx_win32_freopen(fname, mode, fh) +#define CURLX_FDOPEN_LOW _fdopen #define curlx_stat(fname, stp) curlx_win32_stat(fname, stp) #define curlx_open curlx_win32_open +#define curlx_close _close #define curlx_rename curlx_win32_rename #else #define CURLX_FOPEN_LOW fopen #define CURLX_FREOPEN_LOW freopen +#define CURLX_FDOPEN_LOW fdopen #define curlx_stat(fname, stp) stat(fname, stp) #define curlx_open open +#define curlx_close close #define curlx_rename rename #endif @@ -71,7 +75,7 @@ int curlx_win32_rename(const char *oldpath, const char *newpath); #else #define curlx_fopen CURLX_FOPEN_LOW #define curlx_freopen CURLX_FREOPEN_LOW -#define curlx_fdopen fdopen +#define curlx_fdopen CURLX_FDOPEN_LOW #define curlx_fclose fclose #endif diff --git a/lib/easy.c b/lib/easy.c index 51936660cee2..cc505b5b3f82 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -99,12 +99,10 @@ static curl_simple_lock s_lock = CURL_SIMPLE_LOCK_INIT; * ways, but at this point it must be defined as the system-supplied strdup * so the callback pointer is initialized correctly. */ -#ifdef HAVE_STRDUP #ifdef _WIN32 #define system_strdup _strdup -#else +#elif defined(HAVE_STRDUP) #define system_strdup strdup -#endif #else #define system_strdup Curl_strdup #endif diff --git a/lib/file.c b/lib/file.c index 753aed2dbe30..d4cfedff1743 100644 --- a/lib/file.c +++ b/lib/file.c @@ -87,7 +87,7 @@ static void file_cleanup(struct FILEPROTO *file) Curl_safefree(file->freepath); file->path = NULL; if(file->fd != -1) { - close(file->fd); + curlx_close(file->fd); file->fd = -1; } } @@ -312,7 +312,7 @@ static CURLcode file_upload(struct Curl_easy *data, /* treat the negative resume offset value as the case of "-" */ if(data->state.resume_from < 0) { if(fstat(fd, &file_stat)) { - close(fd); + curlx_close(fd); failf(data, "cannot get the size of %s", file->path); return CURLE_WRITE_ERROR; } @@ -367,7 +367,7 @@ static CURLcode file_upload(struct Curl_easy *data, result = Curl_pgrsUpdate(data); out: - close(fd); + curlx_close(fd); Curl_multi_xfer_ulbuf_release(data, xfer_ulbuf); return result; diff --git a/lib/memdebug.c b/lib/memdebug.c index 2851bcefa9c6..457034ebdae2 100644 --- a/lib/memdebug.c +++ b/lib/memdebug.c @@ -497,8 +497,7 @@ ALLOC_FUNC FILE *curl_dbg_fdopen(int filedes, const char *mode, int line, const char *source) { - /* !checksrc! disable BANNEDFUNC 1 */ - FILE *res = fdopen(filedes, mode); + FILE *res = CURLX_FDOPEN_LOW(filedes, mode); if(source) curl_dbg_log("FILE %s:%d fdopen(\"%d\",\"%s\") = %p\n", source, line, filedes, mode, (void *)res); diff --git a/lib/socketpair.c b/lib/socketpair.c index ec45926237e8..cefbe8523866 100644 --- a/lib/socketpair.c +++ b/lib/socketpair.c @@ -64,8 +64,8 @@ static int wakeup_pipe(curl_socket_t socks[2], bool nonblocking) #ifdef HAVE_FCNTL if(fcntl(socks[0], F_SETFD, FD_CLOEXEC) || fcntl(socks[1], F_SETFD, FD_CLOEXEC)) { - close(socks[0]); - close(socks[1]); + sclose(socks[0]); + sclose(socks[1]); socks[0] = socks[1] = CURL_SOCKET_BAD; return -1; } @@ -73,8 +73,8 @@ static int wakeup_pipe(curl_socket_t socks[2], bool nonblocking) if(nonblocking) { if(curlx_nonblock(socks[0], TRUE) < 0 || curlx_nonblock(socks[1], TRUE) < 0) { - close(socks[0]); - close(socks[1]); + sclose(socks[0]); + sclose(socks[1]); socks[0] = socks[1] = CURL_SOCKET_BAD; return -1; } @@ -107,8 +107,8 @@ static int wakeup_socketpair(curl_socket_t socks[2], bool nonblocking) if(nonblocking) { if(curlx_nonblock(socks[0], TRUE) < 0 || curlx_nonblock(socks[1], TRUE) < 0) { - close(socks[0]); - close(socks[1]); + sclose(socks[0]); + sclose(socks[1]); return -1; } } diff --git a/lib/vquic/curl_ngtcp2.c b/lib/vquic/curl_ngtcp2.c index 57a1543be350..f624c02fa333 100644 --- a/lib/vquic/curl_ngtcp2.c +++ b/lib/vquic/curl_ngtcp2.c @@ -55,6 +55,7 @@ #include "../cf-socket.h" #include "../connect.h" #include "../progress.h" +#include "../curlx/fopen.h" #include "../curlx/dynbuf.h" #include "../http1.h" #include "../select.h" @@ -449,7 +450,7 @@ static void qlog_callback(void *user_data, uint32_t flags, ssize_t rc = write(ctx->qlogfd, data, datalen); if(rc == -1) { /* on write error, stop further write attempts */ - close(ctx->qlogfd); + curlx_close(ctx->qlogfd); ctx->qlogfd = -1; } } @@ -2140,7 +2141,7 @@ static void cf_ngtcp2_ctx_close(struct cf_ngtcp2_ctx *ctx) if(!ctx->initialized) return; if(ctx->qlogfd != -1) { - close(ctx->qlogfd); + curlx_close(ctx->qlogfd); } ctx->qlogfd = -1; Curl_vquic_tls_cleanup(&ctx->tls); diff --git a/scripts/checksrc.pl b/scripts/checksrc.pl index d065b0bc064b..2fd505b495a9 100755 --- a/scripts/checksrc.pl +++ b/scripts/checksrc.pl @@ -70,6 +70,7 @@ "atoi" => 1, "atol" => 1, "calloc" => 1, + "close" => 1, "CreateFile" => 1, "CreateFileA" => 1, "CreateFileW" => 1, diff --git a/src/tool_cb_wrt.c b/src/tool_cb_wrt.c index 17c7d80b0f3d..cc005844af06 100644 --- a/src/tool_cb_wrt.c +++ b/src/tool_cb_wrt.c @@ -89,7 +89,7 @@ bool tool_create_output_file(struct OutStruct *outs, if(fd != -1) { file = curlx_fdopen(fd, "wb"); if(!file) - close(fd); + curlx_close(fd); } } diff --git a/src/tool_dirhie.c b/src/tool_dirhie.c index 945d8796089d..3f5c987e9547 100644 --- a/src/tool_dirhie.c +++ b/src/tool_dirhie.c @@ -23,14 +23,13 @@ ***************************************************************************/ #include "tool_setup.h" -#ifdef _WIN32 -#include -#endif - #include "tool_dirhie.h" #include "tool_msgs.h" -#if defined(_WIN32) || (defined(MSDOS) && !defined(__DJGPP__)) +#ifdef _WIN32 +# include +# define mkdir(x, y) _mkdir(x) +#elif defined(MSDOS) && !defined(__DJGPP__) # define mkdir(x, y) (mkdir)(x) #endif diff --git a/src/tool_findfile.c b/src/tool_findfile.c index 1fcd74f5a194..2745a2eb3ccf 100644 --- a/src/tool_findfile.c +++ b/src/tool_findfile.c @@ -74,7 +74,7 @@ static char *checkhome(const char *home, const char *fname, bool dotscore) int fd = curlx_open(c, O_RDONLY); if(fd >= 0) { char *path = curlx_strdup(c); - close(fd); + curlx_close(fd); curl_free(c); return path; } diff --git a/src/tool_getpass.c b/src/tool_getpass.c index a8c7cb243966..99ded8f4c5b5 100644 --- a/src/tool_getpass.c +++ b/src/tool_getpass.c @@ -187,7 +187,7 @@ char *getpass_r(const char *prompt, /* prompt to display */ } if(STDIN_FILENO != fd) - close(fd); + curlx_close(fd); return password; /* return pointer to buffer */ } diff --git a/src/tool_operate.c b/src/tool_operate.c index 13ebe83feea7..1cddf47b00bb 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -289,7 +289,7 @@ static CURLcode pre_transfer(struct per_transfer *per) { helpf("cannot open '%s'", per->uploadfile); if(per->infd != -1) { - close(per->infd); + curlx_close(per->infd); per->infd = STDIN_FILENO; } return CURLE_READ_ERROR; @@ -621,7 +621,7 @@ static CURLcode post_per_transfer(struct per_transfer *per, else #endif if(per->infdopen) - close(per->infd); + curlx_close(per->infd); if(per->skip) goto skip; diff --git a/tests/libtest/lib518.c b/tests/libtest/lib518.c index 8431ed87d734..d405c6dfa058 100644 --- a/tests/libtest/lib518.c +++ b/tests/libtest/lib518.c @@ -63,7 +63,7 @@ static void t518_close_file_descriptors(void) t518_num_open.rlim_cur < t518_num_open.rlim_max; t518_num_open.rlim_cur++) if(t518_testfd[t518_num_open.rlim_cur] > 0) - close(t518_testfd[t518_num_open.rlim_cur]); + curlx_close(t518_testfd[t518_num_open.rlim_cur]); curlx_free(t518_testfd); t518_testfd = NULL; } @@ -333,7 +333,7 @@ static int t518_test_rlimit(int keep_open) for(t518_num_open.rlim_cur = 0; t518_testfd[t518_num_open.rlim_cur] >= 0; t518_num_open.rlim_cur++) - close(t518_testfd[t518_num_open.rlim_cur]); + curlx_close(t518_testfd[t518_num_open.rlim_cur]); curlx_free(t518_testfd); t518_testfd = NULL; curlx_free(memchunk); diff --git a/tests/libtest/lib537.c b/tests/libtest/lib537.c index 436a9eb0a49b..1bf6fcba0678 100644 --- a/tests/libtest/lib537.c +++ b/tests/libtest/lib537.c @@ -60,7 +60,7 @@ static void t537_close_file_descriptors(void) t537_num_open.rlim_cur < t537_num_open.rlim_max; t537_num_open.rlim_cur++) if(t537_testfd[t537_num_open.rlim_cur] > 0) - close(t537_testfd[t537_num_open.rlim_cur]); + curlx_close(t537_testfd[t537_num_open.rlim_cur]); curlx_free(t537_testfd); t537_testfd = NULL; } @@ -334,7 +334,7 @@ static int t537_test_rlimit(int keep_open) for(t537_num_open.rlim_cur = t537_num_open.rlim_max; t537_testfd[t537_num_open.rlim_cur] >= 0; t537_num_open.rlim_cur++) { - close(t537_testfd[t537_num_open.rlim_cur]); + curlx_close(t537_testfd[t537_num_open.rlim_cur]); t537_testfd[t537_num_open.rlim_cur] = -1; } diff --git a/tests/libtest/lib568.c b/tests/libtest/lib568.c index 6106ed8598b9..8c1e5dd7fa29 100644 --- a/tests/libtest/lib568.c +++ b/tests/libtest/lib568.c @@ -75,7 +75,7 @@ static CURLcode test_lib568(const char *URL) goto test_cleanup; } fstat(sdp, &file_info); - close(sdp); + curlx_close(sdp); sdpf = curlx_fopen(libtest_arg2, "rb"); if(!sdpf) { diff --git a/tests/libtest/lib572.c b/tests/libtest/lib572.c index d1cb80479225..38edd77ecea5 100644 --- a/tests/libtest/lib572.c +++ b/tests/libtest/lib572.c @@ -93,7 +93,7 @@ static CURLcode test_lib572(const char *URL) goto test_cleanup; } fstat(params, &file_info); - close(params); + curlx_close(params); paramsf = curlx_fopen(libtest_arg2, "rb"); if(!paramsf) { diff --git a/tests/server/tftpd.c b/tests/server/tftpd.c index e1b3a8b936fa..1e0fcc9a48d7 100644 --- a/tests/server/tftpd.c +++ b/tests/server/tftpd.c @@ -849,7 +849,7 @@ static void recvtftp(struct testcase *test, const struct formats *pf) write_behind(test, pf->f_convert); /* close the output file as early as possible after upload completion */ if(test->ofile > 0) { - close(test->ofile); + curlx_close(test->ofile); test->ofile = 0; } @@ -875,7 +875,7 @@ static void recvtftp(struct testcase *test, const struct formats *pf) abort: /* make sure the output file is closed in case of abort */ if(test->ofile > 0) { - close(test->ofile); + curlx_close(test->ofile); test->ofile = 0; } return; @@ -1305,7 +1305,7 @@ static int test_tftpd(int argc, char **argv) tftpd_cleanup: if(test.ofile > 0) - close(test.ofile); + curlx_close(test.ofile); if((peer != sock) && (peer != CURL_SOCKET_BAD)) sclose(peer); diff --git a/tests/server/util.c b/tests/server/util.c index da959f3ed992..1cf62c0e762c 100644 --- a/tests/server/util.c +++ b/tests/server/util.c @@ -379,7 +379,7 @@ static void exit_signal_handler(int signum) #endif static const char msg[] = "exit_signal_handler: called\n"; (void)!write(fd, msg, sizeof(msg) - 1); - close(fd); + curlx_close(fd); } else { static const char msg[] = "exit_signal_handler: failed opening ";