From d7b105a2240a2c1dcd789cec21cc985c709747eb Mon Sep 17 00:00:00 2001 From: dartraiden Date: Sun, 1 Nov 2020 23:02:54 +0300 Subject: libcurl: update to 7.73.0 --- libs/libcurl/docs/CHANGES | 10230 ++++++++++++++-------------- libs/libcurl/docs/THANKS | 31 + libs/libcurl/include/README | 18 - libs/libcurl/include/README.md | 14 + libs/libcurl/include/curl/curl.h | 140 +- libs/libcurl/include/curl/curlver.h | 8 +- libs/libcurl/include/curl/options.h | 68 + libs/libcurl/include/curl/typecheck-gcc.h | 3 +- libs/libcurl/libcurl.vcxproj | 12 +- libs/libcurl/libcurl.vcxproj.filters | 18 +- libs/libcurl/src/CMakeLists.txt | 9 - libs/libcurl/src/Makefile.Watcom | 274 - libs/libcurl/src/Makefile.am | 7 +- libs/libcurl/src/Makefile.in | 132 +- libs/libcurl/src/Makefile.inc | 8 +- libs/libcurl/src/Makefile.m32 | 7 +- libs/libcurl/src/altsvc.c | 22 +- libs/libcurl/src/altsvc.h | 7 +- libs/libcurl/src/asyn-ares.c | 4 +- libs/libcurl/src/base64.c | 5 +- libs/libcurl/src/checksrc.pl | 23 +- libs/libcurl/src/config-symbian.h | 793 --- libs/libcurl/src/config-win32.h | 7 - libs/libcurl/src/conncache.c | 34 +- libs/libcurl/src/conncache.h | 4 +- libs/libcurl/src/connect.c | 25 +- libs/libcurl/src/content_encoding.c | 4 - libs/libcurl/src/curl_config.h.cmake | 4 +- libs/libcurl/src/curl_config.h.in | 20 +- libs/libcurl/src/curl_get_line.c | 6 +- libs/libcurl/src/curl_gethostname.c | 4 +- libs/libcurl/src/curl_gethostname.h | 4 +- libs/libcurl/src/curl_krb5.h | 51 + libs/libcurl/src/curl_ntlm_core.c | 8 +- libs/libcurl/src/curl_ntlm_core.h | 8 +- libs/libcurl/src/curl_path.c | 4 +- libs/libcurl/src/curl_printf.h | 2 +- libs/libcurl/src/curl_rtmp.c | 8 +- libs/libcurl/src/curl_sec.h | 51 - libs/libcurl/src/curl_setup.h | 26 +- libs/libcurl/src/curl_threads.c | 6 +- libs/libcurl/src/dict.c | 96 +- libs/libcurl/src/doh.c | 9 +- libs/libcurl/src/dynbuf.c | 48 +- libs/libcurl/src/dynbuf.h | 25 + libs/libcurl/src/easy.c | 31 +- libs/libcurl/src/easygetopt.c | 96 + libs/libcurl/src/easyoptions.c | 347 + libs/libcurl/src/easyoptions.h | 35 + libs/libcurl/src/file.c | 4 +- libs/libcurl/src/fileinfo.h | 4 +- libs/libcurl/src/ftp.c | 420 +- libs/libcurl/src/ftp.h | 1 - libs/libcurl/src/ftplistparser.c | 8 +- libs/libcurl/src/getinfo.c | 3 + libs/libcurl/src/gopher.c | 5 +- libs/libcurl/src/hash.c | 82 +- libs/libcurl/src/hash.h | 48 +- libs/libcurl/src/hostip.c | 6 +- libs/libcurl/src/hostip.h | 8 +- libs/libcurl/src/http.c | 4 +- libs/libcurl/src/http2.c | 119 +- libs/libcurl/src/http_proxy.c | 1 - libs/libcurl/src/imap.c | 37 +- libs/libcurl/src/imap.h | 5 +- libs/libcurl/src/inet_pton.c | 4 +- libs/libcurl/src/krb5.c | 596 +- libs/libcurl/src/ldap.c | 68 +- libs/libcurl/src/libcurl.plist | 6 +- libs/libcurl/src/llist.c | 12 +- libs/libcurl/src/llist.h | 28 +- libs/libcurl/src/memdebug.c | 51 - libs/libcurl/src/mprintf.c | 55 +- libs/libcurl/src/mqtt.c | 11 +- libs/libcurl/src/mqtt.h | 2 +- libs/libcurl/src/multi.c | 231 +- libs/libcurl/src/multihandle.h | 18 +- libs/libcurl/src/openldap.c | 4 +- libs/libcurl/src/parsedate.c | 57 +- libs/libcurl/src/pingpong.c | 55 +- libs/libcurl/src/pingpong.h | 4 + libs/libcurl/src/pop3.c | 3 + libs/libcurl/src/progress.c | 9 +- libs/libcurl/src/progress.h | 4 +- libs/libcurl/src/rtsp.c | 1 + libs/libcurl/src/security.c | 579 -- libs/libcurl/src/select.c | 175 +- libs/libcurl/src/select.h | 15 +- libs/libcurl/src/sendf.c | 58 +- libs/libcurl/src/sendf.h | 4 +- libs/libcurl/src/setopt.c | 248 +- libs/libcurl/src/setup-win32.h | 3 +- libs/libcurl/src/share.c | 2 +- libs/libcurl/src/share.h | 6 +- libs/libcurl/src/smb.c | 11 +- libs/libcurl/src/smb.h | 9 +- libs/libcurl/src/smtp.c | 3 + libs/libcurl/src/socketpair.c | 4 +- libs/libcurl/src/socks.c | 165 +- libs/libcurl/src/socks.h | 26 +- libs/libcurl/src/strerror.c | 40 +- libs/libcurl/src/system_win32.c | 11 +- libs/libcurl/src/telnet.c | 132 +- libs/libcurl/src/tftp.c | 1 + libs/libcurl/src/url.c | 176 +- libs/libcurl/src/urlapi.c | 6 +- libs/libcurl/src/urldata.h | 33 +- libs/libcurl/src/version.c | 17 +- libs/libcurl/src/vquic/ngtcp2.c | 21 +- libs/libcurl/src/vquic/quiche.c | 1 + libs/libcurl/src/vssh/libssh.c | 36 +- libs/libcurl/src/vssh/libssh2.c | 137 +- libs/libcurl/src/vtls/gskit.c | 2 +- libs/libcurl/src/vtls/gtls.c | 63 +- libs/libcurl/src/vtls/mbedtls.c | 14 +- libs/libcurl/src/vtls/mesalink.c | 22 +- libs/libcurl/src/vtls/nss.c | 65 +- libs/libcurl/src/vtls/openssl.c | 110 +- libs/libcurl/src/vtls/schannel.c | 55 +- libs/libcurl/src/vtls/schannel.h | 10 +- libs/libcurl/src/vtls/sectransp.c | 20 +- libs/libcurl/src/vtls/vtls.c | 15 +- libs/libcurl/src/vtls/vtls.h | 16 +- libs/libcurl/src/vtls/wolfssl.c | 22 +- libs/libcurl/src/wildcard.h | 12 +- 125 files changed, 8275 insertions(+), 8840 deletions(-) delete mode 100644 libs/libcurl/include/README create mode 100644 libs/libcurl/include/README.md create mode 100644 libs/libcurl/include/curl/options.h delete mode 100644 libs/libcurl/src/Makefile.Watcom delete mode 100644 libs/libcurl/src/config-symbian.h create mode 100644 libs/libcurl/src/curl_krb5.h delete mode 100644 libs/libcurl/src/curl_sec.h create mode 100644 libs/libcurl/src/easygetopt.c create mode 100644 libs/libcurl/src/easyoptions.c create mode 100644 libs/libcurl/src/easyoptions.h delete mode 100644 libs/libcurl/src/security.c (limited to 'libs/libcurl') diff --git a/libs/libcurl/docs/CHANGES b/libs/libcurl/docs/CHANGES index 51a99f4d52..b5bc305951 100644 --- a/libs/libcurl/docs/CHANGES +++ b/libs/libcurl/docs/CHANGES @@ -6,7495 +6,7447 @@ Changelog -Version 7.72.0 (19 Aug 2020) +Version 7.73.0 (14 Oct 2020) -Daniel Stenberg (19 Aug 2020) +Daniel Stenberg (14 Oct 2020) - RELEASE-NOTES: synced - The curl 7.72.0 release + for 7.73.0 -- THANKS: add names from curl 7.72.0 release +- THANKS: from 7.73.0 and .mailmap fixes -Jay Satiro (18 Aug 2020) -- KNOWN_BUGS: Schannel TLS 1.2 handshake bug in old Windows versions +- mailmap: fixups of some contributors + +- projects/build-wolfssl.bat: fix the copyright year range + +Marc Hoersken (14 Oct 2020) +- [Sergei Nikulov brought this change] + + CI/tests: fix invocation of tests for CMake builds - Reported-by: plujon@users.noreply.github.com + Update appveyor.yml to set env variable TFLAGS and run tests + Remove curly braces due to CMake error (${TFLAGS} -> $TFLAGS) + Move testdeps build to build step (per review comments) - Closes https://github.com/curl/curl/issues/5488 + Reviewed-by: Marc Hörsken + + Closes #6066 + Fixes #6052 -Daniel Stenberg (17 Aug 2020) -- Curl_easy: remember last connection by id, not by pointer +- tests/server/util.c: fix support for Windows Unicode builds - CVE-2020-8231 + Detected via #6066 + Closes #6070 + +Daniel Stenberg (13 Oct 2020) +- [Jay Satiro brought this change] + + strerror: Revert to local codepage for Windows error string - Bug: https://curl.haxx.se/docs/CVE-2020-8231.html + - Change get_winapi_error() to return the error string in the local + codepage instead of UTF-8 encoding. - Reported-by: Marc Aldorasi - Closes #5824 + Two weeks ago bed5f84 fixed get_winapi_error() to work on xbox, but it + also changed the error string's encoding from local codepage to UTF-8. + + We return the local codepage version of the error string because if it + is output to the user's terminal it will likely be with functions which + expect the local codepage (eg fprintf, failf, infof). + + This is essentially a partial revert of bed5f84. The support for xbox + remains but the error string is reverted back to local codepage. + + Ref: https://github.com/curl/curl/pull/6005 + + Reviewed-by: Marcel Raad + Closes #6065 -- examples/rtsp.c: correct the copyright year +Marc Hoersken (13 Oct 2020) +- CI/tests: use verification curl for test reporting APIs + + Avoid using our own, potentially installed, curl for + the test reporting APIs in case it is broken. + + Reviewed-by: Daniel Stenberg + + Preparation for #6049 + Closes #6063 -- RELEASE-PROCEDURE.md: add more future release dates +Viktor Szakats (12 Oct 2020) +- windows: fix comparison of mismatched types warning + + clang 10, mingw-w64: + ``` + vtls/openssl.c:2917:33: warning: comparison of integers of different signs: 'DWORD' (aka 'unsigned long') and 'HRESULT' (aka 'long') + [-Wsign-compare] + if(GetLastError() != CRYPT_E_NOT_FOUND) + ~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~ + ``` + + Approved-by: Daniel Stenberg + Closes #6062 -- [H3RSKO brought this change] +Daniel Stenberg (11 Oct 2020) +- [Viktor Szakats brought this change] - docs: change "web site" to "website" + src/Makefile.m32: fix undefined curlx_dyn_* errors - According to wikipedia: - - While "web site" was the original spelling, this variant has become - rarely used, and "website" has become the standard spelling + by linking `lib/dynbuf.c` when building a static curl binary. + Previously this source file was only included when building + a dynamic curl binary. This was likely possibly because no + functions from the `src/Makefile.inc` / `CURLX_CFILES` sources + were actually required for a curl tool build. This has + recently changed with the introduction of `curlx_dyn_*()` + memory functions and their use by the tool sources. - Closes #5822 + Closes #6060 -- [Bevan Weiss brought this change] +- HISTORY: curl verifies SSL certs by default since version 7.10 - CMake: don't complain about missing nroff +Marc Hoersken (8 Oct 2020) +- runtests.pl: use $LIBDIR variable instead of hardcoded path - The curl_nroff_check() was always being called, and complaining if - *NROFF wasn't found, even when not making the manual. + Reviewed-by: Daniel Stenberg + Closes #6051 + +Daniel Stenberg (7 Oct 2020) +- checksrc: detect // comments on column 0 - Only check for nroff (and complain) if actually making the manual + Spotted while working on #6045 - Closes #5817 + Closes #6048 -- [Brian Inglis brought this change] +- [Frederik Wedel-Heinen brought this change] - libtest/Makefile.am: add -no-undefined for libstubgss for Cygwin + mbedtls: add missing header when defining MBEDTLS_DEBUG - copy the LDFLAGS approach for adding same option with `libhostname` in - `libtest/Makefile.am`: + Closes #6045 + +- curl: make sure setopt CURLOPT_IPRESOLVE passes on a long - - init `libstubgss_la_LDFLAGS_EXTRA` variable, - - add option to variable inside conditional, - - use variable in `libstubgss_la_LDFLAGS` + Previously, it would pass on a define (int) which could make libcurl + read junk as a value - which prevented the CURLOPT_IPRESOLVE option to + "take". This could then make test 2100 do two DoH requests instead of + one! - Fixes #5819 - Closes #5820 + Fixes #6042 + Closes #6043 -- docs: clarify MAX_SEND/RECV_SPEED functionality +- RELEASE-NOTES: synced + +- scripts/release-notes.pl: don't "embed" $ in format string for printf() - ... in particular what happens if the maximum speed limit is set to a - value that's smaller than the transfer buffer size in use. + ... since they might contain %-codes that mess up the output! + +Jay Satiro (5 Oct 2020) +- [M.R.T brought this change] + + build-wolfssl: fix build with Visual Studio 2019 - Reported-by: Tomas Berger - Fixes #5788 - Closes #5813 + Closes https://github.com/curl/curl/pull/6033 -- test1140: compare stdout +Daniel Stenberg (4 Oct 2020) +- runtests: add %repeat[]% for test files - To make problems more immediately obvious when tests fail. + ... and use this new keywords in all the test files larger than 50K to reduce + their sizes and make them a lot easier to read and understand. - Closes #5814 + Closes #6040 -- asyn-ares: correct some bad comments +- [Emil Engler brought this change] + + --help: move two options from the misc category - Closes #5812 + The cmdline opts delegation and suppress-connect-headers + fit better into auth and proxy rather than misc. + + Follow-up to aa8777f63febc + Closes #6038 -- [Emil Engler brought this change] +- [Samanta Navarro brought this change] - docs: Add video link to docs/CONTRIBUTE.md + docs/opts: fix typos in two manual pages - Closes #5811 + Closes #6039 -- curl-config: ignore REQUIRE_LIB_DEPS in --libs output +- ldap: reduce the amount of #ifdefs needed - Fixes a curl-config issue on cygwin by making sure REQUIRE_LIB_DEPS is - not considered for the --libs output. + Closes #6035 + +- runtests: provide curl's version string as %VERSION for tests - Reported-by: ramsay-jones on github - Assisted-by: Brian Inglis and Ken Brown - Fixes #5793 - Closes #5808 + ... so that we can check HTTP requests for User-Agent: curl/%VERSION + + Update 600+ test cases accordingly. + + Closes #6037 -- copyright: update/correct the year range on a few files +- checksrc: warn on space after exclamation mark + + Closes #6034 -- scripts/copyright.pl: ignore .muse files +- test1465: verify --libcurl with binary POST data -- [Emil Engler brought this change] +- runtests: allow generating a binary sequence from hex - multi: Remove 10-year old out-commented code - - The code hasn't been touched since 2010-08-18 +- tool_setopt: escape binary data to hex, not octal + +- curl: make --libcurl show binary posts correctly - Closes #5805 + Reported-by: Stephan Mühlstrasser + Fixes #6031 + Closes #6032 -- KNOWN_BUGS: A shared connection cache is not thread-safe +Jay Satiro (1 Oct 2020) +- strerror: fix null deref on winapi out-of-memory - Closes #4915 - Closes #5802 + Follow-up to bed5f84 from several days ago. + + Ref: https://github.com/curl/curl/pull/6005 -- CONTRIBUTE: extend git commit message description +Daniel Stenberg (1 Oct 2020) +- [Kamil Dudka brought this change] + + vtls: deduplicate some DISABLE_PROXY ifdefs - In particular how the first line works. + ... in the code of gtls, nss, and openssl - Closes #5803 + Closes #5735 - RELEASE-NOTES: synced -- [Stefan Yohansson brought this change] +- [Emil Engler brought this change] - transfer: move retrycount from connect struct to easy handle + TODO: Add OpenBSD libtool notice - This flag was applied to the connection struct that is released on - retry. These changes move the retry counter into Curl_easy struct that - lives across retries and retains the new connection. + See #5862 + Closes #6030 + +- tests/unit/README: convert to markdown - Reported-by: Cherish98 on github - Fixes #5794 - Closes #5800 + ... and add to dist! + + Closes #6028 -- libssh2: s/ssherr/sftperr/ +- tests/README: convert to markdown - The debug output used ssherr instead of sftperr which not only outputs - the wrong error code but also casues a warning on Windows. + Closes #6028 + +- include/README: convert to markdown - Follow-up to 7370b4e39f1 + Closes #6028 + +- examples/README: convert to markdown - Reported-by: Gisle Vanem - Bug: https://github.com/curl/curl/commit/7370b4e39f1390e701f5b68d910c619151daf72b#r41334700 - Closes #5799 + Closes #6028 -- ftp: don't do ssl_shutdown instead of ssl_close +- configure: don't say HTTPS-proxy is enabled when disabled! - The shutdown function is for downgrading a connection from TLS to plain, - and this is not requested here. + Reported-by: Kamil Dudka + Reviewed-by: Kamil Dudka + Bug: https://github.com/curl/curl/pull/5735#issuecomment-701376388 + Closes #6029 + +Daniel Gustafsson (30 Sep 2020) +- src: Consistently spell whitespace without whitespace - Have ssl_close reset the TLS connection state. + Whitespace is spelled without a space between white and space, so + make sure to consistently spell it that way across the codebase. - This partially reverts commit f002c850d98d + Closes #6023 + Reviewed-by: Daniel Stenberg + Reviewed-by: Emil Engler + +- MANUAL: update examples to resolve without redirects - Reported-by: Rasmus Melchior Jacobsen - Reported-by: Denis Goleshchikhin - Fixes #5797 + www.netscape.com is redirecting to a cookie consent form on Aol, and + cool.haxx.se isn't responding to FTP anymore. Replace with examples + that resolves in case users try out the commands when reading the + manual. + + Closes #6024 + Reviewed-by: Daniel Stenberg + Reviewed-by: Emil Engler -Marc Hoersken (9 Aug 2020) -- CI/azure: fix test outcome values and use latest API version +Daniel Stenberg (30 Sep 2020) +- HISTORY: add some 2020 events + +- sectransp: make it build with --disable-proxy - This makes sure that tests ignored or skipped are not shown - just in the category "Other", but with their correct state. + Follow-up from #5466 and f3d501dc678d80 + Reported-by: Javier Navarro + Fixes #6025 + Closes #6026 + +- ECH: renamed from ESNI in docs and configure - Closes #5796 + Encrypted Client Hello (ECH) is the current name. + + Closes #6022 -- CI/azure: show runtime stats to investigate slowness +- configure: use "no" instead of "disabled" for the end summary - Also avoid naming conflict of TFLAGS env and tflags variables. + ... for consistency but also to make them more distinctly stand out next + to the "enabled" lines. + +- TODO: SSH over HTTPS proxy with more backends - Closes #5776 + ... as right now only the libssh2 backend supports it. -Daniel Stenberg (8 Aug 2020) -- TLS naming: fix more Winssl and Darwinssl leftovers +- libssh2: handle the SSH protocols done over HTTPS proxy - The CMake option is now called CMAKE_USE_SCHANNEL + Reported-by: Robin Douine + Fixes #4295 + Closes #6021 + +- [Emil Engler brought this change] + + memdebug: remove 9 year old unused debug function - The winbuild flag is USE_SCHANNEL + There used to be a way to have memdebug fill allocated memory. 9 years + later this has no value there (valgrind and ASAN etc are way better). If + people need to know about it they can have a look at VCS logs. - The CI jobs and build scripts only use the new names and the new name - options + Closes #5973 + +- sendf: move Curl_sendf to dict.c and make it static - Tests now require 'Schannel' (when necessary) + ... as the only remaining user of that function. Also fix gopher.c to + instead use Curl_write() - Closes #5795 + Closes #6020 -- smtp_parse_address: handle blank input string properly +- ROADMAP: updates and cleanups - Closes #5792 + Fix the HSTS PR + + Remove DoT, thread-safe init and hard-coded localhost. I feel very + little interest for these with users so I downgrade them to plain "TODO" + entries again. -- runtests: run the DICT server on a random port number +- schannel: return CURLE_PEER_FAILED_VERIFICATION for untrusted root - Removed support for -b (base port number) + This matches what is returned in other TLS backends in the same + situation. - Closes #5783 + Reviewed-by: Jay Satiro + Reviewed-by: Emil Engler + Follow-up to 5a3efb1 + Reported-by: iammrtau on github + Fixes #6003 + Closes #6018 - RELEASE-NOTES: synced -- runtests: move the TELNET server to a dynamic port +- ftp: make a 552 response return CURLE_REMOTE_DISK_FULL - Rename the port variable to TELNETPORT to better match the existing - pattern. + Added test 348 to verify. Added a 'STOR' command to the test FTP + server to enable test 348. Documented the command in FILEFORMAT.md - Closes #5785 + Reported-by: Duncan Wilcox + Fixes #6016 + Closes #6017 -- ngtcp2: adapt to error code rename +- pause: only trigger a reread if the unpause sticks - Closes #5786 + As an unpause might itself get paused again and then triggering another + reread doesn't help. + + Follow-up from e040146f22608fd9 (shipped since 7.69.1) + + Bug: https://curl.haxx.se/mail/lib-2020-09/0081.html + Patch-by: Kunal Chandarana + Fixes #5988 + Closes #6013 -- runtests: move the smbserver to use a dynamic port number +- test163[12]: require http to be built-in to run - Closes #5782 + ... as speaking over an HTTPS proxy implies http! + + Closes #6014 -- runtests: run the http2 tests on a random port number +- ngtcp2: adapt to new NGTCP2_PROTO_VER_MAX define - Closes #5779 + Closes #6012 -- gtls: survive not being able to get name/issuer +- [Javier Blazquez brought this change] + + strerror: honor Unicode API choice on Windows - Closes #5778 + Closes #6005 -- runtests: move the gnutls-serv tests to a dynamic port +- imap: make imap_send use dynbuf for the send buffer management - Affects test 320, 321, 322 and 324. + Reuses the buffer and thereby reduces number of mallocs over a transfer. - Closes #5778 + Closes #6010 -- runtests: support dynamicly base64 encoded sections in tests +- Curl_send: return error when pre_receive_plain can't malloc - This allows us to make test cases to use base64 at run-time and still - use and verify information determined at run-time, such as the IMAP test - server's port number in test 842. + ... will probably trigger some false DEAD CODE positives on non-windows + code analyzers for the conditional code. - This change makes 12 tests run again that basically never ran since we - moved to dynamic port numbers. + Closes #6011 + +- ftp: separate FTPS from FTP over "HTTPS proxy" - ftpserver.pl is adjusted to load test instructions and test number from - the preprocessed test file. + When using HTTPS proxy, SSL is used but not in the view of the FTP + protocol handler itself so separate the connection's use of SSL from the + FTP control connection's sue. - FILEFORMAT.md now documents the new base64 encoding syntax. + Reported-by: Mingtao Yang + Fixes #5523 + Closes #6006 + +Dan Fandrich (23 Sep 2020) +- tests/data: Fix some mismatched XML tags in test cases - Reported-by: Marcel Raad - Fixes #5761 - Closes #5775 + This allows these test files to pass xmllint. -- curl.1: add a few missing valid exit codes +Daniel Stenberg (23 Sep 2020) +- pingpong: use a dynbuf for the *_pp_sendf() function - 93 - 96 can be returned as well. + ... reuses the same dynamic buffer instead of doing repeated malloc/free + cycles. - Closes #5777 + Test case 100 (FTP dir list PASV) does 7 fewer memory allocation calls + after this change in my test setup (132 => 125), curl 7.72.0 needed 140 + calls for this. + + Test case 103 makes 9 less allocations now (130). Down from 149 in + 7.72.0. + + Closes #6004 -- TODO: Use multiple parallel transfers for a single download +- dynbuf: add Curl_dyn_vaddf - Closes #5774 + Closes #6004 -- TODO: Set the modification date on an uploaded file +- dynbuf: make *addf() not require extra mallocs - Closes #5768 + ... by introducing a printf() function that appends directly into a + dynbuf: Curl_dyn_vprintf(). This avoids the mandatory extra malloc so if + the buffer is already big enough it can just printf directly into it. + + Since this less-malloc version requires tthe use of a library internal + printf function, we only provide this version when building libcurl and + not for the dynbuf code that is used when building the curl tool. + + Closes #5998 -- [Thomas M. DuBuisson brought this change] +- KNOWN_BUGS: Unable to use PKCS12 certificate with Secure Transport + + Closes #5403 - CI: Add muse CI config +- pingpong: remove a malloc per Curl_pp_vsendf call - Closes #5772 + This typically makes 7-9 fewer mallocs per FTP transfer. + + Closes #5997 -- [Thomas M. DuBuisson brought this change] +- symbian: drop support + + The OS is deprecated. I see no traces of anyone having actually built + curl for Symbian after 2012. + + The public headers are unmodified. + + Closes #5989 - travis/script.sh: fix use of `-n' with unquoted envvar +- RELEASE-NOTES: synced + +- curl_krb5.h: rename from krb5.h - Shellcheck tells us "-n doesn't work with unquoted arguments. quote or - use [[ ]]." + Follow-up from f4873ebd0be32cf - And testing shows: + Turns out some older openssl installations go bananas otherwise. + Reported-by: Tom van der Woerdt + Fixes #5995 + Closes #5996 + +- test1297: verify GOT_NOTHING with http proxy tunnel + +- http_proxy: do not count proxy headers in the header bytecount - ``` - docker run --rm -it ubuntu bash - root@fe85ce156856:/# [ -n $DOES_NOT_EXIST ] && echo "I ran" - I ran - root@fe85ce156856:/# [ -n "$DOES_NOT_EXIST" ] && echo "I ran" - root@fe85ce156856:/# - ``` + ... as that counter is subsequently used to detect if nothing was + returned from the peer. This made curl return CURLE_OK when it should + have returned CURLE_GOT_NOTHING. - Closes #5773 + Fixes #5992 + Reported-by: Tom van der Woerdt + Closes #5994 -- h2: repair trailer handling +- setopt: return CURLE_BAD_FUNCTION_ARGUMENT on bad argument - The previous h2 trailer fix in 54a2b63 was wrong and caused a - regression: it cannot deal with trailers immediately when read since - they may be read off the connection by the wrong 'data' owner. + Fixed two return code mixups. CURLE_UNKNOWN_OPTION is saved for when the + option is, yeah, not known. Clarified this in the setopt man page too. - This change reverts the logic back to gathering all trailers into a - single buffer, like before 54a2b63. + Closes #5993 + +- krb5: merged security.c and krb specific FTP functions in here - Reported-by: Tadej Vengust - Fixes #5663 - Closes #5769 - -Viktor Szakats (3 Aug 2020) -- windows: disable Unix Sockets for old mingw + These two files were always tightly connected and it was hard to + understand what went into which. This also allows us to make the + ftpsend() function static (moved from ftp.c). - Classic mingw and 10y+ old versions of mingw-w64 don't ship with - Windows headers having the typedef necessary for Unix Sockets - support, so try detecting these environments to disable this - feature. + Removed security.c + Renamed curl_sec.h to krb5.h - Ref: https://sourceforge.net/p/mingw-w64/mingw-w64/ci/cf6afc57179a5910621215f8f4037d406892072c/ + Closes #5987 + +- Curl_handler: add 'family' to each protocol - Reviewed-by: Daniel Stenberg + Makes get_protocol_family() faster and it moves the knowledge about the + "families" to each protocol handler, where it belongs. - Fixes #5674 - Closes #5758 + Closes #5986 -Marcel Raad (3 Aug 2020) -- test1908: treat file as text +- parsedate: tune the date to epoch conversion - Fixes the line endings on Windows. + By avoiding an unnecessary error check and the temp use of the tm + struct, the time2epoch conversion function gets a little bit faster. + When repeating test 517, the updated version is perhaps 1% faster (on + one particular build on one particular architecture). - Closes https://github.com/curl/curl/pull/5767 + Closes #5985 -- TrackMemory tests: ignore realloc and free in getenv.c +- cmake: remove scary warning - These are only called for WIN32. + Remove the text saying - Closes https://github.com/curl/curl/pull/5767 + "the curl cmake build system is poorly maintained. Be aware" + + ... not because anything changed just now, but to encourage users to use + it and subsequently improve it. + + Closes #5984 -Daniel Stenberg (3 Aug 2020) -- tests/FILEFORMAT.md: mention %HTTP2PORT +- docs/MQTT: remove outdated paaragraphs -- RELEASE-NOTES: synced +- docs/MQTT: not experimental anymore + + Follow-up to e37e4468688d8f -- tlsv1.3.d. only for TLS-using connections +- docs/RESOURCES: remove - ... and rephrase that "not all" TLS backends support it. + This document is not maintained and rather than trying to refresh it, + let's kill it. A more up-to-date document with relevant RFCs is this + page on the curl website: https://curl.haxx.se/rfc/ - Closes #5764 + Closes #5980 -- tls-max.d: this option is only for TLS-using connections +- docs/TheArtOfHttpScripting: convert to markdown - Ref: #5763 - Closes #5764 - -Marcel Raad (2 Aug 2020) -- [Cameron Cawley brought this change] - - tool_doswin: Simplify Windows version detection + Makes it easier to browse on github etc. Offers (better) links. - Closes https://github.com/curl/curl/pull/5754 - -- [Cameron Cawley brought this change] + It should be noted that this document is already mostly outdated and + "Everything curl" at https://ec.haxx.se/ is a better resource and + tutorial. + + Closes #5981 - win32: Add Curl_verify_windows_version() to curlx +- BUGS: convert document to markdown - Closes https://github.com/curl/curl/pull/5754 + Closes #5979 -- runtests.pl: treat LibreSSL and BoringSSL as OpenSSL +- --help: strdup the category - This makes the tests that require the OpenSSL feature also run for - those two compatible libraries. + ... since it is converted and the original pointer is freed on Windows + unicode handling. - Closes https://github.com/curl/curl/pull/5762 + Follow-up to aa8777f63febc + Fixes #5977 + Closes #5978 + Reported-by: xwxbug on github -Daniel Stenberg (1 Aug 2020) -- multi: Condition 'extrawait' is always true +- CHECKSRC: document two missing warnings + +- RELEASE-NOTES: synced + +- ftp: avoid risk of reading uninitialized integers - Reported by Codacy. + If the received PASV response doesn't match the expected pattern, we + could end up reading uninitialized integers for IP address and port + number. - Reviewed-by: Marcel Raad - Closes #5759 + Issue pointed out by muse.dev + Closes #5972 -Marcel Raad (1 Aug 2020) -- openssl: fix build with LibreSSL < 2.9.1 +- [Quentin Balland brought this change] + + easy_reset: clear retry counter - `SSL_CTX_add0_chain_cert` and `SSL_CTX_clear_chain_certs` were - introduced in LibreSSL 2.9.1 [0]. + Closes #5975 + Fixes #5974 + +- ftp: get rid of the PPSENDF macro - [0] https://github.com/libressl-portable/openbsd/commit/0db809ee178457c8170abfae3931d7bd13abf3ef + The use of such a macro hides some of what's actually going on to the + reader and is generally disapproved of in the project. - Closes https://github.com/curl/curl/pull/5757 - -Daniel Stenberg (1 Aug 2020) -- [Marc Aldorasi brought this change] + Closes #5971 - multi_remove_handle: close unused connect-only connections +- man pages: switch to https://example.com URLs - Previously any connect-only connections in a multi handle would be kept - alive until the multi handle was closed. Since these connections cannot - be re-used, they can be marked for closure when the associated easy - handle is removed from the multi handle. + Since HTTPS is "the new normal", this update changes a lot of man page + examples to use https://example.com instead of the previous "http://..." - Closes #5749 + Closes #5969 -- checksrc: invoke script with -D to find .checksrc proper +- github: remove the duplicate "Security vulnerability" entry - Without the -D command line option, checksrc.pl won't know which - directory to load the ".checksrc" file from when building out of the - source tree. + ... since github adds an entry automatically by itself. - Reported-by: Marcel Raad - Fixes #5715 - Closes #5755 + Closes #5970 -- [Carlo Marcelo Arenas Belón brought this change] +- [Emil Engler brought this change] - buildconf: retire ares buildconf invocation + github: use new issue template feature - no longer needed after 4259d2df7dd95637a4b1e3fb174fe5e5aef81069 + This helps us to avoid getting feature requests as well as security + bugs reported into the issue tracker. + + Closes #5936 -- [Carlo Marcelo Arenas Belón brought this change] +- [Emil Engler brought this change] - buildconf: excempt defunct reference to ACLOCAL_FLAGS + urlapi: use more Curl_safefree - retired with 09f278121e815028adb24d228d8092fc6cb022aa but kept around as - the name is generic enough that it might be in use and relied upon from - the environment. - -- [Carlo Marcelo Arenas Belón brought this change] + Closes #5968 - buildconf: avoid array concatenation in die() +Marc Hoersken (17 Sep 2020) +- multi: align WinSock mask variables in Curl_multi_wait - reported as error SC2145[1] by shellcheck, but not expected to cause - any behavioural differences otherwise. + Also skip pre-checking sockets to set timeout_ms to 0 + after the first socket has been detected to be ready. - [1] https://github.com/koalaman/shellcheck/wiki/SC2145 + Reviewed-by: rcombs on github + Reviewed-by: Daniel Stenberg - Closes #5701 + Follow up to #5886 -- travis: add ppc64le and s390x builds +- multi: reuse WinSock events variable in Curl_multi_wait - Closes #5752 - -Marc Hoersken (31 Jul 2020) -- connect: remove redundant message about connect failure + Since the struct is quite large (1 long and 10 ints) we + declare it once at the beginning of the function instead + of multiple times inside loops to avoid stack movements. + Reviewed-by: Viktor Szakats Reviewed-by: Daniel Stenberg - Closes #5708 + Closes #5886 -- tests/sshserver.pl: fix compatibility with OpenSSH for Windows +Daniel Stenberg (16 Sep 2020) +- TODO: dynamically decide to use socketpair - Follow up to #5721 - -- CI/azure: install libssh2 for use with msys2-based builds + Suggested-by: Anders Bakken - This enables building and running the SFTP tests. - Unfortunately OpenSSH for Windows does not support SCP (yet). + Closes #4829 + +- TODO: add PR reference for native IDN support on macOS - Reviewed-by: Daniel Stenberg + As there was work started on this that never got completed. - Closes #5721 + Closes #5371 -- CI/azure: increase Windows job timeout once again +- tool_help.h: update copyright year range - Avoid aborted jobs due to performance issues on Azure DevOps. + Follow-up from aa8777f63febca + +- CI/azure: disable test 571 in the msys2 builds - Reviewed-by: Daniel Stenberg - Reviewed-by: Jay Satiro + It's just too flaky there - Closes #5738 + Reviewed-by: Marc Hoersken + Closes #5954 -Jay Satiro (30 Jul 2020) -- TODO: Schannel: 'Add option to allow abrupt server closure' +- tool_writeout: protect fputs() from NULL - We should offer an option to allow abrupt server closures (server closes - SSL transfer without sending a known termination point such as length of - transfer or close_notify alert). Abrupt server closures are usually - because of misconfigured or very old servers. + When the code was changed to do fputs() instead of fprintf() it got + sensitive for NULL pointers; add checks for that. - Closes https://github.com/curl/curl/issues/4427 - -- url: fix CURLU and location following + Follow-up from 0c1e767e83ec66 - Prior to this change if the user set a URL handle (CURLOPT_CURLU) it was - incorrectly used for the location follow, resulting in infinite requests - to the original location. + Closes #5963 + +- test3015: verify stdout "as text" - Reported-by: sspiri@users.noreply.github.com + Follow-up from 0c1e767e83e to please win32 tests - Fixes https://github.com/curl/curl/issues/5709 - Closes https://github.com/curl/curl/pull/5713 + Closes #5962 -Daniel Stenberg (30 Jul 2020) -- RELEASE-NOTES: synced +- travis: use libressl v3.1.4 instead of master + + ... as their git master seems too fragile to use (and 3.2.1 which is the + latest has a build failure). + + Closes #5964 -- [divinity76 brought this change] +- tests/FILEFORMAT: document type=shell for - docs: add date of 7.20 to CURLM_CALL_MULTI_PERFORM mentions +- tests/FILEFORMAT: document nonewline support for - it helps make it obvious that most developers don't have to care about - the CURLM_CALL_MULTI_PERFORM value (last release using it is nearly 11 - years old, November 4 2009) + The one in , that creates files. - Closes #5744 + Follow-up from b83947c8df7 -Jay Satiro (29 Jul 2020) -- tool_cb_wrt: fix outfile mode flags for Windows +- [anio brought this change] + + tool_writeout: add new writeout variable, %{num_headers} - - Use S_IREAD and S_IWRITE mode permission flags to create the file - on Windows instead of S_IRUSR, S_IWUSR, etc. + This variable gives the number of headers. - Windows only accepts a combination of S_IREAD and S_IWRITE. It does not - acknowledge other combinations, for which it may generate an assertion. + Closes #5947 + +- tool_urlglob: fix compiler warning "unreachable code" - This is a follow-up to 81b4e99 from yesterday, which improved the - existing file check with -J. + (On Windows builds.) - Ref: https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/open-wopen#remarks - Ref: https://github.com/curl/curl/pull/5731 + Follow-up to 70a3b003d9 + +- [Gergely Nagy brought this change] + + vtls: deduplicate client certificates in ssl_config_data - Closes https://github.com/curl/curl/pull/5742 + Closes #5629 -Daniel Stenberg (28 Jul 2020) -- checksrc: ban gmtime/localtime +- ftp: a 550 response to SIZE returns CURLE_REMOTE_FILE_NOT_FOUND - They're not thread-safe so they should not be used in libcurl code. + This is primarily interesting for cases where CURLOPT_NOBODY is set as + previously curl would not return an error for this case. - Explictly enabled when deemed necessary and in examples and tests + MDTM getting 550 now also returns this error (it returned + CURLE_FTP_COULDNT_RETR_FILE before) in order to unify return codes for + missing files across protocols and specific FTP commands. - Reviewed-by: Nicolas Sterchele - Closes #5732 + libcurl already returns error on a 550 as a MDTM response (when + CURLOPT_FILETIME is set). If CURLOPT_NOBODY is not set, an error would + happen subsequently anyway since the RETR command would fail. + + Add test 1913 and 1914 to verify. Updated several tests accordingly due + to the updated SIZE behavior. + + Reported-by: Tomas Berger + Fixes #5953 + Closes #5957 -- transfer: fix data_pending for builds with both h2 and h3 enabled +- curl: make checkpasswd use dynbuf - Closes #5734 + Closes #5952 -- curl_multi_setopt: fix compiler warning "result is always false" +- curl: make glob_match_url use dynbuf - On systems with 32 bit long the expression is always false. Avoid - the warning. + Closes #5952 + +- curl: make file2memory use dynbuf - Reported-by: Gisle Vanem - Bug: https://github.com/curl/curl/commit/61a08508f6a458fe21bbb18cd2a9bac2f039452b#commitcomment-40941232 - Closes #5736 + Closes #5952 -- curl: improve the existing file check with -J +- curl: make file2string use dynbuf - Previously a file that isn't user-readable but is user-writable would - not be properly avoided and would get overwritten. + Closes #5952 + +- [Antarpreet Singh brought this change] + + imap: set cselect_bits to CURL_CSELECT_IN initially - Reported-by: BrumBrum on hackerone - Assisted-by: Jay Satiro - Bug: https://hackerone.com/reports/926638 - Closes #5731 + ... when continuing a transfer from a FETCH response. + + When the size of the file was small enough that the entirety of the + transfer happens in a single go and schannel buffers holds the entire + data. However, it wasn't completely read in Curl_pp_readresp since a + line break was found before that could happen. So, by the time we are in + imap_state_fetch_resp - there's data in buffers that needs to be read + via Curl_read but nothing to read from the socket. After we setup a + transfer (Curl_setup_transfer), curl just waits on the socket state to + change - which doesn't happen since no new data ever comes. + + Closes #5961 -- [Jonathan Nieder brought this change] +- RELEASE-NOTES: synced - multi: update comment to say easyp list is linear +- test434: test -K use in a single line without newline - Since 09b9fc900 (multi: remove 'Curl_one_easy' struct, phase 1, - 2013-08-02), the easy handle list is not circular but ends with - ->next pointing to NULL. + Closes #5946 + +- runtests: allow creating files without newlines - Reported-by: Masaya Suzuki - Closes #5737 + Closes #5946 -- CURLOPT_NOBODY.3: fix the syntax for referring to options +- curl: use curlx_dynbuf for realloc when loading config files - As test 1140 fails otherwise! + ... fixes an integer overflow at the same time. - Follow-up to e1bac81cc815 + Reported-by: ihsinme on github + Assisted-by: Jay Satiro + + Closes #5946 -- ngtcp2: store address in sockaddr_storage +- dynbuf: provide curlx_ names for reuse by the curl tool - Reported-by: Tatsuhiro Tsujikawa - Closes #5733 + Closes #5946 -- CURLOPT_NOBODY.3: clarify what setting to 0 means +- dynbuf: make sure Curl_dyn_tail() zero terminates - ... and mention that HTTP with other methods than HEAD might get a body and - there's no option available to stop that. + Closes #5959 + +- tests: add test1912 to the dist - Closes #5729 + Follow-up to 70984ce1be4cab6c -- setopt: unset NOBODY switches to GET if still HEAD +- docs/LICENSE-MIXING: remove - Unsetting CURLOPT_NOBODY with 0L when doing HTTP has no documented - action but before 7.71.0 that used to switch back to GET and with this - change (assuming the method is still set to HEAD) this behavior is - brought back. + This document is not maintained and I feel that it doesn't provide much + value to users anymore (if it ever did). - Reported-by: causal-agent on github - Fixes #5725 - Closes #5728 + Closes #5955 -- [Ehren Bendler brought this change] +- [Laramie Leavitt brought this change] - configure: cleanup wolfssl + pkg-config conflicts when cross compiling. + http: consolidate nghttp2_session_mem_recv() call paths - Also choose a different wolfSSL function to test for NTLM support. + Previously there were several locations that called + nghttp2_session_mem_recv and handled responses slightly differently. + Those have been converted to call the existing + h2_process_pending_input() function. - Fixes #5605 - Closes #5682 - -- configure: show zstd "no" in summary when built without it + Moved the end-of-session check to h2_process_pending_input() since the + only place the end-of-session state can change is after nghttp2 + processes additional input frames. - Reported-by: Marc Hörsken - Fixes #5720 - Closes #5730 - -- quiche: handle calling disconnect twice + This will likely fix the fuzzing error. While I don't have a root cause + the out-of-bounds read seems like a use after free, so moving the + nghttp2_session_check_request_allowed() call to a location with a + guaranteed nghttp2 session seems reasonable. - Reported-by: lilongyan-huawei on github - Fixes #5726 - Closes #5727 + Also updated a few nghttp2 callsites to include error messages and added + a few additional error checks. + + Closes #5648 -- [Nicolas Sterchele brought this change] +- HISTORY: mention alt-svc added in 2019 + + ... and make 1996 the first year subtitle - getinfo: reset retry-after value in initinfo +- base64: also build for pop3 and imap - - Avoid re-using retry_after value from preceding request - - Add libtest 3010 to verify + Follow-up to the fix in 20417a13fb8f83 - Reported-by: joey-l-us on github - Fixes #5661 - Closes #5672 + Reported-by: Michael Olbrich + Fixes #5937 + Closes #5948 -Marcel Raad (27 Jul 2020) -- WIN32: stop forcing narrow-character API +- base64: enable in build with SMTP - Except where the results are only used for character output. - getenv is not touched because it's part of the public API, and having - it return UTF-8 instead of ANSI would be a breaking change. + The oauth2 support is used with SMTP and it uses base64 functions. - Fixes https://github.com/curl/curl/issues/5658 - Fixes https://github.com/curl/curl/issues/5712 - Closes https://github.com/curl/curl/pull/5718 + Reported-by: Michael Olbrich + Fixes #5937 + Closes #5938 -Jay Satiro (27 Jul 2020) -- [Tobias Stoeckmann brought this change] +- curl_mime_headers.3: fix the example's use of curl_slist_append + + Reported-by: sofaboss on github + Fixes #5942 + Closes #5943 - mprintf: Fix stack overflows +- lib583: fix enum mixup - Stack overflows can occur with precisions for integers and floats. + grrr the previous follow-up to 17fcdf6a31 was wrong + +- libtest: fix build errors - Proof of concepts: - - curl_mprintf("%d, %.*1$d", 500, 1); - - curl_mprintf("%d, %+0500.*1$f", 500, 1); + Follow-up from 17fcdf6a310d4c8076 + +- lib: fix -Wassign-enum warnings - Ideally, compile with -fsanitize=address which makes this undefined - behavior a bit more defined for debug purposes. + configure --enable-debug now enables -Wassign-enum with clang, + identifying several enum "abuses" also fixed. - The format strings are valid. The overflows occur due to invalid - arguments. If these arguments are variables with contents controlled - by an attacker, the function's stack can be corrupted. + Reported-by: Gisle Vanem + Bug: https://github.com/curl/curl/commit/879007f8118771f4896334731aaca5850a154675#commitcomment-42087553 - Also see CVE-2016-9586 which partially fixed the float aspect. + Closes #5929 + +- RELEASE-NOTES: synced + +- [Diven Qi brought this change] + + url: use blank credentials when using proxy w/o username and password - Signed-off-by: Tobias Stoeckmann + Fixes proxy regression brought in commit ad829b21ae (7.71.0) - Closes https://github.com/curl/curl/pull/5722 + Fixed #5911 + Closes #5914 -- [Tobias Stoeckmann brought this change] +- travis: add a build using libressl (from git master) + + The v3.2.1 tag (latest release atm) results in a broken build. + + Closes #5932 - mprintf: Fix dollar string handling +- configure: let --enable-debug set -Wenum-conversion with gcc >= 10 - Verify that specified parameters are in range. If parameters are too - large, fail early on and avoid out of boundary accesses. + Unfortunately, this option is not detecting the same issues as clang's + -Wassign-enum flag, but should still be useful to detect future + mistakes. - Also do not read behind boundaries of illegal format strings. + Closes #5930 + +- openssl: consider ALERT_CERTIFICATE_EXPIRED a failed verification - These are defensive measures since it is expected that format strings - are well-formed. Format strings should not be modifiable by user - input due to possible generic format string attacks. + If the error reason from the lib is + SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED, libcurl will return + CURLE_PEER_FAILED_VERIFICATION and not CURLE_SSL_CONNECT_ERROR. - Closes https://github.com/curl/curl/pull/5722 + This unifies the libcurl return code and makes libressl run test 313 + (CRL testing) fine. + + Closes #5934 -Daniel Stenberg (26 Jul 2020) -- ntlm: free target_info before (re-)malloc +- FAQ: refreshed some very old language + +- cmake: make HTTP_ONLY also disable MQTT - OSS-Fuzz found a way this could get called again with the pointer still - pointing to a malloc'ed memory, leading to a leak. + ... and alphasort the order of disabling protocols to make it easier to + browse. - Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=24379 + Closes #5931 + +- libtest: remove lib1541 leftovers - Closes #5724 + Caused automake errors. + + Follow-up to 8ca54a03ea08a -Marcel Raad (26 Jul 2020) -- CI/macos: set minimum macOS version +- tests/libtests: remove test 1900 and 2033 - This enables some deprecation warnings. - Previously, autotools defaulted to 10.8. + We already remove the test files, now remove the libtest codes as well. - Closes https://github.com/curl/curl/pull/5723 + Follow-up to e50a877df74 -Daniel Stenberg (26 Jul 2020) -- RELEASE-NOTES: synced +Marc Hoersken (7 Sep 2020) +- CI/azure: add test number to title for display in analytics + + To ease identification of tests the test number is added to + the test case title in order to have it on the Azure DevOps + Analytics pages and reports which currently do not show it. + + Bump test case revision to make Azure DevOps update titles. + + Closes #5927 -Marcel Raad (25 Jul 2020) -- CI/macos: enable warnings as errors for CMake builds +Daniel Stenberg (6 Sep 2020) +- altsvc: clone setting in curl_easy_duphandle - Closes https://github.com/curl/curl/pull/5716 + The cache content is not duplicated, like other caches, but the setting + and specified file name are. + + Test 1908 is extended to verify this somewhat. Since the duplicated + handle gets the same file name, the test unfortunately overwrites the + same file twice (with different contents) which makes it hard to check + automatically. + + Closes #5923 -- CMake: fix test for warning suppressions +- test1541: remove since it is a known bug - GCC doesn't warn for unknown `-Wno-` options, except if there are other - warnings or errors [0]. This was problematic with `CURL_WERROR` as that - warning-as-error cannot be suppressed. Notably, this always happened - with `-Wno-pedantic-ms-format` when not targeting Windows. So test for - the positive form of the warning instead, which should always result in - a diagnostic if unknown. + A shared connection cache is not thread-safe is a known issue. Stop + testing this until we believe this issue is addressed. Reduces + occasional test failures we don't care about. - [0] https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html + The test code in lib1541.c is left in git to allow us to restore it when + we get to fix this. - Closes https://github.com/curl/curl/pull/5714 + Closes #5922 -Jay Satiro (23 Jul 2020) -- curl.h: update CURLINFO_LASTONE +- tests: remove pipelining tests - CURLINFO_LASTONE should have been updated when - CURLINFO_EFFECTIVE_METHOD was added. + Remove the tests 530, 584, 1900, 1901, 1902, 1903 and 2033. They were + previously disabled. - Reported-by: xwxbug@users.noreply.github.com + The Pipelining code was removed from curl in commit 2f44e94efb3df8e, + April 2019. - Fixes https://github.com/curl/curl/issues/5711 + Closes #5921 -Marc Hoersken (22 Jul 2020) -- CI/azure: unconditionally enable warnings-as-errors with autotools +- curl: retry delays in parallel mode no longer sleeps blocking - Reviewed-by: Marcel Raad + The previous sleep for retries would block all other concurrent + transfers. Starting now, the retry will instead be properly marked to + not get restarted until after the delay time but other transfers can + still continue in the mean time. - Follow up to #5694 - Closes #5706 + Closes #5917 -Marcel Raad (21 Jul 2020) -- doh: remove redundant cast +- curl:parallel_transfers: make sure retry readds the transfer - Closes https://github.com/curl/curl/pull/5704 + Reported-by: htasta on github + Fixes #5905 + Closes #5917 -- CI/macos: unconditionally enable warnings-as-errors with autotools +- build: drop support for building with Watcom - Previously, warnings were only visible in the output for most jobs. + These files are not maintained, they seem to have no users, Watcom + compilers look like not having users nor releases anymore. - Closes https://github.com/curl/curl/pull/5694 + Closes #5918 -- util: silence conversion warnings +- winbuild/rundebug.cmd: remove - timeval::tv_usec might be a 32-bit integer and timespec::tv_nsec might - be a 64-bit integer. This is the case when building for recent macOS - versions, for example. Just treat tv_usec as an int, which should - hopefully always be sufficient on systems with - `HAVE_CLOCK_GETTIME_MONOTONIC`. + Seems to have been added by mistake? Not included in dists. - Closes https://github.com/curl/curl/pull/5695 + Closes #5919 -- md(4|5): don't use deprecated macOS functions +- curl: in retry output don't call all problems "transient" - They are marked as deprecated for -mmacosx-version-min >= 10.15, - which might result in warnings-as-errors. + ... because when --retry-all-errors is used, the error isn't necessarily + transient at all. - Closes https://github.com/curl/curl/pull/5695 + Closes #5916 -Daniel Stenberg (18 Jul 2020) -- strdup: remove the odd strlen check +- easygetopt: pass a valid enum to avoid compiler warning - It confuses code analyzers with its use of -1 for unsigned value. Also, - a check that's not normally used in strdup() code - and not necessary. + "integer constant not in range of enumerated type 'CURLoption'" - Closes #5697 + Reported-by: Gisle Vanem + Bug: https://github.com/curl/curl/commit/6ebe63fac23f38df911edc348e8ccc72280f9434#commitcomment-42042843 + + Closes #5915 -- [Alessandro Ghedini brought this change] +- [Emil Engler brought this change] - travis: update quiche builds for new boringssl layout + tests: Add tests for new --help - This is required after https://github.com/cloudflare/quiche/pull/593 - moved BoringSSL around slightly. + This commit is a part of "--help me if you can" - This also means that Go is not needed to build BoringSSL anymore (the - one provided by quiche anyway). + Closes #5680 + +- [Emil Engler brought this change] + + tool: update --help with categories - Closes #5691 + This commit is a part of "--help me if you can" + + Closes #5680 -Marcel Raad (17 Jul 2020) -- configure: allow disabling warnings +- [Emil Engler brought this change] + + docs: add categories to all cmdline opts - When using `--enable-warnings`, it was not possible to disable warnings - via CFLAGS that got explicitly enabled. Now warnings are not enabled - anymore if they are explicitly disabled (or enabled) in CFLAGS. This - works for at least GCC, clang, and TCC as they have corresponding - `-Wno-` options for every warning. + Adapted gen.pl with 'listcats' - Closes https://github.com/curl/curl/pull/5689 + This commit is a part of "--help me if you can" + + Closes #5680 -Daniel Stenberg (16 Jul 2020) -- ngtcp2: adjust to recent sockaddr updates +- RELEASE-NOTES: synced + +- [ihsinme brought this change] + + connect.c: remove superfluous 'else' in Curl_getconnectinfo - Closes #5690 + Closes #5912 -- page-header: provide protocol details in the curl.1 man page +- [Samuel Marks brought this change] + + CMake: remove explicit `CMAKE_ANSI_CFLAGS` - Add protocol and version specific information about all protocols curl - supports. + This variable was removed from cmake in commit + https://gitlab.kitware.com/cmake/cmake/commit/5a834b0bb0bc288. A later + CMake commit removes the variable from the tests, claiming that it was + removed in CMake 2.6 - Fixes #5679 - Reported-by: tbugfinder on github - Closes #5686 + Reviewed-By: Peter Wu + Closes #5439 -Daniel Gustafsson (16 Jul 2020) -- docs: Update a few leftover mentions of DarwinSSL +- [cbe brought this change] + + libssh2: pass on the error from ssh_force_knownhost_key_type - Commit 76a9c3c4be10b3d4d379d5b23ca76806bbae536a renamed DarwinSSL to the - more correct/common name Secure Transport, but a few mentions in the docs - remained. + Closes #5909 + +- scripts/delta: add diffstat summary - Closes #5688 - Reviewed-by: Daniel Stenberg + ... and make output more table-like -Daniel Stenberg (16 Jul 2020) -- file2memory: use a define instead of -1 unsigned value +- [Martin Bašti brought this change] + + http_proxy: do not crash with HTTPS_PROXY and NO_PROXY set - ... to use the maximum value for 'size_t' when detecting integer overflow. - Changed the limit to max/4 as already that seems unreasonably large. + ... in case NO_PROXY takes an effect - Codacy didn't like the previous approach. + Without this patch, the following command crashes: - Closes #5683 + $ GIT_CURL_VERBOSE=1 NO_PROXY=github.com HTTPS_PROXY=https://example.com \ + git clone https://github.com/curl/curl.git + + Minimal libcurl-based reproducer: + + #include + + int main() { + CURL *curl = curl_easy_init(); + if(curl) { + CURLcode ret; + curl_easy_setopt(curl, CURLOPT_URL, "https://github.com/"); + curl_easy_setopt(curl, CURLOPT_PROXY, "example.com"); + /* set the proxy type */ + curl_easy_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTPS); + curl_easy_setopt(curl, CURLOPT_NOPROXY, "github.com"); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + ret = curl_easy_perform(curl); + curl_easy_cleanup(curl); + return ret; + } + return -1; + } + + Assisted-by: Kamil Dudka + Bug: https://bugzilla.redhat.com/1873327 + Closes #5902 -- CURL_PUSH_ERROROUT: allow the push callback to fail the parent stream +- travis: add a CI job with openssl3 (from git master) - ... by adding support for a new dedicated return code. + Closes #5908 + +- openssl: avoid error conditions when importing native CA - Suggested-by: Jonathan Cardoso - Assisted-by: Erik Johansson - URL: https://curl.haxx.se/mail/lib-2020-06/0099.html - Closes #5636 + The code section that is OpenSSL 3+ specific now uses the same logic as + is used in the version < 3 section. It caused a compiler error without + it. + + Closes #5907 -- [Baruch Siach brought this change] +- setopt: avoid curl_ on local variable + + Closes #5906 - nss: fix build with disabled proxy support +- mqtt.c: avoid curl_ prefix on local variable - Avoid reference to fields that do not exist when CURL_DISABLE_PROXY is - defined. + Closes #5906 + +- wildcard: strip "curl_" prefix from private symbols - Closes #5667 + Closes #5906 -- test1139: make it display the difference on test failures +- vtls: make it 'struct Curl_ssl_session' + + Use uppercase C for internal symbols. + + Closes #5906 -- test1119: verify stdout in the test +- curl_threads: make it 'struct Curl_actual_call' - So that failures will be displayed in the terminal, as it makes test failures - visually displayed easier and faster. + Internal names should not be prefixed "curl_" - Closes #5644 + Closes #5906 -- curl: add %{method} to the -w variables +- schannel: make it 'struct Curl_schannel*' - Gets the CURLINFO_EFFECTIVE_METHOD from libcurl. + As internal global names should use captical C. - Added test 1197 to verify. + Closes #5906 -- CURLINFO_EFFECTIVE_METHOD: added +- hash: make it 'struct Curl_hash' - Provide the HTTP method that was used on the latest request, which might - be relevant for users when there was one or more redirects involved. + As internal global names should use captical C. - Closes #5511 + Closes #5906 -Viktor Szakats (14 Jul 2020) -- windows: add unicode to feature list +- llist: make it "struct Curl_llist" - Reviewed-by: Marcel Raad - Reviewed-by: Marc Hörsken + As internal global names should use captical C. - Closes #5491 + Closes #5906 -Daniel Stenberg (14 Jul 2020) -- multi: remove two checks always true +Marc Hoersken (2 Sep 2020) +- telnet.c: depend on static requirement of WinSock version 2 - Detected by Codacy - Closes #5676 + Drop dynamic loading of ws2_32.dll and instead rely on the + imported version which is now required to be at least 2.2. + + Reviewed-by: Marcel Raad + Reviewed-by: Jay Satiro + Reviewed-by: Daniel Stenberg + Reviewed-by: Viktor Szakats + + Closes #5854 -Marc Hoersken (13 Jul 2020) -- workflows: limit what branches to run CodeQL on +- win32: drop support for WinSock version 1, require version 2 - Align CodeQL action with existing CI actions: - - Update branch filter to avoid duplicate CI runs. - - Shorten workflow name due to informative job name. + IPv6, telnet and now also the multi API require WinSock + version 2 which is available starting with Windows 95. + Therefore we think it is time to drop support for version 1. + + Reviewed-by: Marcel Raad + Reviewed-by: Jay Satiro Reviewed-by: Daniel Stenberg + Reviewed-by: Viktor Szakats - Closes #5660 + Follow up to #5634 + Closes #5854 -- appveyor: collect libcurl.dll variants with prefix or suffix +- select: align poll emulation to return all relevant events - On some platforms libcurl is build with a platform-specific - prefix and/or a version number suffix. + The poll emulation via select already consumes POLLRDNORM, + POLLWRNORM and POLLRDBAND as input events. Therefore it + should also return them as output events if signaled. + + Also fix indentation in input event handling block. Assisted-by: Jay Satiro + Reviewed-by: Daniel Stenberg - Closes #5659 + Replaces #5852 + Closes #5883 -Daniel Stenberg (12 Jul 2020) -- [ihsinme brought this change] - - socks: use size_t for size variable +- CI/azure: MQTT is now enabled by default - Use the unsigned type (size_t) in the arithmetic of pointers. In this - context, the signed type (ssize_t) is used unnecessarily. + Reviewed-by: Daniel Stenberg - Authored-by: ihsinme on github - Closes #5654 + Follow up to #5858 + Closes #5903 -- RELEASE-NOTES: synced +Daniel Stenberg (2 Sep 2020) +- copyright.pl: ignore buildconf + +- test971: show test mismatches "inline" + +- lib/Makefile.am: bump VERSIONINFO due to new functions - ... and bumped to 7.72.0 as the next release version number + ... we're generally bad at this, but we are adding new functions for + this release. + + Closes #5899 -- [Gilles Vollant brought this change] +- optiontable: use DEBUGBUILD + + Follow-up to commit 6e18568ba38 (#5877) - content_encoding: add zstd decoding support +- cmdline-opts/gen.pl: generate nicer "See Also" in curl.1 - include zstd curl patch for Makefile.m32 from vszakats - and include Add CMake support for zstd from Peter Wu + If there are more than two items in the list, use commas for all but the + last separator which is set to 'and'. Reads better. - Helped-by: Viktor Szakats - Helped-by: Peter Wu - Closes #5453 + Closes #5898 -- asyn.h: remove the Curl_resolver_getsock define +- curl.1: add see also no-progress-meter on two spots - - not used - - used the wrong number of arguments - - confused the Codeacy code analyzer + Ref: #5894 - Closes #5647 + Closes #5897 -- [Nicolas Sterchele brought this change] +- RELEASE-NOTES: synced - configure.ac: Sort features name in summary +- mqtt: enable by default - - Same as protocols + No longer considered experimental. - Closes #5656 + Closes #5858 -- [Matthias Naegler brought this change] +- [Michael Baentsch brought this change] - cmake: fix windows xp build + tls: add CURLOPT_SSL_EC_CURVES and --curves - Reviewed-by: Marcel Raad - Closes #5662 + Closes #5892 -- ngtcp2: update to modified qlog callback prototype - - Closes #5675 +- url: remove funny embedded comments in Curl_disonnect calls -- transfer: fix memory-leak with CURLOPT_CURLU in a duped handle +- [Chris Paulson-Ellis brought this change] + + conn: check for connection being dead before reuse - Added test case 674 to reproduce and verify the bug report. + Prevents incorrect reuse of an HTTP connection that has been prematurely + shutdown() by the server. - Fixes #5665 - Reported-by: NobodyXu on github - Closes #5673 - -- [Baruch Siach brought this change] + Partial revert of 755083d00deb16 + + Fixes #5884 + Closes #5893 - bearssl: fix build with disabled proxy support +Marc Hoersken (29 Aug 2020) +- buildconf: exec autoreconf to avoid additional process - Avoid reference to fields that do not exist when CURL_DISABLE_PROXY is - defined. + Also make buildconf exit with the return code of autoreconf. - Reviewed-by: Nicolas Sterchele - Closes #5666 - -- RELEASE-NOTES: synced + Reviewed-by: Daniel Stenberg + + Follow up to #5853 + Closes #5890 -Jay Satiro (11 Jul 2020) -- [Carlo Marcelo Arenas Belón brought this change] +- CI/azure: no longer ignore results of test 1013 + + Follow up to #5771 + Closes #5889 - cirrus-ci: upgrade 11-STABLE to 11.4 +- docs: add description about CI platforms to CONTRIBUTE.md - Meant to be the last of the 11 series and so make sure that all - other references reflect all 11 versions so they can be retired - together later. + Reviewed-by: Daniel Stenberg + Reviewed-by: Marcel Raad + Reviewed-by: Jay Satiro - Closes https://github.com/curl/curl/pull/5668 + Closes #5882 -- [Filip Salomonsson brought this change] - - CURLINFO_CERTINFO.3: fix typo +Daniel Stenberg (29 Aug 2020) +- tests/getpart: use MIME::Base64 instead of home-cooked - Closes https://github.com/curl/curl/pull/5655 - -Daniel Stenberg (4 Jul 2020) -- http2: only do the *done() cleanups for HTTP + Since we already use the base64 package since a while back, we can just + as well switch to that here too. - Follow-up to ef86daf4d3 + It also happens to use the exact same function name, which otherwise + causes a run-time warning. - Closes #5650 - Fixes #5646 - -- [Alex Kiernan brought this change] + Reported-by: Marc Hörsken + Fixes #5885 + Closes #5887 - gnutls: repair the build with `CURL_DISABLE_PROXY` +Marcel Raad (29 Aug 2020) +- ntlm: fix condition for curl_ntlm_core usage - `http_proxy`/`proxy_ssl`/`tunnel_proxy` will not be available in `conn` - if `CURL_DISABLE_PROXY` is enabled. Repair the build with that - configuration. + `USE_WINDOWS_SSPI` without `USE_WIN32_CRYPTO` but with any other DES + backend is fine, but was excluded before. - Signed-off-by: Alex Kiernan - Closes #5645 - -Alex Kiernan (3 Jul 2020) -- gnutls: Fetch backend when using proxy + This also fixes test 1013 as the condition for SMB support in + configure.ac didn't match the condition in the source code. Now it + does. - Fixes: 89865c149 ("gnutls: remove the BACKEND define kludge") - Signed-off-by: Alex Kiernan + Fixes https://github.com/curl/curl/issues/1262 + Closes https://github.com/curl/curl/pull/5771 -Daniel Stenberg (3 Jul 2020) -- [Laramie Leavitt brought this change] - - http2: close the http2 connection when no more requests may be sent +- AppVeyor: switch 64-bit Schannel Debug CMake builds to Unicode - Well-behaving HTTP2 servers send two GOAWAY messages. The first - message is a warning that indicates that the server is going to - stop accepting streams. The second one actually closes the stream. + The Schannel builds are the most useful to verify as they make the most + use of the Windows API. Classic MinGW doesn't support Unicode at all, + only MinGW-w64 and MSVC do. - nghttp2 reports this state (and the other state of no more stream - identifiers) via the call nghttp2_session_check_request_allowed(). - In this state the client should not create more streams on the - session (tcp connection), and in curl this means that the server - has requested that the connection is closed. + Closes https://github.com/curl/curl/pull/5843 + +- CMake: add option to enable Unicode on Windows - It would be also be possible to put the connclose() call into the - on_http2_frame_recv() function that triggers on the GOAWAY message. + As already existing for winbuild. - This fixes a bug seen when the client sees the following sequence of - frames: + Closes https://github.com/curl/curl/pull/5843 + +Marc Hoersken (29 Aug 2020) +- select: simplify return code handling for poll and select - // advisory GOAWAY - HTTP2 GOAWAY [stream-id = 0, promised-stream-id = -1] - ... some additional frames + poll and select already return -1 on error according to POSIX, + so there is no need to perform a <0 to -1 conversion in code. - // final GOAWAY - HTTP2 GOAWAY [stream-id = 0, promised-stream-id = N ] + Also we can just use one check with <= 0 on the return code. - Before this change, curl will attempt to reuse the connection even - after the last stream, will encounter this error: + Assisted-by: Daniel Stenberg + Reviewed-by: Jay Satiro - * Found bundle for host localhost: 0x5595f0a694e0 [can multiplex] - * Re-using existing connection! (#0) with host localhost - * Connected to localhost (::1) port 10443 (#0) - * Using Stream ID: 9 (easy handle 0x5595f0a72e30) - > GET /index.html?5 HTTP/2 - > Host: localhost:10443 - > user-agent: curl/7.68.0 - > accept: */* - > - * stopped the pause stream! - * Connection #0 to host localhost left intact - curl: (16) Error in the HTTP2 framing layer + Replaces #5852 + Closes #5880 + +Daniel Stenberg (28 Aug 2020) +- RELEASE-NOTES: synced + +- [Jeroen Ooms brought this change] + + tests: add test1912 with typechecks - This error may posion the connection cache, causing future requests - which resolve to the same curl connection to go through the same error - path. + Validates that gcc-typecheck macros match the new option type API. - Closes #5643 + Closes #5873 -- ftpserver: don't verify SMTP MAIL FROM names +- easyoptions: provide debug function when DEBUGBUILD - Rely on tests asking the names to get refused instead - test servers - should be as dumb as possible. Edited test 914, 955 and 959 accordingly. + ... not CURLDEBUG as they're not always set in conjunction. - Closes #5639 + Follow-up to 6ebe63fac23f38df + + Fixes #5877 + Closes #5878 -- curl_version_info.3: CURL_VERSION_KERBEROS4 is deprecated +Marc Hoersken (28 Aug 2020) +- sockfilt: handle FD_CLOSE winsock event on write socket - This came up in #5640. It make sense to clarify this in the docs! + Learn from the way Cygwin handles and maps the WinSock events + to simulate correct and complete poll and select behaviour + according to Richard W. Stevens Network Programming book. - Reminded-by: Kamil Dudka - Closes #5642 + Follow up to #5867 + Closes #5879 -Kamil Dudka (3 Jul 2020) -- tool_getparam: make --krb option work again +- multi: handle connection state winsock events - It was disabled by mistake in commit curl-7_37_1-23-ge38ba4301. + Learn from the way Cygwin handles and maps the WinSock events + to simulate correct and complete poll and select behaviour + according to Richard W. Stevens Network Programming book. - Bug: https://bugzilla.redhat.com/1833193 - Closes #5640 - -Daniel Stenberg (2 Jul 2020) -- [Jeremy Maitin-Shepard brought this change] + Reviewed-by: Jay Satiro + Reviewed-by: Marcel Raad + + Follow up to #5634 + Closes #5867 - http2: fix nghttp2_strerror -> nghttp2_http2_strerror in debug messages +Daniel Stenberg (28 Aug 2020) +- Curl_pgrsTime - return new time to avoid timeout integer overflow - Confusingly, nghttp2 has two different error code enums: + Setting a timeout to INT_MAX could cause an immediate error to get + returned as timeout because of an overflow when different values of + 'now' were used. - - nghttp2_error, to be used with nghttp2_strerror - - nghttp2_error_code, to be used with nghttp2_http2_strerror + This is primarily fixed by having Curl_pgrsTime() return the "now" when + TIMER_STARTSINGLE is set so that the parent function will continue using + that time. - Closes #5641 + Reported-by: Ionuț-Francisc Oancea + Fixes #5583 + Closes #5847 -Marcel Raad (2 Jul 2020) -- url: silence MSVC warning +- TLS: fix SRP detection by using the proper #ifdefs - Since commit f3d501dc678, if proxy support is disabled, MSVC warns: - url.c : warning C4701: potentially uninitialized local variable - 'hostaddr' used - url.c : error C4703: potentially uninitialized local pointer variable - 'hostaddr' used + USE_TLS_SRP will be true if *any* selected TLS backend can use SRP - That could actually only happen if both `conn->bits.proxy` and - `CURL_DISABLE_PROXY` were enabled. - Initialize it to NULL to silence the warning. + HAVE_OPENSSL_SRP is defined when OpenSSL can use it - Closes https://github.com/curl/curl/pull/5638 - -Daniel Stenberg (1 Jul 2020) -- RELEASE-NOTES: synced - -Version 7.71.1 (30 Jun 2020) + HAVE_GNUTLS_SRP is defined when GnuTLS can use it + + Clarify in the curl_verison_info docs that CURL_VERSION_TLSAUTH_SRP is + set if at least one of the supported backends offers SRP. + + Reported-by: Stefan Strogin + Fixes #5865 + Closes #5870 -Daniel Stenberg (30 Jun 2020) -- RELEASE-NOTES: curl 7.71.1 +- [Dan Kenigsberg brought this change] -- THANKS: add contributors to 7.71.1 + docs: SSLCERTS: fix English syntax + + Signed-off-by: Dan Kenigsberg + + Closes #5876 -- scripts/copyright.pl: skip .dcignore +- [Alessandro Ghedini brought this change] -- Revert "multi: implement wait using winsock events" + docs: non-existing macros in man pages - This reverts commit 8bc25c590e530de87595d1bb3577f699eb1309b9. + As reported by man(1) when invoked as: - That commit (from #5397) introduced a regression in 7.71.0. + man --warnings -E UTF-8 -l -Tutf8 -Z >/dev/null - Reported-by: tmkk on github - Fixes #5631 - Closes #5632 + Closes #5846 -- TODO: Add flag to specify download directory +- [Alessandro Ghedini brought this change] -- TODO: return code to CURLMOPT_PUSHFUNCTION to fail connection + curl.1: fix typo invokved -> invoked + + Closes #5846 -- cirrus-ci: disable FreeBSD 13 (again) +- buildconf: invoke 'autoreconf -fi' instead - It has been failing for a good while again. This time we better leave it - disabled until we have more reason to believe it behaves. + The custom script isn't necessary anymore - but remains for simplicity + and just invokes autoreconf. - Closes #5628 + Closes #5853 -- ngtcp2: sync with current master +- [Emil Engler brought this change] + + lib: make Curl_gethostname accept a const pointer - ngtcp2 added two new callbacks + The address of that variable never gets changed, only the data in it so + why not make it a "char * const"? - Reported-by: Lucien Zürcher - Fixes #5624 - Closes #5627 + Closes #5866 -- examples/multithread.c: call curl_global_cleanup() +- docs/libcurl: update "Added in" version for curl_easy_option* - Reported-by: qiandu2006 on github - Fixes #5622 - Closes #5623 + Follow-up to 6ebe63fac23f38 -- vtls: compare cert blob when finding a connection to reuse +- scripts: improve the "get latest curl release tag" logic - Reported-by: Gergely Nagy - Fixes #5617 - Closes #5619 - -- RELEASE-NOTES: synced + ... by insiting on it matching "^curl-". -- terminology: call them null-terminated strings +- configure: added --disable-get-easy-options - Updated terminology in docs, comments and phrases to refer to C strings - as "null-terminated". Done to unify with how most other C oriented docs - refer of them and what users in general seem to prefer (based on a - single highly unscientific poll on twitter). + To allow disabling of the curl_easy_option APIs in a build. - Reported-by: coinhubs on github - Fixes #5598 - Closes #5608 + Closes #5365 -- http: fix proxy auth with blank password +- options: API for meta-data about easy options - Regression in 7.71.0 + const struct curl_easyoption *curl_easy_option_by_name(const char *name); - Added test case 346 to verify. + const struct curl_easyoption *curl_easy_option_by_id (CURLoption id); - Reported-by: Kristoffer Gleditsch - Fixes #5613 - Closes #5616 + const struct curl_easyoption * + curl_easy_option_next(const struct curl_easyoption *prev); + + The purpose is to provide detailed enough information to allow for + example libcurl bindings to get option information at run-time about + what easy options that exist and what arguments they expect. + + Assisted-by: Jeroen Ooms + Closes #5365 -- .dcignore: ignore tests and docs directories +- [Eric Curtin brought this change] + + HTTP/3: update to OpenSSL_1_1_1g-quic-draft-29 - This is a config file for deepcode.ai, a static code analyzer. + Closes #5871 -Jay Satiro (26 Jun 2020) -- tool_cb_hdr: Fix etag warning output and return code +- RELEASE-NOTES: synced + +Jay Satiro (26 Aug 2020) +- openssl: Fix wincrypt symbols conflict with BoringSSL - - Return 'failure' on failure, to follow the existing style. + OpenSSL undefines the conflicting symbols but BoringSSL does not so we + must do it ourselves. - - Put Warning: and the warning message on the same line. + Reported-by: Samuel Tranchet + Assisted-by: Javier Blazquez - Ref: https://github.com/curl/curl/issues/5610 + Ref: https://bugs.chromium.org/p/boringssl/issues/detail?id=371 + Ref: https://github.com/openssl/openssl/blob/OpenSSL_1_1_1g/include/openssl/ossl_typ.h#L66-L73 - Closes https://github.com/curl/curl/pull/5612 + Fixes https://github.com/curl/curl/issues/5669 + Closes https://github.com/curl/curl/pull/5857 -Daniel Stenberg (26 Jun 2020) -- CURLOPT_READFUNCTION.3: provide the upload data size up front +Daniel Stenberg (26 Aug 2020) +- socketpair: allow CURL_DISABLE_SOCKETPAIR - Assisted-by: Jay Satiro - Closes #5607 - -- test1539: do a HTTP 1.0 POST without a set size (fails) + ... to completely disable the use of socketpair - Attempt to reproduce #5593. Test case 1514 is very similar but uses - HTTP/1.1 and thus switches to chunked. + Closes #5850 + +- curl_get_line: build only if cookies or alt-svc are enabled - Closes #5595 + Closes #5851 -- [Baruch Siach brought this change] +- [fullincome brought this change] - mbedtls: fix build with disabled proxy support - - Don't reference fields that do not exist. Fixes build failure: + schannel: fix memory leak when using get_cert_location - vtls/mbedtls.c: In function 'mbed_connect_step1': - vtls/mbedtls.c:249:54: error: 'struct connectdata' has no member named 'http_proxy' + The get_cert_location function allocates memory only on success. + Previously get_cert_location was able to allocate memory and return + error. It wasn't obvious and in this case the memory wasn't + released. - Closes #5615 + Fixes #5855 + Closes #5860 -- codeql-analysis.yml: fix the 'languages' setting +- [Emil Engler brought this change] + + git: ignore libtests in 3XXX area - It needs a 'with:' in front of it. + Currently the file tests/libtest/lib3010 is not getting + ignored by git. This fixes it by adding the 3XXX area to + the according .gitignore file. + + Closes #5859 -GitHub (26 Jun 2020) -- [Daniel Stenberg brought this change] +- [Emil Engler brought this change] - gtihub: codeql-analysis.yml + doh: add error message for DOH_DNS_NAME_TOO_LONG - enables code security scanning with github actions + When this error code was introduced in b6a53fff6c1d07e8a9, it was + forgotten to be added in the errors array and doh_strerror function. + + Closes #5863 -Daniel Stenberg (25 Jun 2020) -- tests: verify newline in username and password for HTTP +- ngtcp2: adapt to the new pkt_info arguments - test 1296 is a simply command line test + Guidance-by: Tatsuhiro Tsujikawa - test 1910 is a libcurl test including a redirect + Closes #5864 -- url: allow user + password to contain "control codes" for HTTP(S) +- winbuild/README.md: make visible - Reported-by: Jon Johnson Jr - Fixes #5582 - Closes #5592 + Follow-up to be753add31c2d8c -- escape: make the URL decode able to reject only %00 bytes +- winbuild: convert the instruction text to README.md - ... or all "control codes" or nothing. + Closes #5861 + +- lib1560: verify "redirect" to double-slash leading URL - Assisted-by: Nicolas Sterchele + Closes #5849 -- http2: set the correct URL in pushed transfers +Marc Hoersken (25 Aug 2020) +- multi: expand pre-check for socket readiness - ...previously CURLINFO_EFFECTIVE_URL would report the URL of the - original "mother transfer", not the actually pushed resource. + Check readiness of all sockets before waiting on them + to avoid locking in case the one-time event FD_WRITE + was already consumed by a previous wait operation. - Reported-by: Jonathan Cardoso Machado - Fixes #5589 - Closes #5591 + More information about WinSock network events: + https://docs.microsoft.com/en-us/windows/win32/api/ + winsock2/nf-winsock2-wsaeventselect#return-value + + Closes #5634 -Jay Satiro (25 Jun 2020) -- [Javier Blazquez brought this change] +- [rcombs brought this change] - openssl: Fix compilation on Windows when ngtcp2 is enabled + multi: implement wait using winsock events - - Include wincrypt before OpenSSL includes so that the latter can - properly handle any conflicts between the two. + This avoids using a pair of TCP ports to provide wakeup functionality + for every multi instance on Windows, where socketpair() is emulated + using a TCP socket on loopback which could in turn lead to socket + resource exhaustion. - Closes https://github.com/curl/curl/pull/5606 - -Daniel Stenberg (25 Jun 2020) -- test543: extended to verify zero length input + A previous version of this patch failed to account for how in WinSock, + FD_WRITE is set only once when writing becomes possible and not again + until after a send has failed due to the buffer filling. This contrasts + to how FD_READ and FD_OOB continue to be set until the conditions they + refer to no longer apply. This meant that if a user wrote some data to + a socket, but not enough data to completely fill its send buffer, then + waited on that socket to become writable, we'd erroneously stall until + their configured timeout rather than returning immediately. - As was reported in #5601 - -- escape: zero length input should return a zero length output + This version of the patch addresses that issue by checking each socket + we're waiting on to become writable with select() before the wait, and + zeroing the timeout if it's already writable. - Regression added in 7.71.0. + Assisted-by: Marc Hörsken + Reviewed-by: Marcel Raad + Reviewed-by: Daniel Stenberg + Tested-by: Gergely Nagy + Tested-by: Rasmus Melchior Jacobsen + Tested-by: Tomas Berger - Fixes #5601 - Reported-by: Kristoffer Gleditsch - Closes #5602 + Replaces #5397 + Reverts #5632 + Closes #5634 -- Curl_inet_ntop: always check the return code +- select: reduce duplication of Curl_poll in Curl_socket_check - Reported-by: Siva Sivaraman - Fixes #5412 - Closes #5597 - -- sendf: improve the message on client write errors + Change Curl_socket_check to use select-fallback in Curl_poll + instead of implementing it in Curl_socket_check and Curl_poll. - Replace "Failed writing body (X != Y)" with - "Failure writing output to destination". Possibly slightly less cryptic. + Reviewed-by: Daniel Stenberg + Reviewed-by: Jay Satiro - Reported-by: coinhubs on github - Fixes #5594 - Closes #5596 - -- RELEASE-NOTES: synced - -- curlver: start working on 7.71.1 - -- [Denis Baručić brought this change] + Replaces #5262 and #5492 + Closes #5707 - DYNBUF.md: fix a typo: trail => tail +- select: fix poll-based check not detecting connect failure - Closes #5599 - -Version 7.71.0 (23 Jun 2020) - -Daniel Stenberg (23 Jun 2020) -- RELEASE-NOTES: curl 7.71.0 release - -- THANKS: curl 7.71.0 additions - -- url: make sure pushed streams get an allocated download buffer + This commit changes Curl_socket_check to use POLLPRI to + check for connect failure on the write socket, because + POLLPRI maps to fds_err. This is in line with select(2). - Follow-up to c4e6968127e876b0 + The select-based socket check correctly checks for connect + failures by adding the write socket also to fds_err. - When a new transfer is created, as a resuly of an acknowledged push, - that transfer needs a download buffer allocated. + The poll-based implementation (which internally can itself + fallback to select again) did not previously check for + connect failure by using POLLPRI with the write socket. - Closes #5590 - -Jay Satiro (22 Jun 2020) -- openssl: Don't ignore CA paths when using Windows CA store + See the follow up commit to this for more information. - This commit changes the behavior of CURLSSLOPT_NATIVE_CA so that it does - not override CURLOPT_CAINFO / CURLOPT_CAPATH, or the hardcoded default - locations. Instead the CA store can now be used at the same time. + This commit makes sure connect failures can be detected + and handled if HAVE_POLL_FINE is defined, eg. on msys2-devel. - The change is due to the impending release. The issue is still being - discussed. The behavior of CURLSSLOPT_NATIVE_CA is subject to change and - is now documented as experimental. + Reviewed-by: Daniel Stenberg + Reviewed-by: Jay Satiro - Ref: bc052cc (parent commit) - Ref: https://github.com/curl/curl/issues/5585 + Replaces #5509 + Prepares #5707 -- tool_operate: Don't use Windows CA store as a fallback - - Background: - - 148534d added CURLSSLOPT_NATIVE_CA to use the Windows OS certificate - store in libcurl w/ OpenSSL on Windows. CURLSSLOPT_NATIVE_CA overrides - CURLOPT_CAINFO if both are set. The curl tool will fall back to - CURLSSLOPT_NATIVE_CA if it could not find a certificate bundle to set - via CURLOPT_CAINFO. - - Problem: +- select.h: make socket validation macros test for INVALID_SOCKET - libcurl may be built with hardcoded paths to a certificate bundle or - directory, and if CURLSSLOPT_NATIVE_CA is used then those paths are - ignored. - - Solution: - - A solution is still being discussed but since there's an impending - release this commit removes using CURLSSLOPT_NATIVE_CA in the curl tool. + With Winsock the valid range is [0..INVALID_SOCKET-1] according to + https://docs.microsoft.com/en-us/windows/win32/winsock/socket-data-type-2 - Ref: https://github.com/curl/curl/issues/5585 - -- openssl: Fix CA fallback logic for OpenSSL 3.0 build - - Prior to this change I assume a build error would occur when - CURL_CA_FALLBACK was used. + Reviewed-by: Jay Satiro + Reviewed-by: Marcel Raad + Reviewed-by: Daniel Stenberg - Closes https://github.com/curl/curl/pull/5587 - -Daniel Stenberg (22 Jun 2020) -- copyright: update mismatched copyright years - -- test1460: verify that -Ji is not ok + Closes #5760 -- tool_getparam: -i is not OK if -J is used +Daniel Stenberg (24 Aug 2020) +- docs: --output-dir is added in 7.73.0, nothing else - Reported-by: sn on hackerone - Bug: https://curl.haxx.se/docs/CVE-2020-8177.html - -- [Peter Wu brought this change] + Follow-up to 5620d2cc78c0 - CMake: ignore INTERFACE_LIBRARY targets for pkg-config file +- curl: add --output-dir - Reviewed-by: Marcel Raad - Fixes #5512 - Closes #5517 - -- [Valentyn Korniienko brought this change] - - multibyte: Fixed access-> waccess to file for Windows Plarform + Works with --create-dirs and with -J - Reviewed-by: Marcel Raad - Closes #5580 - -- altsvc: bump to h3-29 + Add test 3008, 3009, 3011, 3012 and 3013 to verify. - Closes #5584 + Closes #5637 -- urlglob: treat literal IPv6 addresses with zone IDs as a host name +- configure: fix pkg-config detecting wolfssl - ... and not as a "glob". Now done by passing the supposed host to the - URL parser which supposedly will do a better job at identifying "real" - numerical IPv6 addresses. + When amending the include path with "/wolfssl", this now properly strips + off all whitespace from the path variable! Previously this would lead to + pkg-config builds creating bad command lines. - Reported-by: puckipedia on github - Fixes #5576 - Closes #5579 + Closes #5848 -- test1179: verify error message for non-existing cmdline option +- [Michael Musset brought this change] -- tool_getparam: repair the error message for unknown flag + sftp: add the option CURLKHSTAT_FINE_REPLACE - Follow-up to 9e5669f3880674 - Detected by Coverity CID 1464582 ("Logically dead code") + Replace the old fingerprint of the host with a new. - Closes #5577 + Closes #5685 -- FILEFORMAT: describe verify/stderr +- RELEASE-NOTES: synced + + The next release is now to become 7.73.0 -- connect: improve happy eyeballs handling +- checksrc: verify do-while and spaces between the braces - For QUIC but also for regular TCP when the second family runs out of IPs - with a failure while the first family is still trying to connect. + Updated mprintf.c to comply - Separated the timeout handling for IPv4 and IPv6 connections when they - both have a number of addresses to iterate over. - -- ngtcp2: never call fprintf() in lib code in release version + Closes #5845 -- ngtcp2: fix happy eyeballs quic connect crash +- curl: support XDG_CONFIG_HOME to find .curlrc - Reported-by: Peter Wu - Fixes #5565 - Closes #5568 - -- select: remove the unused ELAPSED_MS() macro + Added test433 to verify. Updated documentation. - Closes #5573 - -Marc Hoersken (17 Jun 2020) -- [rcombs brought this change] + Reviewed-by: Jay Satiro + Suggested-by: Eli Schwartz + Fixes #5829 + Closes #5837 - multi: implement wait using winsock events +- etag: save and use the full received contents - This avoids using a pair of TCP ports to provide wakeup functionality - for every multi instance on Windows, where socketpair() is emulated - using a TCP socket on loopback which could in turn lead to socket - resource exhaustion. + ... which makes it support weak tags and non-standard etags too! - Reviewed-by: Gergely Nagy - Reviewed-by: Marc Hörsken + Added test case 347 to verify blank incoming ETag: - Closes #5397 + Fixes #5610 + Closes #5833 -Daniel Stenberg (17 Jun 2020) -- manpage: add three missing environment variables +- setopt: if the buffer exists, refuse the new BUFFERSIZE - CURL_SSL_BACKEND, QLOGDIR and SSLKEYLOGFILE + The buffer only exists during transfer and then we shouldn't change the + size (the setopt is not documented to work then). - Closes #5571 + Reported-by: Harry Sintonen + Closes #5842 -- RELEASE-NOTES: synced +- [COFFEETALES brought this change] -- configure: for wolfSSL, check for the DES func needed for NTLM + sftp: add new quote commands 'atime' and 'mtime' - Also adds pkg-config support for the wolfSSL detection. - -- [Ruurd Beerstra brought this change] + Closes #5810 - ntlm: enable NTLM support with wolfSSL - - When wolfSSL is built with its OpenSSL API layer, it fetures the same DES* - functions that OpenSSL has. This change take advantage of that. +- CURLE_PROXY: new error code - Co-authored-by: Daniel Stenberg - Closes #5556 - Fixes #5548 - -- http: move header storage to Curl_easy from connectdata + Failures clearly returned from a (SOCKS) proxy now causes this return + code. Previously the situation was not very clear as what would be + returned and when. - Since the connection can be used by many independent requests (using - HTTP/2 or HTTP/3), things like user-agent and other transfer-specific - data MUST NOT be kept connection oriented as it could lead to requests - getting the wrong string for their requests. This struct data was - lingering like this due to old HTTP1 legacy thinking where it didn't - mattered.. + In addition: when this error code is returned, an application can use + CURLINFO_PROXY_ERROR to query libcurl for the detailed error, which then + returns a value from the new 'CURLproxycode' enum. - Fixes #5566 - Closes #5567 + Closes #5770 -- CODE_REVIEW.md: how to do code reviews in curl +- runtests: make cleardir() erase dot files too - Assisted-by: Daniel Gustafsson - Assisted-by: Rich Salz - Assisted-by: Hugo van Kemenade - Assisted-by: James Fuller - Assisted-by: Marc Hörsken - Assisted-by: Jay Satiro + Because test cases might use dot files. - Closes #5555 + Closes #5838 -- altsvc: remove the num field from the altsvc struct +- KNOWN_BUGS: 'no_proxy' string-matches IPv6 numerical addreses - It was superfluous since we have the list.size alredy + Also: the current behavior is now documented in the curl.1 and + CURLOPT_NOPROXY.3 man pages. - Reported-by: Jay Satiro - Fixes #5553 - Closes #5563 + Reported-by: Andrew Barnes + Closes #5745 + Closes #5841 -- version.d: expanded and alpha-sorted +Viktor Szakats (22 Aug 2020) +- Makefile.m32: add ability to override zstd libs [ci skip] - Added a few missing features not previously mentioned. Ordered them - alphabetically. + Similarly to brotli, where this was already possible. + E.g. it allows to link zstd statically to libcurl.dll. - Closes #5558 - -- ABI.md: rename to .md and polish the markdown + Ref: https://github.com/curl/curl-for-win/issues/12 + Ref: https://github.com/curl/curl-for-win/commit/d9b266afd2e5d3f5604483010ef62340b5918c89 - Closes #5562 + Closes https://github.com/curl/curl/pull/5840 -- HELP-US: add a section for "smaller tasks" +Daniel Stenberg (21 Aug 2020) +- runtests: avoid 'fail to start' repeated messages in attempt loops - The point of this section is to meet the CII Best Practices gold level - critera: + Closes #5834 + +- runtests: clear pid variables when failing to start a server - "The project MUST clearly identify small tasks that can be performed by - new or casual contributors" + ... as otherwise the parent doesn't detect the failure and believe it + actually worked to start. - Closes #5560 + Reported-by: Christian Weisgerber + Bug: https://curl.haxx.se/mail/lib-2020-08/0018.html + Closes #5834 -- TODO: retry on the redirected-to URL +- TODO: Virtual external sockets - Closes #5462 - -- mailmap: Nicolas Sterchele + Closes #5835 -- [Nicolas Sterchele brought this change] +- [Don J Olmstead brought this change] - TODO: remove 19.3 section title - - Follow-up to ad6416986755e417c66e2c6, which caused wrong formatting on - curl documentation website + dist: add missing CMake Find modules to the distribution - Closes #5561 - -- [Martin V brought this change] + Closes #5836 - test1560: avoid possibly negative association in wording +- RELEASE-NOTES: synced - Closes #5549 + ... and version bumped to 7.72.1 -- share: don't set the share flag it something fails +- tls: provide the CApath verbose log on its own line - When asking for a specific feature to be shared in the share object, - that bit was previously set unconditionally even if the shared feature - failed or otherwise wouldn't work. + ... not newline separated from the previous line. This makes it output + asterisk prefixed properly like other verbose putput! - Closes #5554 + Reported-by: jmdavitt on github + Fixes #5826 + Closes #5827 -- buildconf: remove -print from the find command that removes files - - It's just too annoying and unnecessary to get a long list of files shown +Version 7.72.0 (19 Aug 2020) +Daniel Stenberg (19 Aug 2020) - RELEASE-NOTES: synced + + The curl 7.72.0 release -- wording: avoid blacklist/whitelist stereotypes +- THANKS: add names from curl 7.72.0 release + +Jay Satiro (18 Aug 2020) +- KNOWN_BUGS: Schannel TLS 1.2 handshake bug in old Windows versions - Instead of discussing if there's value or meaning (implied or not) in - the colors, let's use words without the same possibly negative - associations. + Reported-by: plujon@users.noreply.github.com - Closes #5546 + Closes https://github.com/curl/curl/issues/5488 -Jay Satiro (9 Jun 2020) -- tool_getparam: fix memory leak in parse_args +Daniel Stenberg (17 Aug 2020) +- Curl_easy: remember last connection by id, not by pointer - Prior to this change in Windows Unicode builds most parsed options would - not be freed. + CVE-2020-8231 - Found using _CrtDumpMemoryLeaks(). + Bug: https://curl.haxx.se/docs/CVE-2020-8231.html - Ref: https://github.com/curl/curl/issues/5545 + Reported-by: Marc Aldorasi + Closes #5824 -Daniel Stenberg (8 Jun 2020) -- socks: detect connection close during handshake +- examples/rtsp.c: correct the copyright year + +- RELEASE-PROCEDURE.md: add more future release dates + +- [H3RSKO brought this change] + + docs: change "web site" to "website" - The SOCKS4/5 state machines weren't properly terminated when the proxy - connection got closed, leading to a busy-loop. + According to wikipedia: - Reported-By: zloi-user on github - Fixes #5532 - Closes #5542 + While "web site" was the original spelling, this variant has become + rarely used, and "website" has become the standard spelling + + Closes #5822 -- [James Fuller brought this change] +- [Bevan Weiss brought this change] - multi: add defensive check on data->multi->num_alive + CMake: don't complain about missing nroff - Closes #5540 - -- Curl_addrinfo: use one malloc instead of three + The curl_nroff_check() was always being called, and complaining if + *NROFF wasn't found, even when not making the manual. - To reduce the amount of allocations needed for creating a Curl_addrinfo - struct, make a single larger malloc instead of three separate smaller - ones. + Only check for nroff (and complain) if actually making the manual - Closes #5533 + Closes #5817 -- [Alessandro Ghedini brought this change] +- [Brian Inglis brought this change] - quiche: update SSLKEYLOGFILE support + libtest/Makefile.am: add -no-undefined for libstubgss for Cygwin - quiche now requires the application to explicitly set the keylog path - for each connection, rather than reading the environment variable - itself. + copy the LDFLAGS approach for adding same option with `libhostname` in + `libtest/Makefile.am`: - Closes #5541 + - init `libstubgss_la_LDFLAGS_EXTRA` variable, + - add option to variable inside conditional, + - use variable in `libstubgss_la_LDFLAGS` + + Fixes #5819 + Closes #5820 -- tests: add two simple tests for --login-options +- docs: clarify MAX_SEND/RECV_SPEED functionality - Test 895 and 896 - as a follow-up to a3e972313b + ... in particular what happens if the maximum speed limit is set to a + value that's smaller than the transfer buffer size in use. - Closes #5539 + Reported-by: Tomas Berger + Fixes #5788 + Closes #5813 -- ngtcp2: update with recent API changes +- test1140: compare stdout - Syncs with ngtcp2 commit 7e9a917d386d98 merged June 7 2020. + To make problems more immediately obvious when tests fail. - Assisted-by: Tatsuhiro Tsujikawa - Closes #5538 - -- [James Fuller brought this change] + Closes #5814 - socks: remove unreachable breaks in socks.c and mime.c +- asyn-ares: correct some bad comments - Closes #5537 + Closes #5812 -- tool_cfgable: free login_options at exit - - Memory leak - Reported-by: Geeknik Labs - Fixes #5535 - Closes #5536 +- [Emil Engler brought this change] -- libssh2: keep sftp errors as 'unsigned long' - - Remove weird work-around for storing the SFTP errors as int instead of - the "unsigned long" that libssh2 actually returns for SFTP errors. + docs: Add video link to docs/CONTRIBUTE.md - Closes #5534 + Closes #5811 -Marc Hoersken (6 Jun 2020) -- timeouts: move ms timeouts to timediff_t from int and long - - Now that all functions in select.[ch] take timediff_t instead - of the limited int or long, we can remove type conversions - and related preprocessor checks to silence compiler warnings. +- curl-config: ignore REQUIRE_LIB_DEPS in --libs output - Avoiding conversions from time_t was already done in 842f73de. + Fixes a curl-config issue on cygwin by making sure REQUIRE_LIB_DEPS is + not considered for the --libs output. - Based upon #5262 - Supersedes #5214, #5220 and #5221 - Follow up to #5343 and #5479 - Closes #5490 + Reported-by: ramsay-jones on github + Assisted-by: Brian Inglis and Ken Brown + Fixes #5793 + Closes #5808 -Daniel Stenberg (6 Jun 2020) -- [François Rigault brought this change] +- copyright: update/correct the year range on a few files - openssl: set FLAG_TRUSTED_FIRST unconditionally - - On some systems, openssl 1.0.x is still the default, but it has been - patched to contain all the recent security fixes. As a result of this - patching, it is possible for macro X509_V_FLAG_NO_ALT_CHAINS to be - defined, while the previous behavior of openssl to not look at trusted - chains first, remains. +- scripts/copyright.pl: ignore .muse files + +- [Emil Engler brought this change] + + multi: Remove 10-year old out-commented code - Fix it: ensure X509_V_FLAG_TRUSTED_FIRST is always set, do not try to - probe for the behavior of openssl based on the existence ofmacros. + The code hasn't been touched since 2010-08-18 - Closes #5530 + Closes #5805 -- server/util: fix logmsg format using curl_off_t argument +- KNOWN_BUGS: A shared connection cache is not thread-safe - ... this caused segfaults on armv7. + Closes #4915 + Closes #5802 + +- CONTRIBUTE: extend git commit message description - Regression added in dd0365d560aea5a (7.70.0) + In particular how the first line works. - Reviewed-by: Jay Satiro - Closes #5529 + Closes #5803 - RELEASE-NOTES: synced -- [Cherish98 brought this change] +- [Stefan Yohansson brought this change] - socks: fix expected length of SOCKS5 reply + transfer: move retrycount from connect struct to easy handle - Commit 4a4b63d forgot to set the expected SOCKS5 reply length when the - reply ATYP is X'01'. This resulted in erroneously expecting more bytes - when the request length is greater than the reply length (e.g., when - remotely resolving the hostname). + This flag was applied to the connection struct that is released on + retry. These changes move the retry counter into Curl_easy struct that + lives across retries and retains the new connection. - Closes #5527 + Reported-by: Cherish98 on github + Fixes #5794 + Closes #5800 -Marc Hoersken (5 Jun 2020) -- .gitignore: add directory containing the stats repo +- libssh2: s/ssherr/sftperr/ - Since the new curl/stats repository is designed to be - checked out into the curl repository working tree as stats/ - it should be on the ignore list to aid in commit staging. - -Daniel Stenberg (5 Jun 2020) -- [Adnan Khan brought this change] - - HTTP3.md: clarify cargo build directory + The debug output used ssherr instead of sftperr which not only outputs + the wrong error code but also casues a warning on Windows. - Cargo needs to be called from within the 'quiche' directory. + Follow-up to 7370b4e39f1 - Closes #5522 + Reported-by: Gisle Vanem + Bug: https://github.com/curl/curl/commit/7370b4e39f1390e701f5b68d910c619151daf72b#r41334700 + Closes #5799 -- user-agent.d: spell out what happens given a blank argument +- ftp: don't do ssl_shutdown instead of ssl_close - Closes #5525 - -- trailers: switch h1-trailer logic to use dynbuf + The shutdown function is for downgrading a connection from TLS to plain, + and this is not requested here. - In the continued effort to remove "manual" realloc schemes. + Have ssl_close reset the TLS connection state. - Closes #5524 - -- CURLINFO_ACTIVESOCKET.3: clarify the description + This partially reverts commit f002c850d98d - Reported-by: Jay Satiro - Fixes #5299 - Closes #5520 - -- mailmap: Don J Olmstead + Reported-by: Rasmus Melchior Jacobsen + Reported-by: Denis Goleshchikhin + Fixes #5797 -- configure: only strip first -L from LDFLAGS - - In the logic that works out if a given OpenSSL path works, it stripped - off a possibly leading -L flag using an incorrect sed pattern which - would remove all instances of -L in the string, including if the path - itself contained that two-letter sequence! +Marc Hoersken (9 Aug 2020) +- CI/azure: fix test outcome values and use latest API version - The same pattern was used and is now updated in multiple places. Now it - only removes -L if it starts the strings. + This makes sure that tests ignored or skipped are not shown + just in the category "Other", but with their correct state. - Reported-by: Mohamed Osama - Fixes #5519 - Closes #5521 + Closes #5796 -Peter Wu (4 Jun 2020) -- quiche: advertise draft 28 support +- CI/azure: show runtime stats to investigate slowness - Fix the verbose message while at it, quiche currently supports draft - 27 and draft 28 simultaneously. + Also avoid naming conflict of TFLAGS env and tflags variables. - Closes #5518 + Closes #5776 -Daniel Stenberg (4 Jun 2020) -- KNOWN_BUGS: RTSP authentication breaks without redirect support +Daniel Stenberg (8 Aug 2020) +- TLS naming: fix more Winssl and Darwinssl leftovers - Closes #4750 - -Jay Satiro (4 Jun 2020) -- projects: Add crypt32.lib to dependencies for all OpenSSL configs + The CMake option is now called CMAKE_USE_SCHANNEL - Windows project configurations that use OpenSSL with USE_WIN32_CRYPTO - need crypt32. + The winbuild flag is USE_SCHANNEL - Follow-up to 148534d which added CURLSSLOPT_NATIVE_CA for 7.71.0. + The CI jobs and build scripts only use the new names and the new name + options - The changes that are in this commit were made by script. + Tests now require 'Schannel' (when necessary) - Ref: https://gist.github.com/jay/a1861b50ecce2b32931237180f856e28 + Closes #5795 + +- smtp_parse_address: handle blank input string properly - Closes https://github.com/curl/curl/pull/5516 + Closes #5792 -Marc Hoersken (3 Jun 2020) -- CI/macos: fix 'is already installed' errors by using bundle +- runtests: run the DICT server on a random port number - Avoid failing CI builds due to nghttp2 being already installed. + Removed support for -b (base port number) - Closes #5513 - -Daniel Stenberg (3 Jun 2020) -- altsvc: fix 'dsthost' may be used uninitialized in this function + Closes #5783 - RELEASE-NOTES: synced -- urldata: let the HTTP method be in the set.* struct - - When the method is updated inside libcurl we must still not change the - method as set by the user as then repeated transfers with that same - handle might not execute the same operation anymore! - - This fixes the libcurl part of #5462 +- runtests: move the TELNET server to a dynamic port - Test 1633 added to verify. + Rename the port variable to TELNETPORT to better match the existing + pattern. - Closes #5499 + Closes #5785 -- hostip: fix the memory-leak introduced in 67d2802 +- ngtcp2: adapt to error code rename - Fixes #5503 - Closes #5504 + Closes #5786 -- test970: make it require proxy support - - This test verifies the -w %json output and the test case includes a full - generated "blob". If there's no proxy support built into libcurl, it - will return an error for proxy related info variables and they will not - be included in the json, thus causing a mismatch and this test fails. +- runtests: move the smbserver to use a dynamic port number - Reported-by: Marc Hörsken - Fixes #5501 - Closes #5502 - -- [Radoslav Georgiev brought this change] + Closes #5782 - examples/http2-down/upload: add error checks - - If `index.html` does not exist in the directory from which the example - is invoked, the fopen(upload, "rb") invocation in `setup` would fail, - returning NULL. This value is subsequently passed as the FILE* argument - of the `fread` invocation in the `read_callback` function, which is the - actual cause of the crash (apparently `fread` assumes that argument to - be non-null). - - In addition, mitigate some possible crashes of similar origin. +- runtests: run the http2 tests on a random port number - Closes #5463 - -- [kotoriのねこ brought this change] + Closes #5779 - examples/ephiperfifo: turn off interval when setting timerfd +- gtls: survive not being able to get name/issuer - Reported-by: therealhirudo on github - Fixes #5485 - Closes #5497 - -- [Saleem Abdulrasool brought this change] + Closes #5778 - vtls: repair the build with `CURL_DISABLE_PROXY` - - `http_proxy` will not be available in `conndata` if `CURL_DISABLE_PROXY` - is enabled. Repair the build with that configuration. +- runtests: move the gnutls-serv tests to a dynamic port - Follow-up to f3d501dc67 + Affects test 320, 321, 322 and 324. - Closes #5498 + Closes #5778 -- transfer: remove k->str NULL check - - "Null-checking k->str suggests that it may be null, but it has already - been dereferenced on all paths leading to the check" - and it can't - legally be NULL at this point. Remove check. - - Detected by Coverity CID 1463884 +- runtests: support dynamicly base64 encoded sections in tests - Closes #5495 - -Marc Hoersken (1 Jun 2020) -- select: always use Sleep in Curl_wait_ms on Win32 + This allows us to make test cases to use base64 at run-time and still + use and verify information determined at run-time, such as the IMAP test + server's port number in test 842. - Since Win32 almost always will also have USE_WINSOCK, - we can reduce complexity and always use Sleep there. + This change makes 12 tests run again that basically never ran since we + moved to dynamic port numbers. - Assisted-by: Jay Satiro - Reviewed-by: Daniel Stenberg + ftpserver.pl is adjusted to load test instructions and test number from + the preprocessed test file. - Follow up to #5343 - Closes #5489 - -Daniel Stenberg (31 May 2020) -- conncache: download buffer needs +1 size for trailing zero + FILEFORMAT.md now documents the new base64 encoding syntax. - Follow-up to c4e6968127e - Detected by OSS-Fuzz: https://oss-fuzz.com/testcase-detail/5727799779524608 + Reported-by: Marcel Raad + Fixes #5761 + Closes #5775 -Marc Hoersken (31 May 2020) -- azure: use matrix strategy to avoid configuration redundancy - - This also includes the following changes: - - - Use the same timeout for all jobs on Linux (60 minutes) - and Windows (90 minutes) - - Use CLI stable apt-get install -y instead of apt install - which warns about that and run apt-get update first - - Enable MQTT for Windows msys2 builds instead of - legacy msys1 builds - - Add ./configure --prefix parameter to the msys2 builds - - The MSYSTEM environment variable is now preset inside - the container images for the msys2 builds +- curl.1: add a few missing valid exit codes - Note: on Azure Pipelines the matrix strategy is basically - just a simple list of job copies and not really a matrix. + 93 - 96 can be returned as well. - Closes #5468 + Closes #5777 -Daniel Stenberg (30 May 2020) -- build: disable more code/data when built without proxy support - - Added build to travis to verify +- TODO: Use multiple parallel transfers for a single download - Closes #5466 + Closes #5774 -- url: alloc the download buffer at transfer start - - ... and free it as soon as the transfer is done. It removes the extra - alloc when a new size is set with setopt() and reduces memory for unused - easy handles. - - In addition: the closure_handle now doesn't use an allocated buffer at - all but the smallest supported size as a stack based one. +- TODO: Set the modification date on an uploaded file - Closes #5472 + Closes #5768 -- timeouts: change millisecond timeouts to timediff_t from time_t - - For millisecond timers we like timediff_t better. Also, time_t can be - unsigned so returning a negative value doesn't work then. +- [Thomas M. DuBuisson brought this change] + + CI: Add muse CI config - Closes #5479 + Closes #5772 -Marc Hoersken (30 May 2020) -- select: add overflow checks for timeval conversions +- [Thomas M. DuBuisson brought this change] + + travis/script.sh: fix use of `-n' with unquoted envvar - Using time_t and suseconds_t if suseconds_t is available, - long on Windows (maybe others in the future) and int elsewhere. + Shellcheck tells us "-n doesn't work with unquoted arguments. quote or + use [[ ]]." - Also handle case of ULONG_MAX being greater or equal to INFINITE. + And testing shows: - Assisted-by: Jay Satiro - Reviewed-by: Daniel Stenberg + ``` + docker run --rm -it ubuntu bash + root@fe85ce156856:/# [ -n $DOES_NOT_EXIST ] && echo "I ran" + I ran + root@fe85ce156856:/# [ -n "$DOES_NOT_EXIST" ] && echo "I ran" + root@fe85ce156856:/# + ``` - Part of #5343 + Closes #5773 -- select: use timediff_t instead of time_t and int for timeout_ms +- h2: repair trailer handling - Make all functions in select.[ch] take timeout_ms as timediff_t - which should always be large enough and signed on all platforms - to take all possible timeout values and avoid type conversions. + The previous h2 trailer fix in 54a2b63 was wrong and caused a + regression: it cannot deal with trailers immediately when read since + they may be read off the connection by the wrong 'data' owner. - Reviewed-by: Jay Satiro - Reviewed-by: Daniel Stenberg + This change reverts the logic back to gathering all trailers into a + single buffer, like before 54a2b63. - Replaces #5107 and partially #5262 - Related to #5240 and #5286 - Closes #5343 + Reported-by: Tadej Vengust + Fixes #5663 + Closes #5769 -- unit1604.c: fix implicit conv from 'SANITIZEcode' to 'CURLcode' +Viktor Szakats (3 Aug 2020) +- windows: disable Unix Sockets for old mingw - GCC 10 warns about this with warning: implicit conversion - from 'SANITIZEcode' to 'CURLcode' [-Wenum-conversion] + Classic mingw and 10y+ old versions of mingw-w64 don't ship with + Windows headers having the typedef necessary for Unix Sockets + support, so try detecting these environments to disable this + feature. - Since 'expected_result' is not really of type 'CURLcode' and - it is not exposed in any way, we can just use 'SANITIZEcode'. + Ref: https://sourceforge.net/p/mingw-w64/mingw-w64/ci/cf6afc57179a5910621215f8f4037d406892072c/ Reviewed-by: Daniel Stenberg - Reviewed-by: Marcel Raad - Closes #5476 + Fixes #5674 + Closes #5758 -- tests/libtest: fix undefined reference to 'curlx_win32_fopen' - - Since curl_setup.h now makes use of curlx_win32_fopen for Win32 - builds with USE_WIN32_LARGE_FILES or USE_WIN32_SMALL_FILES defined, - we need to include the relevant files for tests using fopen, - because the libtest sources are also including curl_setup.h +Marcel Raad (3 Aug 2020) +- test1908: treat file as text - Reviewed-by: Marcel Raad - Reviewed-by: Daniel Stenberg + Fixes the line endings on Windows. - Follow up to #3784 (ffdddb45d9) - Closes #5475 + Closes https://github.com/curl/curl/pull/5767 -- appveyor: add non-debug plain autotools-based build - - This should enable us to catch linking issues with the - testsuite early, like the one described/fixed in #5475. +- TrackMemory tests: ignore realloc and free in getenv.c - Reviewed-by: Daniel Stenberg - Reviewed-by: Marcel Raad + These are only called for WIN32. - Closes #5477 + Closes https://github.com/curl/curl/pull/5767 + +Daniel Stenberg (3 Aug 2020) +- tests/FILEFORMAT.md: mention %HTTP2PORT -Daniel Stenberg (29 May 2020) - RELEASE-NOTES: synced -- Revert "buildconf: use find -execdir" +- tlsv1.3.d. only for TLS-using connections - This partially reverts commit c712009838f44211958854de431315586995bc61. + ... and rephrase that "not all" TLS backends support it. - Keep the ares_ files removed but bring back the older way to run find, - to make it work with busybox's find, as apparently that's being used. + Closes #5764 + +- tls-max.d: this option is only for TLS-using connections - Reported-by: Max Peal - Fixes #5483 - Closes #5484 + Ref: #5763 + Closes #5764 -- server/sws: fix asan warning on use of uninitialized variable +Marcel Raad (2 Aug 2020) +- [Cameron Cawley brought this change] -- libssh2: improved error output for wrong quote syntax - - Reported-by: Werner Stolz + tool_doswin: Simplify Windows version detection - Closes #5474 + Closes https://github.com/curl/curl/pull/5754 -- mk-lib1521: generate code for testing BLOB options as well - - Follow-up to cac5374298b3 - - Closes #5478 +- [Cameron Cawley brought this change] -- configure: repair the check if argv can be written to - - Due to bad escaping of the test code, the test wouldn't build and thus - result in a negative test result, which would lead to the unconditional - assumption that overwriting the arguments doesn't work and thus curl - would never hide credentials given in the command line, even when it - would otherwise be possible. - - Regression from commit 2d4c2152c (7.60.0) + win32: Add Curl_verify_windows_version() to curlx - Reported-by: huzunhao on github - Fixes #5470 - Closes #5471 + Closes https://github.com/curl/curl/pull/5754 -Peter Wu (28 May 2020) -- CMake: rebuild Makefile.inc.cmake when Makefile.inc changes - - Otherwise the build might fail due to missing source files, as - demonstrated by the recent keylog.c addition on an existing build dir. +- runtests.pl: treat LibreSSL and BoringSSL as OpenSSL - Closes #5469 - -Daniel Stenberg (28 May 2020) -- urldata: fix comments: Curl_done() is called multi_done() now + This makes the tests that require the OpenSSL feature also run for + those two compatible libraries. - ... since 575e885db + Closes https://github.com/curl/curl/pull/5762 -Peter Wu (27 May 2020) -- ngtcp2: use common key log routine for better thread-safety +Daniel Stenberg (1 Aug 2020) +- multi: Condition 'extrawait' is always true - Tested with ngtcp2 built against the OpenSSL library. Additionally - tested with MultiSSL (NSS for TLS and ngtcp2+OpenSSL for QUIC). + Reported by Codacy. - The TLS backend (independent of QUIC) may or may not already have opened - the keylog file before. Therefore Curl_tls_keylog_open is always called - to ensure the file is open. + Reviewed-by: Marcel Raad + Closes #5759 -- wolfssl: add SSLKEYLOGFILE support +Marcel Raad (1 Aug 2020) +- openssl: fix build with LibreSSL < 2.9.1 - Tested following the same curl and tshark commands as in commit - "vtls: Extract and simplify key log file handling from OpenSSL" using - WolfSSL v4.4.0-stable-128-g5179503e8 from git master built with - `./configure --enable-all --enable-debug CFLAGS=-DHAVE_SECRET_CALLBACK`. + `SSL_CTX_add0_chain_cert` and `SSL_CTX_clear_chain_certs` were + introduced in LibreSSL 2.9.1 [0]. - Full support for this feature requires certain wolfSSL build options, - see "Availability note" in lib/vtls/wolfssl.c for details. + [0] https://github.com/libressl-portable/openbsd/commit/0db809ee178457c8170abfae3931d7bd13abf3ef - Closes #5327 + Closes https://github.com/curl/curl/pull/5757 -- vtls: Extract and simplify key log file handling from OpenSSL - - Create a set of routines for TLS key log file handling to enable reuse - with other TLS backends. Simplify the OpenSSL backend as follows: - - - Drop the ENABLE_SSLKEYLOGFILE macro as it is unconditionally enabled. - - Do not perform dynamic memory allocation when preparing a log entry. - Unless the TLS specifications change we can suffice with a reasonable - fixed-size buffer. - - Simplify state tracking when SSL_CTX_set_keylog_callback is - unavailable. My original sslkeylog.c code included this tracking in - order to handle multiple calls to SSL_connect and detect new keys - after renegotiation (via SSL_read/SSL_write). For curl however we can - be sure that a single master secret eventually becomes available - after SSL_connect, so a simple flag is sufficient. An alternative to - the flag is examining SSL_state(), but this seems more complex and is - not pursued. Capturing keys after server renegotiation was already - unsupported in curl and remains unsupported. - - Tested with curl built against OpenSSL 0.9.8zh, 1.0.2u, and 1.1.1f - (`SSLKEYLOGFILE=keys.txt curl -vkso /dev/null https://localhost:4433`) - against an OpenSSL 1.1.1f server configured with: +Daniel Stenberg (1 Aug 2020) +- [Marc Aldorasi brought this change] + + multi_remove_handle: close unused connect-only connections - # Force non-TLSv1.3, use TLSv1.0 since 0.9.8 fails with 1.1 or 1.2 - openssl s_server -www -tls1 - # Likewise, but fail the server handshake. - openssl s_server -www -tls1 -Verify 2 - # TLS 1.3 test. No need to test the failing server handshake. - openssl s_server -www -tls1_3 + Previously any connect-only connections in a multi handle would be kept + alive until the multi handle was closed. Since these connections cannot + be re-used, they can be marked for closure when the associated easy + handle is removed from the multi handle. - Verify that all secrets (1 for TLS 1.0, 4 for TLS 1.3) are correctly - written using Wireshark. For the first and third case, expect four - matches per connection (decrypted Server Finished, Client Finished, HTTP - Request, HTTP Response). For the second case where the handshake fails, - expect a decrypted Server Finished only. + Closes #5749 + +- checksrc: invoke script with -D to find .checksrc proper - tshark -i lo -pf tcp -otls.keylog_file:keys.txt -Tfields \ - -eframe.number -eframe.time -etcp.stream -e_ws.col.Info \ - -dtls.port==4433,http -ohttp.desegment_body:FALSE \ - -Y 'tls.handshake.verify_data or http' + Without the -D command line option, checksrc.pl won't know which + directory to load the ".checksrc" file from when building out of the + source tree. - A single connection can easily be identified via the `tcp.stream` field. - -Daniel Stenberg (27 May 2020) -- FILEFORMAT: add more features that tests can depend on + Reported-by: Marcel Raad + Fixes #5715 + Closes #5755 -- [Michael Kaufmann brought this change] +- [Carlo Marcelo Arenas Belón brought this change] - transfer: close connection after excess data has been read - - For HTTP 1.x, it's a protocol error when the server sends more bytes - than announced. If this happens, don't reuse the connection, because the - start position of the next response is undefined. + buildconf: retire ares buildconf invocation - Closes #5440 + no longer needed after 4259d2df7dd95637a4b1e3fb174fe5e5aef81069 -- [Estanislau Augé-Pujadas brought this change] +- [Carlo Marcelo Arenas Belón brought this change] - Revert "ssh: ignore timeouts during disconnect" - - This reverts commit f31760e63b4e9ef1eb25f8f211390f8239388515. Shipped in - curl 7.54.1. + buildconf: excempt defunct reference to ACLOCAL_FLAGS - Bug: https://curl.haxx.se/mail/lib-2020-05/0068.html - Closes #5465 + retired with 09f278121e815028adb24d228d8092fc6cb022aa but kept around as + the name is generic enough that it might be in use and relied upon from + the environment. -- urldata: connect related booleans live in struct ConnectBits - - And remove a few unused booleans! - - Closes #5461 +- [Carlo Marcelo Arenas Belón brought this change] -- hostip: on macOS avoid DoH when given a numerical IP address + buildconf: avoid array concatenation in die() - When USE_RESOLVE_ON_IPS is set (defined on macOS), it means that - numerical IP addresses still need to get "resolved" - but not with DoH. + reported as error SC2145[1] by shellcheck, but not expected to cause + any behavioural differences otherwise. - Reported-by: Viktor Szakats - Fixes #5454 - Closes #5459 - -- ngtcp2: cleanup memory when failing to connect + [1] https://github.com/koalaman/shellcheck/wiki/SC2145 - Reported-by: Peter Wu - Fixes #5447 (the ngtcp2 side of it) - Closes #5451 + Closes #5701 -- quiche: clean up memory properly when failing to connect +- travis: add ppc64le and s390x builds - Addresses the quiche side of #5447 - Reported-by: Peter Wu - Closes #5450 - -- cleanup: use a single space after equals sign in assignments + Closes #5752 -- url: accept "any length" credentials for proxy auth - - They're only limited to the maximum string input restrictions, not to - 256 bytes. +Marc Hoersken (31 Jul 2020) +- connect: remove redundant message about connect failure - Added test 1178 to verify + Reviewed-by: Daniel Stenberg - Reported-by: Will Roberts - Fixes #5448 - Closes #5449 - -- [Maksim Stsepanenka brought this change] + Closes #5708 - test1167: fixes in badsymbols.pl +- tests/sshserver.pl: fix compatibility with OpenSSH for Windows - Closes #5442 + Follow up to #5721 -- altsvc: fix parser for lines ending with CRLF +- CI/azure: install libssh2 for use with msys2-based builds - Fixed the alt-svc parser to treat a newline as end of line. + This enables building and running the SFTP tests. + Unfortunately OpenSSH for Windows does not support SCP (yet). - The unit tests in test 1654 were done without CRLF and thus didn't quite - match the real world. Now they use CRLF as well. + Reviewed-by: Daniel Stenberg - Reported-by: Peter Wu - Assisted-by: Peter Wu - Assisted-by: Jay Satiro - Fixes #5445 - Closes #5446 + Closes #5721 -Viktor Szakats (25 May 2020) -- all: fix codespell errors +- CI/azure: increase Windows job timeout once again + + Avoid aborted jobs due to performance issues on Azure DevOps. - Reviewed-by: Jay Satiro Reviewed-by: Daniel Stenberg - Closes https://github.com/curl/curl/pull/5452 + Reviewed-by: Jay Satiro + + Closes #5738 -Peter Wu (25 May 2020) -- ngtcp2: fix build with current ngtcp2 master implementing draft 28 +Jay Satiro (30 Jul 2020) +- TODO: Schannel: 'Add option to allow abrupt server closure' - Based on client.cc changes from ngtcp2. Tested with current git master, - ngtcp2 commit c77d5731ce92, nghttp3 commit 65ff479d4380. + We should offer an option to allow abrupt server closures (server closes + SSL transfer without sending a known termination point such as length of + transfer or close_notify alert). Abrupt server closures are usually + because of misconfigured or very old servers. - Fixes #5444 - Closes #5443 + Closes https://github.com/curl/curl/issues/4427 -Daniel Stenberg (25 May 2020) -- RELEASE-NOTES: synced +- url: fix CURLU and location following - moved the new setopts up to a "change" + Prior to this change if the user set a URL handle (CURLOPT_CURLU) it was + incorrectly used for the location follow, resulting in infinite requests + to the original location. + + Reported-by: sspiri@users.noreply.github.com + + Fixes https://github.com/curl/curl/issues/5709 + Closes https://github.com/curl/curl/pull/5713 +Daniel Stenberg (30 Jul 2020) - RELEASE-NOTES: synced -- copyright: updated year ranges out of sync - - ... and whitelisted a few more files in the the copyright.pl script. - -- [Gilles Vollant brought this change] +- [divinity76 brought this change] - setopt: add CURLOPT_PROXY_ISSUERCERT(_BLOB) for coherency + docs: add date of 7.20 to CURLM_CALL_MULTI_PERFORM mentions - Closes #5431 - -- curl: remove -J "informational" written on stdout + it helps make it obvious that most developers don't have to care about + the CURLM_CALL_MULTI_PERFORM value (last release using it is nearly 11 + years old, November 4 2009) - curl would previously show "curl: Saved to filename 'name from header'" - if -J was used and a name was picked from the Content-Disposition - header. That output could interfer with other stdout output, such as -w. + Closes #5744 + +Jay Satiro (29 Jul 2020) +- tool_cb_wrt: fix outfile mode flags for Windows - This commit removes that output line. - Bug: https://curl.haxx.se/mail/archive-2020-05/0044.html - Reported-by: Коваленко Анатолий Викторович - Closes #5435 - -Peter Wu (22 May 2020) -- travis: simplify quiche build instructions wrt boringssl + - Use S_IREAD and S_IWRITE mode permission flags to create the file + on Windows instead of S_IRUSR, S_IWUSR, etc. - quiche builds boringssl as static library, reuse that instead of - building another shared library. + Windows only accepts a combination of S_IREAD and S_IWRITE. It does not + acknowledge other combinations, for which it may generate an assertion. - Closes #5438 - -- configure: fix pthread check with static boringssl + This is a follow-up to 81b4e99 from yesterday, which improved the + existing file check with -J. - A shared boringssl/OpenSSL library requires -lcrypto only for linking. - A static build additionally requires `-ldl -lpthread`. In the latter - case `-lpthread` is added to LIBS which prevented `-pthread` from being - added to CFLAGS. Clear LIBS to fix linking failures for libtest tests. + Ref: https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/open-wopen#remarks + Ref: https://github.com/curl/curl/pull/5731 + + Closes https://github.com/curl/curl/pull/5742 -Daniel Stenberg (22 May 2020) -- Revert "sendf: make failf() use the mvsnprintf() return code" +Daniel Stenberg (28 Jul 2020) +- checksrc: ban gmtime/localtime - This reverts commit 74623551f306990e70c7c5515b88972005604a74. + They're not thread-safe so they should not be used in libcurl code. - Instead mark the function call with (void). Getting the return code and - using it instead triggered Coverity warning CID 1463596 because - snprintf() can return a negative value... + Explictly enabled when deemed necessary and in examples and tests - Closes #5441 + Reviewed-by: Nicolas Sterchele + Closes #5732 -- typecheck-gcc.h: CURLINFO_PRIVATE does not need a 'char *' +- transfer: fix data_pending for builds with both h2 and h3 enabled - Reported-by: Billyzou0741326 on github - Fixes #5432 - Closes #5436 + Closes #5734 -- tests/server/util.h: add extern to silence compiler warning +- curl_multi_setopt: fix compiler warning "result is always false" - Follow-up from a3b0699d5c1 + On systems with 32 bit long the expression is always false. Avoid + the warning. + + Reported-by: Gisle Vanem + Bug: https://github.com/curl/curl/commit/61a08508f6a458fe21bbb18cd2a9bac2f039452b#commitcomment-40941232 + Closes #5736 -- typecheck-gcc.h: fix the OFF_T check +- curl: improve the existing file check with -J - The option number also needs to be less than CURLOPTTYPE_BLOB. + Previously a file that isn't user-readable but is user-writable would + not be properly avoided and would get overwritten. - Follow-up to cac5374298 - Reported-by: Jeroen Ooms - Bug: https://github.com/curl/curl/pull/5365#issuecomment-631084114 + Reported-by: BrumBrum on hackerone + Assisted-by: Jay Satiro + Bug: https://hackerone.com/reports/926638 + Closes #5731 -- TODO: --dry-run - - Closes #5426 +- [Jonathan Nieder brought this change] -- TODO: Ratelimit or wait between serial requests + multi: update comment to say easyp list is linear - Closes #5406 - -- tool_paramhlp: fixup C89 mistake + Since 09b9fc900 (multi: remove 'Curl_one_easy' struct, phase 1, + 2013-08-02), the easy handle list is not circular but ends with + ->next pointing to NULL. - Follow-up to c5f0a9db22. - -- [Siva Sivaraman brought this change] + Reported-by: Masaya Suzuki + Closes #5737 - tool_paramhlp: fixed potentially uninitialized strtol() variable +- CURLOPT_NOBODY.3: fix the syntax for referring to options - Seems highly unlikely to actually be possible, but better safe than - sorry. + As test 1140 fails otherwise! - Closes #5417 + Follow-up to e1bac81cc815 -- [Siva Sivaraman brought this change] +- ngtcp2: store address in sockaddr_storage + + Reported-by: Tatsuhiro Tsujikawa + Closes #5733 - tool_operate: fixed potentially uninitialized variables +- CURLOPT_NOBODY.3: clarify what setting to 0 means - ... in curl_easy_getinfo() calls. They're harmless but clearing the - variables makes the code safer and comforts the reader. + ... and mention that HTTP with other methods than HEAD might get a body and + there's no option available to stop that. - Closes #5416 + Closes #5729 -- sha256: move assign to the declaration line +- setopt: unset NOBODY switches to GET if still HEAD - Follow-up to fae30656. Should've been squashed with that commit... + Unsetting CURLOPT_NOBODY with 0L when doing HTTP has no documented + action but before 7.71.0 that used to switch back to GET and with this + change (assuming the method is still set to HEAD) this behavior is + brought back. + + Reported-by: causal-agent on github + Fixes #5725 + Closes #5728 -- [Siva Sivaraman brought this change] +- [Ehren Bendler brought this change] - sha256: fixed potentially uninitialized variable + configure: cleanup wolfssl + pkg-config conflicts when cross compiling. - Closes #5414 + Also choose a different wolfSSL function to test for NTLM support. + + Fixes #5605 + Closes #5682 -- sendf: make failf() use the mvsnprintf() return code +- configure: show zstd "no" in summary when built without it - ... and avoid a strlen() call. Fixes a MonocleAI warning. + Reported-by: Marc Hörsken + Fixes #5720 + Closes #5730 + +- quiche: handle calling disconnect twice - Reported-by: MonocleAI - Fixes #5413 - Closes #5420 + Reported-by: lilongyan-huawei on github + Fixes #5726 + Closes #5727 -- hostip: make Curl_printable_address not return anything +- [Nicolas Sterchele brought this change] + + getinfo: reset retry-after value in initinfo - It was not used much anyway and instead we let it store a blank buffer - in case of failure. + - Avoid re-using retry_after value from preceding request + - Add libtest 3010 to verify - Reported-by: MonocleAI - Fixes #5411 - Closes #5418 + Reported-by: joey-l-us on github + Fixes #5661 + Closes #5672 -- ftp: mark return-ignoring calls to Curl_GetFTPResponse with (void) +Marcel Raad (27 Jul 2020) +- WIN32: stop forcing narrow-character API - They're done on purpose, make that visible in the code. - Reported-by: MonocleAI - Fixes #5412 - Closes #549 - -- TODO: forbid TLS post-handshake auth and do TLS record padding + Except where the results are only used for character output. + getenv is not touched because it's part of the public API, and having + it return UTF-8 instead of ANSI would be a breaking change. - Closes #5396 - Closes #5398 + Fixes https://github.com/curl/curl/issues/5658 + Fixes https://github.com/curl/curl/issues/5712 + Closes https://github.com/curl/curl/pull/5718 -- RELEASE-NOTES: synced +Jay Satiro (27 Jul 2020) +- [Tobias Stoeckmann brought this change] -- dynbuf: return NULL when there's no buffer length + mprintf: Fix stack overflows - ... as returning a "" is not a good idea as the string is supposed to be - allocated and returning a const string will cause issues. + Stack overflows can occur with precisions for integers and floats. - Reported-by: Brian Carpenter - Follow-up to ed35d6590e72c - Closes #5405 - -Peter Wu (16 May 2020) -- travis: upgrade to bionic, clang-9, improve readability + Proof of concepts: + - curl_mprintf("%d, %.*1$d", 500, 1); + - curl_mprintf("%d, %+0500.*1$f", 500, 1); - Changes, partially to reduce build failures from external dependencies: - - Upgrade Ubuntu and drop unnecessary third-party repos. - - Properly clone apt config to ensure retries. - - Upgrade to clang-9 from the standard repos. - - Use Ubuntu 20.04 focal for the libssh build, use of ssh_get_publickey - fails on -Werror=deprecated-declarations in Ubuntu 18.04. Do not use - focal everywhere yet since Travis CI has not documented this option. - In focal, python-impacket (Py2.7) has been removed, leaving only - python3-impacket. Since it is only needed for SMB tests and not SSH, - skip it for the libssh job since it might need more work. - - apt: Remove gcc-8 and libstdc++-8-dev, already installed via g++-8. + Ideally, compile with -fsanitize=address which makes this undefined + behavior a bit more defined for debug purposes. - Non-functional cleanups: - - Simplify test matrix, drop redundant os and compiler keys. - - Deprecation fixes: remove sudo, rename matrix -> jobs. - - Every job has an 'env' key, put this key first in a list item. + The format strings are valid. The overflows occur due to invalid + arguments. If these arguments are variables with contents controlled + by an attacker, the function's stack can be corrupted. - Closes #5370 + Also see CVE-2016-9586 which partially fixed the float aspect. + + Signed-off-by: Tobias Stoeckmann + + Closes https://github.com/curl/curl/pull/5722 -- travis: whitespace-only changes for consistency +- [Tobias Stoeckmann brought this change] + + mprintf: Fix dollar string handling - Automatically apply a consistent indentation with: + Verify that specified parameters are in range. If parameters are too + large, fail early on and avoid out of boundary accesses. - python3 -c 'from ruamel.yaml import YAML;y=YAML();d=y.load(open(".travis.yml"));y.width=500;y.dump(d,open(".travis.yml.new","w"))' + Also do not read behind boundaries of illegal format strings. - followed by manually re-indenting three comments. + These are defensive measures since it is expected that format strings + are well-formed. Format strings should not be modifiable by user + input due to possible generic format string attacks. - Closes #5370 + Closes https://github.com/curl/curl/pull/5722 -- CMake: add libssh build support +Daniel Stenberg (26 Jul 2020) +- ntlm: free target_info before (re-)malloc - Closes #5372 - -Daniel Stenberg (15 May 2020) -- KNOWN_BUGS: wolfssh: publickey auth doesn't work + OSS-Fuzz found a way this could get called again with the pointer still + pointing to a malloc'ed memory, leading to a leak. - Closes #4820 + Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=24379 + + Closes #5724 -- KNOWN_BUGS: OS400 port requires deprecated IBM library +Marcel Raad (26 Jul 2020) +- CI/macos: set minimum macOS version - Closes #5176 + This enables some deprecation warnings. + Previously, autotools defaulted to 10.8. + + Closes https://github.com/curl/curl/pull/5723 -- [Vyron Tsingaras brought this change] +Daniel Stenberg (26 Jul 2020) +- RELEASE-NOTES: synced - http2: keep trying to send pending frames after req.upload_done +Marcel Raad (25 Jul 2020) +- CI/macos: enable warnings as errors for CMake builds - Fixes #1410 - Closes #5401 + Closes https://github.com/curl/curl/pull/5716 -- [Gilles Vollant brought this change] - - setopt: support certificate options in memory with struct curl_blob - - This change introduces a generic way to provide binary data in setopt - options, called BLOBs. +- CMake: fix test for warning suppressions - This change introduces these new setopts: + GCC doesn't warn for unknown `-Wno-` options, except if there are other + warnings or errors [0]. This was problematic with `CURL_WERROR` as that + warning-as-error cannot be suppressed. Notably, this always happened + with `-Wno-pedantic-ms-format` when not targeting Windows. So test for + the positive form of the warning instead, which should always result in + a diagnostic if unknown. - CURLOPT_ISSUERCERT_BLOB, CURLOPT_PROXY_SSLCERT_BLOB, - CURLOPT_PROXY_SSLKEY_BLOB, CURLOPT_SSLCERT_BLOB and CURLOPT_SSLKEY_BLOB. + [0] https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html - Reviewed-by: Daniel Stenberg - Closes #5357 + Closes https://github.com/curl/curl/pull/5714 -- source cleanup: remove all custom typedef structs +Jay Satiro (23 Jul 2020) +- curl.h: update CURLINFO_LASTONE - - Stick to a single unified way to use structs - - Make checksrc complain on 'typedef struct {' - - Allow them in tests, public headers and examples + CURLINFO_LASTONE should have been updated when + CURLINFO_EFFECTIVE_METHOD was added. - - Let MD4_CTX, MD5_CTX, and SHA256_CTX typedefs remain as they actually - typedef different types/structs depending on build conditions. + Reported-by: xwxbug@users.noreply.github.com - Closes #5338 - -- travis: remove the .checksrc fiddling + Fixes https://github.com/curl/curl/issues/5711 -- ftp: make domore_getsock() return the secondary socket properly +Marc Hoersken (22 Jul 2020) +- CI/azure: unconditionally enable warnings-as-errors with autotools - Previously, after PASV and immediately after the data connection has - connected, the function would only return the control socket to wait for - which then made the data connection simply timeout and not get polled - correctly. This become obvious when running test 1631 and 1632 event- - based. - -- test1632: verify FTP through HTTPS-proxy with connection re-use + Reviewed-by: Marcel Raad + + Follow up to #5694 + Closes #5706 -- test1631: verify FTP download through HTTPS-proxy +Marcel Raad (21 Jul 2020) +- doh: remove redundant cast + + Closes https://github.com/curl/curl/pull/5704 -- sws: as last resort, get test number from server cmd file +- CI/macos: unconditionally enable warnings-as-errors with autotools - If it can't be found in the request. Also support --cmdfile to set it to - a custom file name. + Previously, warnings were only visible in the output for most jobs. - runtests.pl always writes this file with the test number in it since a - while back. + Closes https://github.com/curl/curl/pull/5694 -- ftp: shut down the secondary connection properly when SSL is used +- util: silence conversion warnings - Reported-by: Neal Poole - Fixes #5340 - Closes #5385 + timeval::tv_usec might be a 32-bit integer and timespec::tv_nsec might + be a 64-bit integer. This is the case when building for recent macOS + versions, for example. Just treat tv_usec as an int, which should + hopefully always be sufficient on systems with + `HAVE_CLOCK_GETTIME_MONOTONIC`. + + Closes https://github.com/curl/curl/pull/5695 -Marcel Raad (14 May 2020) -- KNOWN_BUGS: adapt 5.5 to recent changes +- md(4|5): don't use deprecated macOS functions - It only applies to non-Unicode builds now. - Also merge 5.10 into it as it's effectively a duplicate. + They are marked as deprecated for -mmacosx-version-min >= 10.15, + which might result in warnings-as-errors. - Closes https://github.com/curl/curl/pull/3784 + Closes https://github.com/curl/curl/pull/5695 -- curl_setup: support Unicode functions to open files on Windows +Daniel Stenberg (18 Jul 2020) +- strdup: remove the odd strlen check - Use them only if `_UNICODE` is defined, in which case command-line - arguments have been converted to UTF-8. + It confuses code analyzers with its use of -1 for unsigned value. Also, + a check that's not normally used in strdup() code - and not necessary. - Closes https://github.com/curl/curl/pull/3784 + Closes #5697 -- tool: support UTF-16 command line on Windows - - - use `wmain` instead of `main` when `_UNICODE` is defined [0] - - define `argv_item_t` as `wchar_t *` in this case - - use the curl_multibyte gear to convert the command-line arguments to - UTF-8 +- [Alessandro Ghedini brought this change] + + travis: update quiche builds for new boringssl layout - This makes it possible to pass parameters with characters outside of - the current locale on Windows, which is required for some tests, e.g. - the IDN tests. Out of the box, this currently only works with the - Visual Studio project files, which default to Unicode, and winbuild - with the `ENABLE_UNICODE` option. + This is required after https://github.com/cloudflare/quiche/pull/593 + moved BoringSSL around slightly. - [0] https://devblogs.microsoft.com/oldnewthing/?p=40643 + This also means that Go is not needed to build BoringSSL anymore (the + one provided by quiche anyway). - Ref: https://github.com/curl/curl/issues/3747 - Closes https://github.com/curl/curl/pull/3784 + Closes #5691 -- curl_multibyte: add to curlx +Marcel Raad (17 Jul 2020) +- configure: allow disabling warnings - This will also be needed in the tool and tests. + When using `--enable-warnings`, it was not possible to disable warnings + via CFLAGS that got explicitly enabled. Now warnings are not enabled + anymore if they are explicitly disabled (or enabled) in CFLAGS. This + works for at least GCC, clang, and TCC as they have corresponding + `-Wno-` options for every warning. - Ref: https://github.com/curl/curl/pull/3758#issuecomment-482197512 - Closes https://github.com/curl/curl/pull/3784 + Closes https://github.com/curl/curl/pull/5689 -Daniel Stenberg (14 May 2020) -- url: make the updated credentials URL-encoded in the URL +Daniel Stenberg (16 Jul 2020) +- ngtcp2: adjust to recent sockaddr updates - Found-by: Gregory Jefferis - Reported-by: Jeroen Ooms - Added test 1168 to verify. Bug spotted when doing a redirect. - Bug: https://github.com/jeroen/curl/issues/224 - Closes #5400 + Closes #5690 -- tests: add https-proxy support to the test suite +- page-header: provide protocol details in the curl.1 man page - Initial test 1630 added with basic HTTPS-proxy use. HTTPS-proxy is like - HTTP proxy but with a full TLS connection to the proxy. + Add protocol and version specific information about all protocols curl + supports. - Closes #5399 - -- mailmap: James Fuller - -- [Major_Tom brought this change] + Fixes #5679 + Reported-by: tbugfinder on github + Closes #5686 - vauth/cleartext: fix theoretical integer overflow - - Fix theoretical integer overflow in Curl_auth_create_plain_message. +Daniel Gustafsson (16 Jul 2020) +- docs: Update a few leftover mentions of DarwinSSL - The security impact of the overflow was discussed on hackerone. We - agreed this is more of a theoretical vulnerability, as the integer - overflow would only be triggerable on systems using 32-bits size_t with - over 4GB of available memory space for the process. + Commit 76a9c3c4be10b3d4d379d5b23ca76806bbae536a renamed DarwinSSL to the + more correct/common name Secure Transport, but a few mentions in the docs + remained. - Closes #5391 + Closes #5688 + Reviewed-by: Daniel Stenberg -Jay Satiro (13 May 2020) -- curl.1: Quote globbed URLs +Daniel Stenberg (16 Jul 2020) +- file2memory: use a define instead of -1 unsigned value - - Quote the globbing example URLs that contain characters [] {} since - otherwise they may be interpreted as shell metacharacters. + ... to use the maximum value for 'size_t' when detecting integer overflow. + Changed the limit to max/4 as already that seems unreasonably large. - Bug: https://github.com/curl/curl/issues/5388 - Reported-by: John Simpson + Codacy didn't like the previous approach. - Closes https://github.com/curl/curl/pull/5394 + Closes #5683 -Daniel Stenberg (14 May 2020) -- checksrc: enhance the ASTERISKSPACE and update code accordingly - - Fine: "struct hello *world" +- CURL_PUSH_ERROROUT: allow the push callback to fail the parent stream - Not fine: "struct hello* world" (and variations) + ... by adding support for a new dedicated return code. - Closes #5386 + Suggested-by: Jonathan Cardoso + Assisted-by: Erik Johansson + URL: https://curl.haxx.se/mail/lib-2020-06/0099.html + Closes #5636 -- docs/options-in-versions: which version added each cmdline option +- [Baruch Siach brought this change] + + nss: fix build with disabled proxy support - Added test 971 to verify that the list is in sync with the files in - cmdline-opts. The check also verifies that .d-files that uses Added: - specify the same version number as the options-in-versions file does. + Avoid reference to fields that do not exist when CURL_DISABLE_PROXY is + defined. - Closes #5381 + Closes #5667 -- docs: unify protocol lists +- test1139: make it display the difference on test failures + +- test1119: verify stdout in the test - We boast support for 25 transfer protocols. Make sure the lists are - consistent + So that failures will be displayed in the terminal, as it makes test failures + visually displayed easier and faster. - Closes #5384 + Closes #5644 -- OpenSSL: have CURLOPT_CRLFILE imply CURLSSLOPT_NO_PARTIALCHAIN +- curl: add %{method} to the -w variables - ... to avoid an OpenSSL bug that otherwise makes the CRL check to fail. + Gets the CURLINFO_EFFECTIVE_METHOD from libcurl. - Reported-by: Michael Kaufmann - Fixes #5374 - Closes #5376 + Added test 1197 to verify. -- tls13-ciphers.d: shorten the Arg +- CURLINFO_EFFECTIVE_METHOD: added + + Provide the HTTP method that was used on the latest request, which might + be relevant for users when there was one or more redirects involved. + + Closes #5511 -- sasl-authzid.d: add Arg: and shorten the desc +Viktor Szakats (14 Jul 2020) +- windows: add unicode to feature list + + Reviewed-by: Marcel Raad + Reviewed-by: Marc Hörsken + + Closes #5491 -- cert-type.d: mention the available types in the desc +Daniel Stenberg (14 Jul 2020) +- multi: remove two checks always true + + Detected by Codacy + Closes #5676 -- tool: shorten 3 --help descriptions +Marc Hoersken (13 Jul 2020) +- workflows: limit what branches to run CodeQL on - --happy-eyeballs-timeout-ms, --resolve and --ssl-revoke-best-effort + Align CodeQL action with existing CI actions: + - Update branch filter to avoid duplicate CI runs. + - Shorten workflow name due to informative job name. - gen.pl already warned about these lines but we didn't listen + Reviewed-by: Daniel Stenberg - Closes #5379 + Closes #5660 -- configure: the wolfssh backend does not provide SCP +- appveyor: collect libcurl.dll variants with prefix or suffix - Closes #5387 - -- RELEASE-NOTES: synced - -- url: reject too long input when parsing credentials + On some platforms libcurl is build with a platform-specific + prefix and/or a version number suffix. - Since input passed to libcurl with CURLOPT_USERPWD and - CURLOPT_PROXYUSERPWD circumvents the regular string length check we have - in Curl_setstropt(), the input length limit is enforced in - Curl_parse_login_details too, separately. + Assisted-by: Jay Satiro - Reported-by: Thomas Bouzerar - Closes #5383 + Closes #5659 -- list-only.d: this option existed already in 4.0 +Daniel Stenberg (12 Jul 2020) +- [ihsinme brought this change] -Jay Satiro (12 May 2020) -- retry-all-errors.d: Shorten the summary line + socks: use size_t for size variable - Follow-up to b995bb5 from a few moments ago. + Use the unsigned type (size_t) in the arithmetic of pointers. In this + context, the signed type (ssize_t) is used unnecessarily. - Reported-by: Daniel Stenberg + Authored-by: ihsinme on github + Closes #5654 + +- RELEASE-NOTES: synced - Ref: https://github.com/curl/curl/commit/b995bb5#r39108929 + ... and bumped to 7.72.0 as the next release version number -- [denzor brought this change] +- [Gilles Vollant brought this change] - easy: fix dangling pointer on easy_perform fail + content_encoding: add zstd decoding support - Closes https://github.com/curl/curl/pull/5363 + include zstd curl patch for Makefile.m32 from vszakats + and include Add CMake support for zstd from Peter Wu + + Helped-by: Viktor Szakats + Helped-by: Peter Wu + Closes #5453 -- tool: Add option --retry-all-errors to retry on any error +- asyn.h: remove the Curl_resolver_getsock define - The "sledgehammer" of retrying. + - not used + - used the wrong number of arguments + - confused the Codeacy code analyzer - Closes https://github.com/curl/curl/pull/5185 + Closes #5647 -Daniel Stenberg (12 May 2020) -- [James Le Cuirot brought this change] +- [Nicolas Sterchele brought this change] - libcurl.pc: Merge Libs.private into Libs for static-only builds - - A project being built entirely statically will call pkg-config with - --static, which utilises the Libs.private field. Conversely it will - not use --static when not being built entirely statically, even if - there is only a static build of libcurl available. This will most - likely cause the build to fail due to underlinking unless we merge the - Libs fields. - - Consider that this is what the Meson build system does when it - generates pkg-config files. + configure.ac: Sort features name in summary - I have also reflected this in the --libs argument of curl-config even - though REQUIRE_LIB_DEPS always seems to be "yes" anyway. + - Same as protocols - Closes #5373 + Closes #5656 -- [Peter Wu brought this change] +- [Matthias Naegler brought this change] - CMake: fix runtests.pl with CMake, add new test targets - - * runtests.pl: - - Fix out-of-tree build under CMake when srcdir is not set. Default - srcdir to the location of runtests.pl. - - Add a hack to allow CMake to use the TFLAGS option as documented - in tests/README and used in scripts/travis/script.sh. - * Bump CMake version to 3.2 for USES_TERMINAL, dropping Debian Jessie - support (no one should care, it is already EOL.). - * Remove CTest since it defines its own 'test' target with no tests - since all unittests are already broken and not built by default. - * Add new test targets based on the options from Makefile.am. Since - new test targets are rarely added, I opted for duplicating the - runtests.pl options as opposed to creating a new Makefile.inc file. - Use top-level target names (test-x) instead of x-test since that is - used by CI and others. + cmake: fix windows xp build - Closes #5358 + Reviewed-by: Marcel Raad + Closes #5662 -- [Peter Wu brought this change] +- ngtcp2: update to modified qlog callback prototype + + Closes #5675 - CMake: do not build test programs by default +- transfer: fix memory-leak with CURLOPT_CURLU in a duped handle - The default target should only build libcurl and curl. Add a dedicated - 'testdeps' target which will be used later when running tests. Note that - unittests are currently broken in CMake and already excluded. + Added test case 674 to reproduce and verify the bug report. - Closes #5368 + Fixes #5665 + Reported-by: NobodyXu on github + Closes #5673 -- FILEFORMAT: moved up the variables section and further polished +- [Baruch Siach brought this change] -- runtests: remove ftp2 support, not used + bearssl: fix build with disabled proxy support - We once supported two separate ftp instances in the test suite. Has not - been used the last decade. + Avoid reference to fields that do not exist when CURL_DISABLE_PROXY is + defined. - Closes #5375 + Reviewed-by: Nicolas Sterchele + Closes #5666 -- url: sort the protocol schemes in rough popularity order - - When looking for a protocol match among supported schemes, check the - most "popular" schemes first. It has zero functionality difference and - for all practical purposes a speed difference will not be measureable - but it still think it makes sense to put the least likely matches last. - - "Popularity" based on the 2019 user survey. - - Closes #5377 +- RELEASE-NOTES: synced -Marc Hoersken (11 May 2020) -- test1238: avoid tftpd being busy for tests shortly following - - The tftpd server may still be busy if the total timeout of - 25 seconds has not been reached or no sread error was received - during or after the execution of the timeout test 1238. - - Once the next TFTP test comes around (eg. 1242 or 1243), - those will fail because the tftpd server is still waiting - on data from curl due to the UDP protocol being stateless - and having no connection close. On Linux this error may not - happen, because ICMP errors generated due to a swrite error - can also be returned async on the next sread call instead. - - Therefore we will now just kill the tftpd server after test - 1238 to make sure that the following tests are not affected. +Jay Satiro (11 Jul 2020) +- [Carlo Marcelo Arenas Belón brought this change] + + cirrus-ci: upgrade 11-STABLE to 11.4 - This enables us to no longer ignore tests 1242, 1243, 2002 - and 2003 on the CI platforms CirrusCI and AppVeyor. + Meant to be the last of the 11 series and so make sure that all + other references reflect all 11 versions so they can be retired + together later. - Assisted-by: Peter Wu - Closes #5364 + Closes https://github.com/curl/curl/pull/5668 -Daniel Stenberg (11 May 2020) -- write-out.d: added "response_code" +- [Filip Salomonsson brought this change] -- KNOWN_BUGS: Build with staticly built dependency + CURLINFO_CERTINFO.3: fix typo - I rewrote the item 5.4 to be more generic about static dependencies. + Closes https://github.com/curl/curl/pull/5655 -- ROADMAP: remove old entries - - MQTT - the start has already landed +Daniel Stenberg (4 Jul 2020) +- http2: only do the *done() cleanups for HTTP - tiny-curl - also mostly landed and is a continuous work + Follow-up to ef86daf4d3 - make menuconfig - basically no interest from users, not pushing there + Closes #5650 + Fixes #5646 -- [Peter Wu brought this change] +- [Alex Kiernan brought this change] - travis: Add ngtcp2 and quiche tests for CMake + gnutls: repair the build with `CURL_DISABLE_PROXY` - To avoid an explosion of jobs, extend the existing CMake tests with - ngtcp2 and quiche support. macOS was previously moved to GitHub actions, - so the non-Linux case can be dropped. - -- [Peter Wu brought this change] + `http_proxy`/`proxy_ssl`/`tunnel_proxy` will not be available in `conn` + if `CURL_DISABLE_PROXY` is enabled. Repair the build with that + configuration. + + Signed-off-by: Alex Kiernan + Closes #5645 - CMake: add ENABLE_ALT_SVC option +Alex Kiernan (3 Jul 2020) +- gnutls: Fetch backend when using proxy - Tested alt-svc with quiche. While at it, add missing MultiSSL reporting - (not tested). + Fixes: 89865c149 ("gnutls: remove the BACKEND define kludge") + Signed-off-by: Alex Kiernan -- [Peter Wu brought this change] +Daniel Stenberg (3 Jul 2020) +- [Laramie Leavitt brought this change] - CMake: add HTTP/3 support (ngtcp2+nghttp3, quiche) + http2: close the http2 connection when no more requests may be sent - Add three new CMake Find modules (using the curl license, but I grant - others the right to apply the CMake BSD license instead). + Well-behaving HTTP2 servers send two GOAWAY messages. The first + message is a warning that indicates that the server is going to + stop accepting streams. The second one actually closes the stream. - This CMake config is simpler than the autotools one because it assumes - ngtcp2 and nghttp3 to be used together. Another difference is that this - CMake config checks whether QUIC is actually supported by the TLS - library (patched OpenSSL or boringssl) since this can be a common - configuration mistake that could result in build errors later. + nghttp2 reports this state (and the other state of no more stream + identifiers) via the call nghttp2_session_check_request_allowed(). + In this state the client should not create more streams on the + session (tcp connection), and in curl this means that the server + has requested that the connection is closed. - Unlike autotools, CMake does not warn you that the features are - experimental. The user is supposed to already know that and read the - documentation. It requires a very special build environment anyway. + It would be also be possible to put the connclose() call into the + on_http2_frame_recv() function that triggers on the GOAWAY message. - Tested with ngtcp2+OpenSSL+nghttp3 and quiche+boringssl, both built from - current git master. Use `LD_DEBUG=files src/curl |& grep need` to figure - out which features (libldap-2.4, libssh2) to disable due to conflicts - with boringssl. + This fixes a bug seen when the client sees the following sequence of + frames: - Closes #5359 - -Marc Hoersken (10 May 2020) -- tests/server/tftpd.c: fix include and enhance debug logging + // advisory GOAWAY + HTTP2 GOAWAY [stream-id = 0, promised-stream-id = -1] + ... some additional frames - setjmp.h should only be included if HAVE_SETJMP_H is defined. + // final GOAWAY + HTTP2 GOAWAY [stream-id = 0, promised-stream-id = N ] - Add additional log statements to see wether reads and writes - are blocking or finishing before an alarm signal is received. + Before this change, curl will attempt to reuse the connection even + after the last stream, will encounter this error: - Assisted-by: Peter Wu - Part of #5364 - -Daniel Stenberg (10 May 2020) -- tool_operate: only set CURLOPT_SSL_OPTIONS if SSL support is present + * Found bundle for host localhost: 0x5595f0a694e0 [can multiplex] + * Re-using existing connection! (#0) with host localhost + * Connected to localhost (::1) port 10443 (#0) + * Using Stream ID: 9 (easy handle 0x5595f0a72e30) + > GET /index.html?5 HTTP/2 + > Host: localhost:10443 + > user-agent: curl/7.68.0 + > accept: */* + > + * stopped the pause stream! + * Connection #0 to host localhost left intact + curl: (16) Error in the HTTP2 framing layer - Reported-by: Marcel Raad - Follow-up to 148534db5 - Fixes #5367 - Closes #5369 - -Marc Hoersken (9 May 2020) -- appveyor: update comments to be clear about toolchain + This error may posion the connection cache, causing future requests + which resolve to the same curl connection to go through the same error + path. - - CMake-based MSYS builds use mingw-w64 to cross-compile. - - autotools-based builds are compiled using msys2-devel. + Closes #5643 + +- ftpserver: don't verify SMTP MAIL FROM names - The difference is that the later ones are not cross-compiled - to Windows and instead require the msys2 runtime to be present. + Rely on tests asking the names to get refused instead - test servers + should be as dumb as possible. Edited test 914, 955 and 959 accordingly. - At the moment only the Azure Pipelines CI builds actually - run autotools-based cross-compilation builds for Windows. + Closes #5639 -- TODO: update regarding missing Schannel features +- curl_version_info.3: CURL_VERSION_KERBEROS4 is deprecated - Some aspects have already been implemented over the years. + This came up in #5640. It make sense to clarify this in the docs! - 15.1 Client certificates are now supported: + Reminded-by: Kamil Dudka + Closes #5642 + +Kamil Dudka (3 Jul 2020) +- tool_getparam: make --krb option work again - - System stores via e35b0256eb34f1fe562e3e2a2615beb50a391c52 - - PKCS#12 files via 0fdf96512613574591f501d63fe49495ba40e1d5 + It was disabled by mistake in commit curl-7_37_1-23-ge38ba4301. - 15.2 Ciphers can now be specified through: + Bug: https://bugzilla.redhat.com/1833193 + Closes #5640 + +Daniel Stenberg (2 Jul 2020) +- [Jeremy Maitin-Shepard brought this change] + + http2: fix nghttp2_strerror -> nghttp2_http2_strerror in debug messages - - Algorithms via 9aefbff30d280c60fc9d8cc3e0b2f19fc70a2f28 + Confusingly, nghttp2 has two different error code enums: - Reviewed-by: Daniel Stenberg and Marcel Raad - Closes #5358 + - nghttp2_error, to be used with nghttp2_strerror + - nghttp2_error_code, to be used with nghttp2_http2_strerror + + Closes #5641 -Daniel Stenberg (8 May 2020) -- checksrc: close the .checksrc file handle when done reading +Marcel Raad (2 Jul 2020) +- url: silence MSVC warning + + Since commit f3d501dc678, if proxy support is disabled, MSVC warns: + url.c : warning C4701: potentially uninitialized local variable + 'hostaddr' used + url.c : error C4703: potentially uninitialized local pointer variable + 'hostaddr' used + + That could actually only happen if both `conn->bits.proxy` and + `CURL_DISABLE_PROXY` were enabled. + Initialize it to NULL to silence the warning. + + Closes https://github.com/curl/curl/pull/5638 +Daniel Stenberg (1 Jul 2020) - RELEASE-NOTES: synced - - And bumped next version to 7.71.0 -- [Gilles Vollant brought this change] +Version 7.71.1 (30 Jun 2020) - CURLOPT_SSL_OPTIONS: add *_NATIVE_CA to use Windows CA store (with openssl) - - Closes #4346 +Daniel Stenberg (30 Jun 2020) +- RELEASE-NOTES: curl 7.71.1 -- TODO: native IDN support on macOS +- THANKS: add contributors to 7.71.1 -- urlapi: accept :: as a valid IPv6 address +- scripts/copyright.pl: skip .dcignore + +- Revert "multi: implement wait using winsock events" - Text 1560 is extended to verify. + This reverts commit 8bc25c590e530de87595d1bb3577f699eb1309b9. - Reported-by: Pavel Volgarev - Fixes #5344 - Closes #5351 + That commit (from #5397) introduced a regression in 7.71.0. + + Reported-by: tmkk on github + Fixes #5631 + Closes #5632 -- THANKS-filter: Peter Wang +- TODO: Add flag to specify download directory -- [Peter Wang brought this change] +- TODO: return code to CURLMOPT_PUSHFUNCTION to fail connection - *_sspi: fix bad uses of CURLE_NOT_BUILT_IN +- cirrus-ci: disable FreeBSD 13 (again) - Return CURLE_AUTH_ERROR instead of CURLE_NOT_BUILT_IN for other - instances of QuerySecurityPackageInfo failing, as in - commit 2a81439553286f12cd04a4bdcdf66d8e026d8201. + It has been failing for a good while again. This time we better leave it + disabled until we have more reason to believe it behaves. - Closes #5355 - -- docs/HTTP3: add qlog to the quiche build instruction + Closes #5628 -- ngtcp2: introduce qlog support - - If the QLOGDIR environment variable is set, enable qlogging. +- ngtcp2: sync with current master - ... and create Curl_qlogdir() in the new generic vquic/vquic.c file for - QUIC functions that are backend independent. + ngtcp2 added two new callbacks - Closes #5353 + Reported-by: Lucien Zürcher + Fixes #5624 + Closes #5627 -- ntlm_sspi: fix bad use of CURLE_NOT_BUILT_IN - - That return code is reserved for build-time conditional code not being - present while this was a regular run-time error from a Windows API. +- examples/multithread.c: call curl_global_cleanup() - Reported-by: wangp on github - Fixes #5349 - Closes #5350 + Reported-by: qiandu2006 on github + Fixes #5622 + Closes #5623 -- runtests: show elapsed test time with higher precision (ms) +- vtls: compare cert blob when finding a connection to reuse + + Reported-by: Gergely Nagy + Fixes #5617 + Closes #5619 - RELEASE-NOTES: synced -- http2: simplify and clean up trailer handling +- terminology: call them null-terminated strings - Triggered by a crash detected by OSS-Fuzz after the dynbuf introduction in - ed35d6590e72. This should make the trailer handling more straight forward and - hopefully less error-prone. + Updated terminology in docs, comments and phrases to refer to C strings + as "null-terminated". Done to unify with how most other C oriented docs + refer of them and what users in general seem to prefer (based on a + single highly unscientific poll on twitter). - Deliver the trailer header to the callback already at receive-time. No - longer caches the trailers to get delivered at end of stream. + Reported-by: coinhubs on github + Fixes #5598 + Closes #5608 + +- http: fix proxy auth with blank password - Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=22030 - Closes #5348 + Regression in 7.71.0 + + Added test case 346 to verify. + + Reported-by: Kristoffer Gleditsch + Fixes #5613 + Closes #5616 -Marc Hoersken (7 May 2020) -- appveyor: disable test 1139 instead of ignoring it +- .dcignore: ignore tests and docs directories - Spending time on manpage checking makes no sense - for these builds due to lacking manpage support. + This is a config file for deepcode.ai, a static code analyzer. -- appveyor: disable flaky test 1501 and ignore broken 1056 +Jay Satiro (26 Jun 2020) +- tool_cb_hdr: Fix etag warning output and return code - Test 1501 is flaky on Windows CI due to being time sensitive - and the testsuite relying on taskkill.exe to check for the - existance of processes which can take to much time itself. + - Return 'failure' on failure, to follow the existing style. - Test 1056 is broken in autotools-based Windows builds due - to scope ID support missing in these builds at the moment. - -- test613.pl: make tests 613 and 614 work with OpenSSH for Windows + - Put Warning: and the warning message on the same line. - OpenSSH for Windows shows group and other/world permissions as *, - because those concepts do not exist on Windows. It also does not - show the current or parent directory, so we just ignore those. + Ref: https://github.com/curl/curl/issues/5610 - Reviewed-by: Daniel Stenberg - Closes #5328 + Closes https://github.com/curl/curl/pull/5612 -Daniel Stenberg (6 May 2020) -- runtests: set +x mode again +Daniel Stenberg (26 Jun 2020) +- CURLOPT_READFUNCTION.3: provide the upload data size up front + + Assisted-by: Jay Satiro + Closes #5607 -- libssh2: convert over to use dynbuf +- test1539: do a HTTP 1.0 POST without a set size (fails) - In my very basic test that lists sftp://127.0.0.1/tmp/, this patched - code makes 161 allocations compared to 194 in git master. A 17% - reduction. + Attempt to reproduce #5593. Test case 1514 is very similar but uses + HTTP/1.1 and thus switches to chunked. - Closes #5336 + Closes #5595 -- travis: add "qlog" as feature in the quiche build +- [Baruch Siach brought this change] -- quiche: enable qlog output + mbedtls: fix build with disabled proxy support - quiche has the potential to log qlog files. To enable this, you must - build quiche with the qlog feature enabled `cargo build --features - qlog`. curl then passes a file descriptor to quiche, which takes - ownership of the file. The FD transfer only works on UNIX. + Don't reference fields that do not exist. Fixes build failure: - The convention is to enable logging when the QLOGDIR environment is - set. This should be a path to a folder where files are written with the - naming template .qlog. + vtls/mbedtls.c: In function 'mbed_connect_step1': + vtls/mbedtls.c:249:54: error: 'struct connectdata' has no member named 'http_proxy' - Co-authored-by: Lucas Pardue - Replaces #5337 - Closes #5341 + Closes #5615 -- urldata.h: remove #define HEADERSIZE, not used anymore +- codeql-analysis.yml: fix the 'languages' setting - Follow-up to ed35d6590e72c + It needs a 'with:' in front of it. -- ngtcp2: convert to dynbuf +GitHub (26 Jun 2020) +- [Daniel Stenberg brought this change] + + gtihub: codeql-analysis.yml - Closes #5335 + enables code security scanning with github actions -- connect: make happy eyeballs work for QUIC (again) +Daniel Stenberg (25 Jun 2020) +- tests: verify newline in username and password for HTTP - Follow-up from dbd16c3e256c6c (regression in 7.70.0) + test 1296 is a simply command line test - Closes #5334 - -- connect: add two asserts to clue code analyzers in a little + test 1910 is a libcurl test including a redirect -- http_proxy: ported to use dynbuf instead of a static size buffer +- url: allow user + password to contain "control codes" for HTTP(S) - Removes a 16K static buffer from the easy handle. Simplifies the code. + Reported-by: Jon Johnson Jr + Fixes #5582 + Closes #5592 -- dynbuf: introduce internal generic dynamic buffer functions +- escape: make the URL decode able to reject only %00 bytes - A common set of functions instead of many separate implementations for - creating buffers that can grow when appending data to them. Existing - functionality has been ported over. + ... or all "control codes" or nothing. - In my early basic testing, the total number of allocations seem at - roughly the same amount as before, possibly a few less. + Assisted-by: Nicolas Sterchele + +- http2: set the correct URL in pushed transfers - See docs/DYNBUF.md for a description of the API. + ...previously CURLINFO_EFFECTIVE_URL would report the URL of the + original "mother transfer", not the actually pushed resource. - Closes #5300 + Reported-by: Jonathan Cardoso Machado + Fixes #5589 + Closes #5591 -- runtests: remove sleep calls - - Remove many one second sleeps that were done *after* each newly started - test server already has been verified. They should not have any purpose - there. - - Closes #5323 +Jay Satiro (25 Jun 2020) +- [Javier Blazquez brought this change] -- asyn-*: remove support for never-used NULL entry pointers + openssl: Fix compilation on Windows when ngtcp2 is enabled - ... and instead convert those to asserts to make sure they are truly - never NULL. + - Include wincrypt before OpenSSL includes so that the latter can + properly handle any conflicts between the two. - Closes #5324 + Closes https://github.com/curl/curl/pull/5606 -- [Emil Engler brought this change] +Daniel Stenberg (25 Jun 2020) +- test543: extended to verify zero length input + + As was reported in #5601 - doc: Rename VERSIONS to VERSIONS.md as it already has Markdown syntax +- escape: zero length input should return a zero length output - Closes #5325 + Regression added in 7.71.0. + + Fixes #5601 + Reported-by: Kristoffer Gleditsch + Closes #5602 -Jay Satiro (2 May 2020) -- asyn-thread: fix cppcheck warning +- Curl_inet_ntop: always check the return code - - Check for NULL entry parameter before attempting to deref entry in - Curl_resolver_is_resolved, like is already done in asyn-ares. + Reported-by: Siva Sivaraman + Fixes #5412 + Closes #5597 + +- sendf: improve the message on client write errors - This is to silence cppcheck which does not seem to understand that - asyn-ares and asyn-thread have separate Curl_resolver_is_resolved - and those units are mutually exclusive. Prior to this change it warned - of a scenario where asyn-thread's Curl_resolver_is_resolved is called - with a NULL entry from asyn-ares, but that couldn't happen. + Replace "Failed writing body (X != Y)" with + "Failure writing output to destination". Possibly slightly less cryptic. - Reported-by: rl1987@users.noreply.github.com + Reported-by: coinhubs on github + Fixes #5594 + Closes #5596 + +- RELEASE-NOTES: synced + +- curlver: start working on 7.71.1 + +- [Denis Baručić brought this change] + + DYNBUF.md: fix a typo: trail => tail - Fixes https://github.com/curl/curl/issues/5326 + Closes #5599 -- select: fix overflow protection in Curl_socket_check +Version 7.71.0 (23 Jun 2020) + +Daniel Stenberg (23 Jun 2020) +- RELEASE-NOTES: curl 7.71.0 release + +- THANKS: curl 7.71.0 additions + +- url: make sure pushed streams get an allocated download buffer - Follow-up to a96c752 which changed the timeout_ms type from time_t to - timediff_t. + Follow-up to c4e6968127e876b0 - Ref: https://github.com/curl/curl/pull/5240 + When a new transfer is created, as a resuly of an acknowledged push, + that transfer needs a download buffer allocated. - Closes https://github.com/curl/curl/pull/5286 + Closes #5590 -Marc Hoersken (2 May 2020) -- sockfilt: make select_ws stop waiting on exit signal event +Jay Satiro (22 Jun 2020) +- openssl: Don't ignore CA paths when using Windows CA store - This makes sure that select_ws behaves similar to real select - which stops waiting on a signal handler being triggered. + This commit changes the behavior of CURLSSLOPT_NATIVE_CA so that it does + not override CURLOPT_CAINFO / CURLOPT_CAPATH, or the hardcoded default + locations. Instead the CA store can now be used at the same time. - This makes it possible to gracefully stop sockfilt.exe on - Windows with taskkill /IM sockfilt.exe (without /F force flag). + The change is due to the impending release. The issue is still being + discussed. The behavior of CURLSSLOPT_NATIVE_CA is subject to change and + is now documented as experimental. - Reviewed-by: Jay Satiro - Part of #5260 + Ref: bc052cc (parent commit) + Ref: https://github.com/curl/curl/issues/5585 -- tests/server/util.[ch]: add exit event to stop waiting on Windows +- tool_operate: Don't use Windows CA store as a fallback - This commit adds a global exit event to the test servers that - Windows-specific wait routines can use to get triggered if the - program was signaled to be terminated, eg. select_ws in sockfilt.c + Background: - The exit event will be managed by the signal handling code and is - set to not reset automatically to support multiple wait routines. + 148534d added CURLSSLOPT_NATIVE_CA to use the Windows OS certificate + store in libcurl w/ OpenSSL on Windows. CURLSSLOPT_NATIVE_CA overrides + CURLOPT_CAINFO if both are set. The curl tool will fall back to + CURLSSLOPT_NATIVE_CA if it could not find a certificate bundle to set + via CURLOPT_CAINFO. - Reviewed-by: Jay Satiro - Closes #5260 - -- tests/server/util.c: fix thread handle not being closed + Problem: - Reviewed-by: Jay Satiro - Part of #5260 - -- tests/server/util.c: use raise instead of calling signal handler + libcurl may be built with hardcoded paths to a certificate bundle or + directory, and if CURLSSLOPT_NATIVE_CA is used then those paths are + ignored. - Use raise to trigger signal handler instead of calling it - directly and causing potential unexpected control flow. + Solution: - Reviewed-by: Jay Satiro - Part of #5260 + A solution is still being discussed but since there's an impending + release this commit removes using CURLSSLOPT_NATIVE_CA in the curl tool. + + Ref: https://github.com/curl/curl/issues/5585 -- tests: add support for SSH server variant specific transfer paths +- openssl: Fix CA fallback logic for OpenSSL 3.0 build - OpenSSH for Windows requires paths in the format of /C:/ - instead of the pseudo-POSIX paths /cygdrive/c/ or just /c/ + Prior to this change I assume a build error would occur when + CURL_CA_FALLBACK was used. - Reviewed-by: Daniel Stenberg - Closes #5298 + Closes https://github.com/curl/curl/pull/5587 -Daniel Stenberg (2 May 2020) -- RELEASE-NOTES: synced +Daniel Stenberg (22 Jun 2020) +- copyright: update mismatched copyright years -- libssh2: set the expected total size in SCP upload init +- test1460: verify that -Ji is not ok + +- tool_getparam: -i is not OK if -J is used - ... as otherwise the progress callback gets called without that - information, making the progress meter have less info. + Reported-by: sn on hackerone + Bug: https://curl.haxx.se/docs/CVE-2020-8177.html + +- [Peter Wu brought this change] + + CMake: ignore INTERFACE_LIBRARY targets for pkg-config file - Reported-by: Murugan Balraj - Bug: https://curl.haxx.se/mail/archive-2020-05/0000.html - Closes #5317 + Reviewed-by: Marcel Raad + Fixes #5512 + Closes #5517 -- runtests: make the logmsg from the ssh server only show in verbose +- [Valentyn Korniienko brought this change] -- tests: make test 1248 + 1249 use %NOLISTENPORT + multibyte: Fixed access-> waccess to file for Windows Plarform - ... instead of a port of a non-running server so that it works - stand-alone. + Reviewed-by: Marcel Raad + Closes #5580 + +- altsvc: bump to h3-29 - Closes #5318 + Closes #5584 -- examples: remove asiohiper.cpp +- urlglob: treat literal IPv6 addresses with zone IDs as a host name - This example has repeatedly been reported to contain bugs, and as users - copy and paste code from this into production, I now deem it better to - not provide the example at all. + ... and not as a "glob". Now done by passing the supposed host to the + URL parser which supposedly will do a better job at identifying "real" + numerical IPv6 addresses. - Closes #5090 - Closes #5322 + Reported-by: puckipedia on github + Fixes #5576 + Closes #5579 -- [Emil Engler brought this change] +- test1179: verify error message for non-existing cmdline option - doc: add missing closing parenthesis in CURLINFO_SSL_VERIFYRESULT.3 +- tool_getparam: repair the error message for unknown flag - Closes #5320 + Follow-up to 9e5669f3880674 + Detected by Coverity CID 1464582 ("Logically dead code") + + Closes #5577 -- [Emil Engler brought this change] +- FILEFORMAT: describe verify/stderr - KNOWN_BUGS: Remove "curl --upload-file . hang if delay in STDIN" +- connect: improve happy eyeballs handling - It was fixed in 9a2cbf3 + For QUIC but also for regular TCP when the second family runs out of IPs + with a failure while the first family is still trying to connect. - Closes #5319 + Separated the timeout handling for IPv4 and IPv6 connections when they + both have a number of addresses to iterate over. -- cirrus: disable SFTP and SCP tests +- ngtcp2: never call fprintf() in lib code in release version + +- ngtcp2: fix happy eyeballs quic connect crash - ... as we can't seem to start the sshd server on it. Those problems - existed before d1239b50bececd (running the SSH server on a random port), - but they're more noticable now since there are more failed attempts in - the logs. + Reported-by: Peter Wu + Fixes #5565 + Closes #5568 + +- select: remove the unused ELAPSED_MS() macro - Closes #5315 + Closes #5573 -- [Emil Engler brought this change] +Marc Hoersken (17 Jun 2020) +- [rcombs brought this change] - runtests: fix typo in the existence of disabled tests checker + multi: implement wait using winsock events - Closes #5316 + This avoids using a pair of TCP ports to provide wakeup functionality + for every multi instance on Windows, where socketpair() is emulated + using a TCP socket on loopback which could in turn lead to socket + resource exhaustion. + + Reviewed-by: Gergely Nagy + Reviewed-by: Marc Hörsken + + Closes #5397 -Dan Fandrich (30 Apr 2020) -- test75: Remove precheck test +Daniel Stenberg (17 Jun 2020) +- manpage: add three missing environment variables - This has not been needed since commit 9fa42bed and often prevents it - from running at all with dynamic test ports. + CURL_SSL_BACKEND, QLOGDIR and SSLKEYLOGFILE + + Closes #5571 -- tests: Stop referring to server ports when they're not used +- RELEASE-NOTES: synced + +- configure: for wolfSSL, check for the DES func needed for NTLM - Several tests referred to specific server ports even when the test - didn't actually use that server or specify that it's needed. In such - cases, the test harness substitutes the text "[not running]" as the port - number which causes many such tests to fail due to the inability to - parse the URL. These tests are changed to use %NOLISTENPORT which will - always be substituted correctly. - -Daniel Stenberg (30 Apr 2020) -- [Emil Engler brought this change] + Also adds pkg-config support for the wolfSSL detection. - GnuTLS: Backend support for CURLINFO_SSL_VERIFYRESULT - - Closes #5287 +- [Ruurd Beerstra brought this change] -- conncache: various concept cleanups - - More connection cache accesses are protected by locks. - - CONNCACHE_* is a beter prefix for the connection cache lock macros. - - Curl_attach_connnection: now called as soon as there's a connection - struct available and before the connection is added to the connection - cache. + ntlm: enable NTLM support with wolfSSL - Curl_disconnect: now assumes that the connection is already removed from - the connection cache. + When wolfSSL is built with its OpenSSL API layer, it fetures the same DES* + functions that OpenSSL has. This change take advantage of that. - Ref: #4915 - Closes #5009 + Co-authored-by: Daniel Stenberg + Closes #5556 + Fixes #5548 -- tests: tests: run stunnel for HTTPS and FTPS on dynamic ports +- http: move header storage to Curl_easy from connectdata - As stunnel is an external tool and it has no specific option to export - the actually used port number when asked to listen to 0, runtests - instead iterates over ten randomly picked high number ports and sticks - to the first one stunnel can listen to. + Since the connection can be used by many independent requests (using + HTTP/2 or HTTP/3), things like user-agent and other transfer-specific + data MUST NOT be kept connection oriented as it could lead to requests + getting the wrong string for their requests. This struct data was + lingering like this due to old HTTP1 legacy thinking where it didn't + mattered.. - Closes #5267 + Fixes #5566 + Closes #5567 -- tests: pick a random port number for SSH +- CODE_REVIEW.md: how to do code reviews in curl - Since sshd doesn't have such an option by itself, we iterate over a - series of random ports until one works. + Assisted-by: Daniel Gustafsson + Assisted-by: Rich Salz + Assisted-by: Hugo van Kemenade + Assisted-by: James Fuller + Assisted-by: Marc Hörsken + Assisted-by: Jay Satiro - Closes #5273 - -- [Rikard Falkeborn brought this change] + Closes #5555 - libtest/cmake: Remove commented code +- altsvc: remove the num field from the altsvc struct - These were commented out in e9dd0998706a when Makefile.inc was included - instead. 11 years have passed since then and the commented code is of - course very outdated. Remove it to avoid confusion. + It was superfluous since we have the list.size alredy - Closes #5311 + Reported-by: Jay Satiro + Fixes #5553 + Closes #5563 -- schannel: source code reindent +- version.d: expanded and alpha-sorted - White space edits only. Conform better to standard curl source code - indenting style. + Added a few missing features not previously mentioned. Ordered them + alphabetically. - Closes #5305 + Closes #5558 -Kamil Dudka (29 Apr 2020) -- test1177: look for curl.h in source directory - - If we use a separate build directory, there is no copy of the header. +- ABI.md: rename to .md and polish the markdown - Closes #5310 + Closes #5562 -- tests: look for preprocessed tests in build directory +- HELP-US: add a section for "smaller tasks" - ... which is not always the same directory as source directory + The point of this section is to meet the CII Best Practices gold level + critera: - Closes #5310 - -Daniel Stenberg (29 Apr 2020) -- RELEASE-NOTES: synced + "The project MUST clearly identify small tasks that can be performed by + new or casual contributors" - ... and bumped curlver.h to 7.70.1 + Closes #5560 -Version 7.70.0 (29 Apr 2020) +- TODO: retry on the redirected-to URL + + Closes #5462 -Daniel Stenberg (29 Apr 2020) -- RELEASE-NOTES: 7.70.0 +- mailmap: Nicolas Sterchele -- THANKS: synced with the 7.70.0 release +- [Nicolas Sterchele brought this change] -- headers: copyright range fix + TODO: remove 19.3 section title + + Follow-up to ad6416986755e417c66e2c6, which caused wrong formatting on + curl documentation website + + Closes #5561 -- [Rikard Falkeborn brought this change] +- [Martin V brought this change] - doh: Constify some input pointers + test1560: avoid possibly negative association in wording - Closes #5306 + Closes #5549 -- nss: check for PK11_CreateDigestContext() returning NULL +- share: don't set the share flag it something fails - ... to avoid crashes! + When asking for a specific feature to be shared in the share object, + that bit was previously set unconditionally even if the shared feature + failed or otherwise wouldn't work. - Reported-by: Hao Wu - Fixes #5302 - Closes #5303 + Closes #5554 -- travis: bump the wolfssl CI build to use 4.4.0 +- buildconf: remove -print from the find command that removes files - Closes #5301 + It's just too annoying and unnecessary to get a long list of files shown -- copyright updates: adjust year ranges +- RELEASE-NOTES: synced -Marc Hoersken (26 Apr 2020) -- CI: do not include */ci branches in PR builds +- wording: avoid blacklist/whitelist stereotypes - Align Azure Pipelines with GitHub Actions. - -Daniel Stenberg (25 Apr 2020) -- runtests: check for the disabled tests relative srcdir + Instead of discussing if there's value or meaning (implied or not) in + the colors, let's use words without the same possibly negative + associations. - To make it work correctly for out-of-tree builds. + Closes #5546 + +Jay Satiro (9 Jun 2020) +- tool_getparam: fix memory leak in parse_args - Follow-up to 75e8feb6fb08b + Prior to this change in Windows Unicode builds most parsed options would + not be freed. - Bug: https://github.com/curl/curl/pull/5288#issuecomment-619346389 - Reported-by: Marcel Raad - Closes #5297 - -- runtests: revert commenting out a line I did for debugging + Found using _CrtDumpMemoryLeaks(). - Follow-up to 11091cd4d. It was not meant to be pushed! + Ref: https://github.com/curl/curl/issues/5545 -- smtp: set auth correctly +Daniel Stenberg (8 Jun 2020) +- socks: detect connection close during handshake - Regression since 7.69.0 and 68fb25fa3fcff. + The SOCKS4/5 state machines weren't properly terminated when the proxy + connection got closed, leading to a busy-loop. - The code wrongly assigned 'from' instead of 'auth' which probably was a - copy and paste mistake from other code, leading to that auth could - remain NULL and later cause an error to be returned. + Reported-By: zloi-user on github + Fixes #5532 + Closes #5542 + +- [James Fuller brought this change] + + multi: add defensive check on data->multi->num_alive - Assisted-by: Eric Sauvageau - Fixes #5294 - Closes #5295 + Closes #5540 -Marcel Raad (25 Apr 2020) -- lib: clean up whitespace +- Curl_addrinfo: use one malloc instead of three - This fixes CodeFactor warnings. + To reduce the amount of allocations needed for creating a Curl_addrinfo + struct, make a single larger malloc instead of three separate smaller + ones. + + Closes #5533 -Daniel Stenberg (25 Apr 2020) -- [Anderson Toshiyuki Sasaki brought this change] +- [Alessandro Ghedini brought this change] - libssh: avoid options override by configuration files - - Previously, options set explicitly through command line options could be - overridden by the configuration files parsed automatically when - ssh_connect() was called. + quiche: update SSLKEYLOGFILE support - By calling ssh_options_parse_config() explicitly, the configuration - files are parsed before setting the options, avoiding the options - override. Once the configuration files are parsed, the automatic - configuration parsing is not executed. + quiche now requires the application to explicitly set the keylog path + for each connection, rather than reading the environment variable + itself. - Fixes #4972 - Closes #5283 - Signed-off-by: Anderson Toshiyuki Sasaki + Closes #5541 -- runtests: when mentions http, kill http/2 too +- tests: add two simple tests for --login-options - Since the http2 test server is a mere proxy that needs to know about the - dynamic port the HTTP server is using, it too needs to get restarted - when the http server is killed. + Test 895 and 896 - as a follow-up to a3e972313b - A regression caused by 80d6515. + Closes #5539 + +- ngtcp2: update with recent API changes - Fixes #5289 - Closes #5291 + Syncs with ngtcp2 commit 7e9a917d386d98 merged June 7 2020. + + Assisted-by: Tatsuhiro Tsujikawa + Closes #5538 -- [Yuri Slobodyanyuk brought this change] +- [James Fuller brought this change] - docs: fix two typos + socks: remove unreachable breaks in socks.c and mime.c - Closes #5292 - -- [Emil Engler brought this change] + Closes #5537 - tests/git: ignore mqttd and port files +- tool_cfgable: free login_options at exit - Closes #5290 + Memory leak + Reported-by: Geeknik Labs + Fixes #5535 + Closes #5536 -- tests: make runtests check that disabled tests exists +- libssh2: keep sftp errors as 'unsigned long' - ... and error out if so. Removed '536' from DISABLED as there is no such - test file. + Remove weird work-around for storing the SFTP errors as int instead of + the "unsigned long" that libssh2 actually returns for SFTP errors. - Closes #5288 - -- test1154: set a proper name + Closes #5534 -- select: make Curl_socket_check take timediff_t timeout +Marc Hoersken (6 Jun 2020) +- timeouts: move ms timeouts to timediff_t from int and long - Coverity found CID 1461718: + Now that all functions in select.[ch] take timediff_t instead + of the limited int or long, we can remove type conversions + and related preprocessor checks to silence compiler warnings. - Integer handling issues (CONSTANT_EXPRESSION_RESULT) "timeout_ms > - 9223372036854775807L" is always false regardless of the values of its - operands. This occurs as the logical second operand of "||". + Avoiding conversions from time_t was already done in 842f73de. - Closes #5240 - -- [i-ky brought this change] + Based upon #5262 + Supersedes #5214, #5220 and #5221 + Follow up to #5343 and #5479 + Closes #5490 - libcurl-multi.3: added missing full stop - - Closes #5285 +Daniel Stenberg (6 Jun 2020) +- [François Rigault brought this change] -Jay Satiro (22 Apr 2020) -- transfer: Switch PUT to GET/HEAD on 303 redirect + openssl: set FLAG_TRUSTED_FIRST unconditionally - Prior to this change if there was a 303 reply to a PUT request then - the subsequent request to respond to that redirect would also be a PUT. - It was determined that was most likely incorrect based on the language - of the RFCs. Basically 303 means "see other" resource, which implies it - is most likely not the same resource, therefore we should not try to PUT - to that different resource. + On some systems, openssl 1.0.x is still the default, but it has been + patched to contain all the recent security fixes. As a result of this + patching, it is possible for macro X509_V_FLAG_NO_ALT_CHAINS to be + defined, while the previous behavior of openssl to not look at trusted + chains first, remains. - Refer to the discussions in #5237 and #5248 for more information. + Fix it: ensure X509_V_FLAG_TRUSTED_FIRST is always set, do not try to + probe for the behavior of openssl based on the existence ofmacros. - Fixes https://github.com/curl/curl/issues/5237 - Closes https://github.com/curl/curl/pull/5248 + Closes #5530 -Daniel Stenberg (22 Apr 2020) -- lib/mk-ca-bundle: skip empty certs +- server/util: fix logmsg format using curl_off_t argument - Reviewed-by: Emil Engler - Reported-by: Ashwin Metpalli - Fixes #5278 - Closes #5280 - -- version: skip idn2_check_version() check and add precaution + ... this caused segfaults on armv7. - A gcc-10's -fanalyze complaint made me spot and do these improvements. + Regression added in dd0365d560aea5a (7.70.0) - Closes #5281 + Reviewed-by: Jay Satiro + Closes #5529 - RELEASE-NOTES: synced -- [Brian Bergeron brought this change] +- [Cherish98 brought this change] - curl.h: update comment typo - - "routines with be invoked" -> "routines will be invoked" + socks: fix expected length of SOCKS5 reply - Closes #5279 - -- [Emil Engler brought this change] - - GnuTLS: Don't skip really long certificate fields + Commit 4a4b63d forgot to set the expected SOCKS5 reply length when the + reply ATYP is X'01'. This resulted in erroneously expecting more bytes + when the request length is greater than the reply length (e.g., when + remotely resolving the hostname). - Closes #5271 + Closes #5527 -- gnutls: bump lowest supported version to 3.1.10 - - GnuTLS 3.1.10 added new functions we want to use. That version was - released on Mar 22, 2013. Removing support for older versions also - greatly simplifies the code. +Marc Hoersken (5 Jun 2020) +- .gitignore: add directory containing the stats repo - Ref: #5271 - Closes #5276 + Since the new curl/stats repository is designed to be + checked out into the curl repository working tree as stats/ + it should be on the ignore list to aid in commit staging. -- mqtt: make NOSTATE get within the debug name array +Daniel Stenberg (5 Jun 2020) +- [Adnan Khan brought this change] -- tests: run the RTSP test server on a dynamic port number + HTTP3.md: clarify cargo build directory - To avoid port collisions. + Cargo needs to be called from within the 'quiche' directory. - Closes #5272 + Closes #5522 -- tests: add %NOLISTENPORT and use it - - The purpose with this variable is to provide a port number that is - reasonably likely to not have a listener on the local host so that tests - can try connect failures against it. It uses port 47 - "reserved" - according to IANA. - - Updated six tests to use it instead of the previous different ports. +- user-agent.d: spell out what happens given a blank argument - Assisted-by: Emil Engler - Closes #5270 + Closes #5525 -- mqtt: remove code with no purpose +- trailers: switch h1-trailer logic to use dynbuf - Detected by Coverity. CID 1462319. + In the continued effort to remove "manual" realloc schemes. - "The same code is executed when the condition result is true or false, - because the code in the if-then branch and after the if statement is - identical." + Closes #5524 + +- CURLINFO_ACTIVESOCKET.3: clarify the description - Closes #5275 + Reported-by: Jay Satiro + Fixes #5299 + Closes #5520 -- mqtt: fix Curl_read() error handling while reading remaining length +- mailmap: Don J Olmstead + +- configure: only strip first -L from LDFLAGS - Detected by Coverity. CID 1462320. + In the logic that works out if a given OpenSSL path works, it stripped + off a possibly leading -L flag using an incorrect sed pattern which + would remove all instances of -L in the string, including if the path + itself contained that two-letter sequence! - Closes #5274 - -- server/tftpd: fix compiler warning + The same pattern was used and is now updated in multiple places. Now it + only removes -L if it starts the strings. - Follow-up from 369ce38ac1d - Reported-by: Marc Hörsken + Reported-by: Mohamed Osama + Fixes #5519 + Closes #5521 -- http: free memory when Alt-Used header creation fails due to OOM +Peter Wu (4 Jun 2020) +- quiche: advertise draft 28 support - Reported-by: James Fuller - Fixes #5268 - Closes #5269 - -Daniel Gustafsson (20 Apr 2020) -- lib: fix typos in comments and errormessages + Fix the verbose message while at it, quiche currently supports draft + 27 and draft 28 simultaneously. - This fixes a few randomly spotted typos in recently merged code, most - notably one in a userfacing errormessage the schannel code. + Closes #5518 -Daniel Stenberg (20 Apr 2020) -- tests: run the SOCKS test server on a dynamic port number +Daniel Stenberg (4 Jun 2020) +- KNOWN_BUGS: RTSP authentication breaks without redirect support - Closes #5266 - -- [Johannes Schindelin brought this change] + Closes #4750 - multi-ssl: reset the SSL backend on `Curl_global_cleanup()` - - When cURL is compiled with support for multiple SSL backends, it is - possible to configure an SSL backend via `curl_global_sslset()`, but - only *before* `curl_global_init()` was called. +Jay Satiro (4 Jun 2020) +- projects: Add crypt32.lib to dependencies for all OpenSSL configs - If another SSL backend should be used after that, a user might be - tempted to call `curl_global_cleanup()` to start over. However, we did - not foresee that use case and forgot to reset the SSL backend in that - cleanup. + Windows project configurations that use OpenSSL with USE_WIN32_CRYPTO + need crypt32. - Let's allow that use case. + Follow-up to 148534d which added CURLSSLOPT_NATIVE_CA for 7.71.0. - Fixes #5255 - Closes #5257 - Reported-by: davidedec on github - Signed-off-by: Johannes Schindelin - -- tests: run the TFTP test server on a dynamic port number + The changes that are in this commit were made by script. - Picking a dynamic unused port is better than a fixed to avoid the - collision risk. + Ref: https://gist.github.com/jay/a1861b50ecce2b32931237180f856e28 - Closes #5265 + Closes https://github.com/curl/curl/pull/5516 -- mqtt: improve the state machine - - To handle PUBLISH before SUBACK and more. +Marc Hoersken (3 Jun 2020) +- CI/macos: fix 'is already installed' errors by using bundle - Updated the existing tests and added three new ones. + Avoid failing CI builds due to nghttp2 being already installed. - Reported-by: Christoph Krey - Bug: https://curl.haxx.se/mail/lib-2020-04/0021.html - Closes #5246 + Closes #5513 -- runtests: always put test number in servercmd file +Daniel Stenberg (3 Jun 2020) +- altsvc: fix 'dsthost' may be used uninitialized in this function - RELEASE-NOTES: synced -- release-notes.pl: fix parsing typo - -James Fuller (20 Apr 2020) -- ensure all references to ports are replaced by vars - -- add more alt-svc test coverage +- urldata: let the HTTP method be in the set.* struct + + When the method is updated inside libcurl we must still not change the + method as set by the user as then repeated transfers with that same + handle might not execute the same operation anymore! + + This fixes the libcurl part of #5462 + + Test 1633 added to verify. + + Closes #5499 -Daniel Stenberg (20 Apr 2020) -- test1247: use http server to get the port number set +- hostip: fix the memory-leak introduced in 67d2802 - Follow-up to 0f5db7b263f + Fixes #5503 + Closes #5504 -- runtests: use a unix domain socket path with the pid in the name +- test970: make it require proxy support - To make it impossible for test cases to access the file name without - using the proper variable for the purpose. + This test verifies the -w %json output and the test case includes a full + generated "blob". If there's no proxy support built into libcurl, it + will return an error for proxy related info variables and they will not + be included in the json, thus causing a mismatch and this test fails. - Closes #5264 + Reported-by: Marc Hörsken + Fixes #5501 + Closes #5502 -Daniel Gustafsson (19 Apr 2020) -- [Tom brought this change] +- [Radoslav Georgiev brought this change] - src: Remove C99 constructs to ensure C89 compliance + examples/http2-down/upload: add error checks - This fixes the error: 'for' loop initial declaration used outside C99 - mode by declaring the loop increment variable in the beginning of the - block instead of inside the for loop. + If `index.html` does not exist in the directory from which the example + is invoked, the fopen(upload, "rb") invocation in `setup` would fail, + returning NULL. This value is subsequently passed as the FILE* argument + of the `fread` invocation in the `read_callback` function, which is the + actual cause of the crash (apparently `fread` assumes that argument to + be non-null). - Fixes #5254 - Reviewed-by: Daniel Gustafsson - -Daniel Stenberg (19 Apr 2020) -- runtests: dummy init the ports variables to avoid warnings + In addition, mitigate some possible crashes of similar origin. - ... and generate something that can help debug test cases. + Closes #5463 -- [Patrick Monnerat brought this change] - - mime: properly check Content-Type even if it has parameters - - New test 669 checks this fix is effective. - - Fixes #5256 - Closes #5258 - Reported-by: thanhchungbtc on github +- [kotoriのねこ brought this change] -- tests/FILEFORMAT: converted to markdown and extended + examples/ephiperfifo: turn off interval when setting timerfd - Closes #5261 - -- test1245: make it work with dynamic FTP server port - -- test1055: make it work with dynamic FTP port + Reported-by: therealhirudo on github + Fixes #5485 + Closes #5497 -- test1028: make it run on dynamic FTP server port +- [Saleem Abdulrasool brought this change] -- tests: move pingpong server to dynamic listening port + vtls: repair the build with `CURL_DISABLE_PROXY` - FTP, IMAP, POP3, SMTP and their IPv6 versions are now all on dynamic - ports + `http_proxy` will not be available in `conndata` if `CURL_DISABLE_PROXY` + is enabled. Repair the build with that configuration. - Test 842-845 are unfortunately a bit hard to move over to this concept - right now and require "default port" still... - -- test1056: work with dynamic HTTP ipv6 port + Follow-up to f3d501dc67 + + Closes #5498 -- test1448: work with dynamic HTTP server port +- transfer: remove k->str NULL check + + "Null-checking k->str suggests that it may be null, but it has already + been dereferenced on all paths leading to the check" - and it can't + legally be NULL at this point. Remove check. + + Detected by Coverity CID 1463884 + + Closes #5495 -- tests: introduce preprocessed test cases +Marc Hoersken (1 Jun 2020) +- select: always use Sleep in Curl_wait_ms on Win32 - The runtests script now always performs variable replacement on the - entire test source file before the test gets executed, and saves the - updated version in a temporary file (log/test[num]) so that all test - case readers/servers can use that version (if present) and thus enjoy - the powers of test case variable substitution. + Since Win32 almost always will also have USE_WINSOCK, + we can reduce complexity and always use Sleep there. - This is necessary to allow complete port number freedom. + Assisted-by: Jay Satiro + Reviewed-by: Daniel Stenberg - Test 309 is updated to work with a non-fixed port number thanks to this. + Follow up to #5343 + Closes #5489 -- tests: make 2006-2010 handle different port number lengths +Daniel Stenberg (31 May 2020) +- conncache: download buffer needs +1 size for trailing zero + + Follow-up to c4e6968127e + Detected by OSS-Fuzz: https://oss-fuzz.com/testcase-detail/5727799779524608 -- tests: run the sws server on "any port" +Marc Hoersken (31 May 2020) +- azure: use matrix strategy to avoid configuration redundancy - Makes the test servers for HTTP and Gopher pop up on a currently unused - port and runtests adapts to that! + This also includes the following changes: - Closes #5247 - -Marc Hoersken (18 Apr 2020) -- sockfilt: tidy variable naming and data structure in select_ws + - Use the same timeout for all jobs on Linux (60 minutes) + and Windows (90 minutes) + - Use CLI stable apt-get install -y instead of apt install + which warns about that and run apt-get update first + - Enable MQTT for Windows msys2 builds instead of + legacy msys1 builds + - Add ./configure --prefix parameter to the msys2 builds + - The MSYSTEM environment variable is now preset inside + the container images for the msys2 builds - This commit does not introduce any logical changes to the code. + Note: on Azure Pipelines the matrix strategy is basically + just a simple list of job copies and not really a matrix. - Reviewed-by: Jay Satiro and Marcel Raad - Closes #5238 - -Daniel Stenberg (17 Apr 2020) -- [Anderson Toshiyuki Sasaki brought this change] + Closes #5468 - libssh: Use new ECDSA key types to check known hosts +Daniel Stenberg (30 May 2020) +- build: disable more code/data when built without proxy support - From libssh 0.9.0, ssh_key_type() returns different key types for ECDSA - keys depending on the curve. + Added build to travis to verify - Signed-off-by: Anderson Toshiyuki Sasaki - Fixes #5252 - Closes #5253 + Closes #5466 -Marcel Raad (17 Apr 2020) -- appveyor: add Unicode winbuild jobs +- url: alloc the download buffer at transfer start - These are cheap as they don't build tests. + ... and free it as soon as the transfer is done. It removes the extra + alloc when a new size is set with setopt() and reduces memory for unused + easy handles. - Closes https://github.com/curl/curl/pull/5063 + In addition: the closure_handle now doesn't use an allocated buffer at + all but the smallest supported size as a stack based one. + + Closes #5472 -Daniel Stenberg (16 Apr 2020) -- mqttd: s/errno/SOCKERRNO +- timeouts: change millisecond timeouts to timediff_t from time_t - To behave proper on Windows - Reported-by: Gisle Vanem - Bug: https://github.com/curl/curl/commit/5e855bbd18f84a02c951be7cac6188276818cdac#r38507132 - Closes #5241 + For millisecond timers we like timediff_t better. Also, time_t can be + unsigned so returning a negative value doesn't work then. + + Closes #5479 -- buildconf: use find -execdir instead, remove -print and the ares files +Marc Hoersken (30 May 2020) +- select: add overflow checks for timeval conversions - Follow-up to 1e41bec96a6e + Using time_t and suseconds_t if suseconds_t is available, + long on Windows (maybe others in the future) and int elsewhere. - Suggested-by: Marc Hörsken + Also handle case of ULONG_MAX being greater or equal to INFINITE. + + Assisted-by: Jay Satiro + Reviewed-by: Daniel Stenberg + + Part of #5343 -- [Alexander V. Tikhonov brought this change] +- select: use timediff_t instead of time_t and int for timeout_ms + + Make all functions in select.[ch] take timeout_ms as timediff_t + which should always be large enough and signed on all platforms + to take all possible timeout values and avoid type conversions. + + Reviewed-by: Jay Satiro + Reviewed-by: Daniel Stenberg + + Replaces #5107 and partially #5262 + Related to #5240 and #5286 + Closes #5343 - buildconf: avoid using tempfile when removing files +- unit1604.c: fix implicit conv from 'SANITIZEcode' to 'CURLcode' - Closes #5213 + GCC 10 warns about this with warning: implicit conversion + from 'SANITIZEcode' to 'CURLcode' [-Wenum-conversion] + + Since 'expected_result' is not really of type 'CURLcode' and + it is not exposed in any way, we can just use 'SANITIZEcode'. + + Reviewed-by: Daniel Stenberg + Reviewed-by: Marcel Raad + + Closes #5476 -- copyright: bump the copyright year range +- tests/libtest: fix undefined reference to 'curlx_win32_fopen' + + Since curl_setup.h now makes use of curlx_win32_fopen for Win32 + builds with USE_WIN32_LARGE_FILES or USE_WIN32_SMALL_FILES defined, + we need to include the relevant files for tests using fopen, + because the libtest sources are also including curl_setup.h + + Reviewed-by: Marcel Raad + Reviewed-by: Daniel Stenberg + + Follow up to #3784 (ffdddb45d9) + Closes #5475 -- scripts/release-notes.pl: accept colon after the Fixes/Closes keywords +- appveyor: add non-debug plain autotools-based build + + This should enable us to catch linking issues with the + testsuite early, like the one described/fixed in #5475. + + Reviewed-by: Daniel Stenberg + Reviewed-by: Marcel Raad + + Closes #5477 -- [JP Mens brought this change] +Daniel Stenberg (29 May 2020) +- RELEASE-NOTES: synced - docs/MQTT: replace confusing 80 by 75 +- Revert "buildconf: use find -execdir" - I was a bit surprised by the `80`: first thought: what's HTTP doing - here? ;) + This partially reverts commit c712009838f44211958854de431315586995bc61. - Closes #5236 + Keep the ares_ files removed but bring back the older way to run find, + to make it work with busybox's find, as apparently that's being used. + + Reported-by: Max Peal + Fixes #5483 + Closes #5484 -- [Brad King brought this change] +- server/sws: fix asan warning on use of uninitialized variable - cmake: Avoid MSVC C4273 warnings in send/recv checks +- libssh2: improved error output for wrong quote syntax - We use `check_c_source_compiles` to check possible send/recv signatures - by reproducing the forward declarations from system headers. On Windows - the `winsock2.h` header adds dll linkage settings to its forward - declaration. If ours does not match the compiler warns: + Reported-by: Werner Stolz - warning C4273: 'recv': inconsistent dll linkage + Closes #5474 + +- mk-lib1521: generate code for testing BLOB options as well - Add `WINSOCK_API_LINKAGE` to our test signatures when it is defined so - that our linkage is consistent with that from `winsock2.h`. + Follow-up to cac5374298b3 - Fixes #4764 - Closes #5232 + Closes #5478 -Jay Satiro (14 Apr 2020) -- KNOWN_BUGS: Add entry 'Blocking socket operations' +- configure: repair the check if argv can be written to - - Add threaded resolver cleanup and GSSAPI for FTP to the TODO list of - known blocking operations. + Due to bad escaping of the test code, the test wouldn't build and thus + result in a negative test result, which would lead to the unconditional + assumption that overwriting the arguments doesn't work and thus curl + would never hide credentials given in the command line, even when it + would otherwise be possible. - - New known bugs entry 'Blocking socket operations in non-blocking API' - that directs to the TODO's list of known blocking operations. + Regression from commit 2d4c2152c (7.60.0) - Ref: https://github.com/curl/curl/pull/5214#issuecomment-612488021 + Reported-by: huzunhao on github + Fixes #5470 + Closes #5471 + +Peter Wu (28 May 2020) +- CMake: rebuild Makefile.inc.cmake when Makefile.inc changes - Reported-by: Marc Hoersken + Otherwise the build might fail due to missing source files, as + demonstrated by the recent keylog.c addition on an existing build dir. - Closes https://github.com/curl/curl/pull/5216 + Closes #5469 -Marc Hoersken (14 Apr 2020) -- test2043: use revoked.badssl.com instead of revoked.grc.com +Daniel Stenberg (28 May 2020) +- urldata: fix comments: Curl_done() is called multi_done() now - The certificate of revoked.grc.com has expired on 2020-04-13. + ... since 575e885db + +Peter Wu (27 May 2020) +- ngtcp2: use common key log routine for better thread-safety - Reviewed-by: Jay Satiro + Tested with ngtcp2 built against the OpenSSL library. Additionally + tested with MultiSSL (NSS for TLS and ngtcp2+OpenSSL for QUIC). - Closes #5233 + The TLS backend (independent of QUIC) may or may not already have opened + the keylog file before. Therefore Curl_tls_keylog_open is always called + to ensure the file is open. -- sockfilt: fix broken pipe on Windows to be ready in select_ws +- wolfssl: add SSLKEYLOGFILE support - Closes #5228 - -Daniel Stenberg (14 Apr 2020) -- RELEASE-NOTES: synced + Tested following the same curl and tshark commands as in commit + "vtls: Extract and simplify key log file handling from OpenSSL" using + WolfSSL v4.4.0-stable-128-g5179503e8 from git master built with + `./configure --enable-all --enable-debug CFLAGS=-DHAVE_SECRET_CALLBACK`. + + Full support for this feature requires certain wolfSSL build options, + see "Availability note" in lib/vtls/wolfssl.c for details. + + Closes #5327 -- scripts/release-notes: fix duplicate output header +- vtls: Extract and simplify key log file handling from OpenSSL + + Create a set of routines for TLS key log file handling to enable reuse + with other TLS backends. Simplify the OpenSSL backend as follows: + + - Drop the ENABLE_SSLKEYLOGFILE macro as it is unconditionally enabled. + - Do not perform dynamic memory allocation when preparing a log entry. + Unless the TLS specifications change we can suffice with a reasonable + fixed-size buffer. + - Simplify state tracking when SSL_CTX_set_keylog_callback is + unavailable. My original sslkeylog.c code included this tracking in + order to handle multiple calls to SSL_connect and detect new keys + after renegotiation (via SSL_read/SSL_write). For curl however we can + be sure that a single master secret eventually becomes available + after SSL_connect, so a simple flag is sufficient. An alternative to + the flag is examining SSL_state(), but this seems more complex and is + not pursued. Capturing keys after server renegotiation was already + unsupported in curl and remains unsupported. + + Tested with curl built against OpenSSL 0.9.8zh, 1.0.2u, and 1.1.1f + (`SSLKEYLOGFILE=keys.txt curl -vkso /dev/null https://localhost:4433`) + against an OpenSSL 1.1.1f server configured with: + + # Force non-TLSv1.3, use TLSv1.0 since 0.9.8 fails with 1.1 or 1.2 + openssl s_server -www -tls1 + # Likewise, but fail the server handshake. + openssl s_server -www -tls1 -Verify 2 + # TLS 1.3 test. No need to test the failing server handshake. + openssl s_server -www -tls1_3 + + Verify that all secrets (1 for TLS 1.0, 4 for TLS 1.3) are correctly + written using Wireshark. For the first and third case, expect four + matches per connection (decrypted Server Finished, Client Finished, HTTP + Request, HTTP Response). For the second case where the handshake fails, + expect a decrypted Server Finished only. + + tshark -i lo -pf tcp -otls.keylog_file:keys.txt -Tfields \ + -eframe.number -eframe.time -etcp.stream -e_ws.col.Info \ + -dtls.port==4433,http -ohttp.desegment_body:FALSE \ + -Y 'tls.handshake.verify_data or http' + + A single connection can easily be identified via the `tcp.stream` field. -- github/workflow: enable MQTT in the macOS debug build +Daniel Stenberg (27 May 2020) +- FILEFORMAT: add more features that tests can depend on -- azure: add mqtt support to one of the Windows builds +- [Michael Kaufmann brought this change] -- travis: add mqtt job on Linux + transfer: close connection after excess data has been read + + For HTTP 1.x, it's a protocol error when the server sends more bytes + than announced. If this happens, don't reuse the connection, because the + start position of the next response is undefined. + + Closes #5440 -- tests: add four MQTT tests 1190 - 1193 +- [Estanislau Augé-Pujadas brought this change] -- tests: add the mqtt test server mqttd + Revert "ssh: ignore timeouts during disconnect" + + This reverts commit f31760e63b4e9ef1eb25f8f211390f8239388515. Shipped in + curl 7.54.1. + + Bug: https://curl.haxx.se/mail/lib-2020-05/0068.html + Closes #5465 -- tests: support hex encoded data and mqtt server +- urldata: connect related booleans live in struct ConnectBits - The mqtt server is started using a "random" port. + And remove a few unused booleans! + + Closes #5461 -- [Björn Stenberg brought this change] +- hostip: on macOS avoid DoH when given a numerical IP address + + When USE_RESOLVE_ON_IPS is set (defined on macOS), it means that + numerical IP addresses still need to get "resolved" - but not with DoH. + + Reported-by: Viktor Szakats + Fixes #5454 + Closes #5459 - mqtt: add new experimental protocol +- ngtcp2: cleanup memory when failing to connect - Closes #5173 + Reported-by: Peter Wu + Fixes #5447 (the ngtcp2 side of it) + Closes #5451 -- TODO: Consider convenience options for JSON and XML? +- quiche: clean up memory properly when failing to connect - Closes #5203 + Addresses the quiche side of #5447 + Reported-by: Peter Wu + Closes #5450 -- tool: do not declare functions with Curl_ prefix +- cleanup: use a single space after equals sign in assignments + +- url: accept "any length" credentials for proxy auth - To avoid collision risks with private libcurl symbols when linked with - static versions (or just versions not hiding internal symbols). + They're only limited to the maximum string input restrictions, not to + 256 bytes. - Reported-by: hydra3333 on github - Fixes #5219 - Closes #5234 + Added test 1178 to verify + + Reported-by: Will Roberts + Fixes #5448 + Closes #5449 -- [Nathaniel R. Lewis brought this change] +- [Maksim Stsepanenka brought this change] - cmake: add aliases so exported target names are available in tree + test1167: fixes in badsymbols.pl - Reviewed-by: Brad King - Closes #5206 + Closes #5442 -- version: increase buffer space for ssl version output +- altsvc: fix parser for lines ending with CRLF - To avoid it getting truncated, especially when several SSL backends are - built-in. + Fixed the alt-svc parser to treat a newline as end of line. - Reported-by: Gisle Vanem - Fixes #5222 - Closes #5226 + The unit tests in test 1654 were done without CRLF and thus didn't quite + match the real world. Now they use CRLF as well. + + Reported-by: Peter Wu + Assisted-by: Peter Wu + Assisted-by: Jay Satiro + Fixes #5445 + Closes #5446 -Marc Hoersken (13 Apr 2020) -- cirrus: no longer ignore test 504 which is working again +Viktor Szakats (25 May 2020) +- all: fix codespell errors - The test is working again, because TCP blackholing is disabled. + Reviewed-by: Jay Satiro + Reviewed-by: Daniel Stenberg + Closes https://github.com/curl/curl/pull/5452 -- appveyor: completely disable tests that fail to timeout early +Peter Wu (25 May 2020) +- ngtcp2: fix build with current ngtcp2 master implementing draft 28 - The tests changed from ignored to disabled are tests that are - about connecting to non-listening socket. On AppVeyor these - tests are not reliable, because for some unknown reason the - connect is not timing out before the test time limit is reached. + Based on client.cc changes from ngtcp2. Tested with current git master, + ngtcp2 commit c77d5731ce92, nghttp3 commit 65ff479d4380. + + Fixes #5444 + Closes #5443 -Daniel Stenberg (13 Apr 2020) -- test1908: avoid using fixed port number in test data +Daniel Stenberg (25 May 2020) +- RELEASE-NOTES: synced - Closes #5225 + moved the new setopts up to a "change" -Jay Satiro (12 Apr 2020) -- [Andrew Kurushin brought this change] +- RELEASE-NOTES: synced - schannel: Fix blocking timeout logic +- copyright: updated year ranges out of sync - - Fix schannel_send for the case when no timeout was set. + ... and whitelisted a few more files in the the copyright.pl script. + +- [Gilles Vollant brought this change] + + setopt: add CURLOPT_PROXY_ISSUERCERT(_BLOB) for coherency - Prior to this change schannel would error if the socket was not ready - to send data and no timeout was set. + Closes #5431 + +- curl: remove -J "informational" written on stdout + + curl would previously show "curl: Saved to filename 'name from header'" + if -J was used and a name was picked from the Content-Disposition + header. That output could interfer with other stdout output, such as -w. + + This commit removes that output line. + Bug: https://curl.haxx.se/mail/archive-2020-05/0044.html + Reported-by: Коваленко Анатолий Викторович + Closes #5435 + +Peter Wu (22 May 2020) +- travis: simplify quiche build instructions wrt boringssl - This commit is similar to parent commit 89dc6e0 which recently made the - same change for SOCKS, for the same reason. Basically it was not well - understood that when Curl_timeleft returns 0 it is not a timeout of 0 ms - but actually means no timeout. + quiche builds boringssl as static library, reuse that instead of + building another shared library. - Fixes https://github.com/curl/curl/issues/5177 - Closes https://github.com/curl/curl/pull/5221 + Closes #5438 -- socks: Fix blocking timeout logic +- configure: fix pthread check with static boringssl - - Document in Curl_timeleft's comment block that returning 0 signals no - timeout (ie there's infinite time left). + A shared boringssl/OpenSSL library requires -lcrypto only for linking. + A static build additionally requires `-ldl -lpthread`. In the latter + case `-lpthread` is added to LIBS which prevented `-pthread` from being + added to CFLAGS. Clear LIBS to fix linking failures for libtest tests. + +Daniel Stenberg (22 May 2020) +- Revert "sendf: make failf() use the mvsnprintf() return code" - - Fix SOCKS' Curl_blockread_all for the case when no timeout was set. + This reverts commit 74623551f306990e70c7c5515b88972005604a74. - Prior to this change if the timeout had a value of 0 and that was passed - to SOCKET_READABLE it would return right away instead of blocking. That - was likely because it was not well understood that when Curl_timeleft - returns 0 it is not a timeout of 0 ms but actually means no timeout. + Instead mark the function call with (void). Getting the return code and + using it instead triggered Coverity warning CID 1463596 because + snprintf() can return a negative value... - Ref: https://github.com/curl/curl/pull/5214#issuecomment-612512360 + Closes #5441 + +- typecheck-gcc.h: CURLINFO_PRIVATE does not need a 'char *' - Closes https://github.com/curl/curl/pull/5220 + Reported-by: Billyzou0741326 on github + Fixes #5432 + Closes #5436 -- [Marc Hoersken brought this change] +- tests/server/util.h: add extern to silence compiler warning + + Follow-up from a3b0699d5c1 - gopher: check remaining time left during write busy loop +- typecheck-gcc.h: fix the OFF_T check - Prior to this change gopher's blocking code would block forever, - ignoring any set timeout value. + The option number also needs to be less than CURLOPTTYPE_BLOB. - Assisted-by: Jay Satiro - Reviewed-by: Daniel Stenberg + Follow-up to cac5374298 + Reported-by: Jeroen Ooms + Bug: https://github.com/curl/curl/pull/5365#issuecomment-631084114 + +- TODO: --dry-run - Similar to #5220 and #5221 - Closes #5214 + Closes #5426 -Daniel Stenberg (13 Apr 2020) -- [Dirkjan Bussink brought this change] +- TODO: Ratelimit or wait between serial requests + + Closes #5406 - gnutls: ensure TLS 1.3 when SRP isn't requested +- tool_paramhlp: fixup C89 mistake - When SRP is requested in the priority string, GnuTLS will disable - support for TLS 1.3. Before this change, curl would always add +SRP to - the priority list, effectively always disabling TLS 1.3 support. + Follow-up to c5f0a9db22. + +- [Siva Sivaraman brought this change] + + tool_paramhlp: fixed potentially uninitialized strtol() variable - With this change, +SRP is only added to the priority list when SRP - authentication is also requested. This also allows updating the error - handling here to not have to retry without SRP. This is because SRP is - only added when requested and in that case a retry is not needed. + Seems highly unlikely to actually be possible, but better safe than + sorry. - Closes #5223 + Closes #5417 -Marc Hoersken (12 Apr 2020) -- tests/server: add hidden window to gracefully handle WM_CLOSE - - Forward Window events as signals to existing signal event handler. +- [Siva Sivaraman brought this change] -- tests/server: add CTRL event handler for Win32 consoles + tool_operate: fixed potentially uninitialized variables - Forward CTRL events as signals to existing signal event handler. + ... in curl_easy_getinfo() calls. They're harmless but clearing the + variables makes the code safer and comforts the reader. + + Closes #5416 -- tests/server: move all signal handling routines to util.[ch] +- sha256: move assign to the declaration line - Avoid code duplication to prepare for portability enhancements. + Follow-up to fae30656. Should've been squashed with that commit... -Daniel Stenberg (12 Apr 2020) -- compressed.d: stress that the headers are not modified +- [Siva Sivaraman brought this change] + + sha256: fixed potentially uninitialized variable - Suggested-by: Michael Osipov - Assisted-by: Jay Satiro - Bug: https://github.com/curl/curl/issues/5182#issuecomment-611638008 - Closes #5217 + Closes #5414 -Marc Hoersken (11 Apr 2020) -- tests/server/util.c: use curl_off_t instead of long for pid +- sendf: make failf() use the mvsnprintf() return code - Avoid potential overflow of huge PIDs on Windows. + ... and avoid a strlen() call. Fixes a MonocleAI warning. - Related to #5188 - Assisted-by: Marcel Raad + Reported-by: MonocleAI + Fixes #5413 + Closes #5420 -- tests: use Cygwin/msys PIDs for stunnel and sshd on Windows - - Since the Windows versions of both programs would write Windows - PIDs to their pidfiles which we cannot handle, we need to use - our known perl.exe Cygwin/msys PID together with exec() in order - to tie the spawned processes to the existance of our perl.exe +- hostip: make Curl_printable_address not return anything - The perl.exe that is executing secureserver.pl and sshserver.pl - has a Cygwin/msys PID, because it is started inside Cygwin/msys. + It was not used much anyway and instead we let it store a blank buffer + in case of failure. - Related to #5188 + Reported-by: MonocleAI + Fixes #5411 + Closes #5418 -- tests: add Windows compatible pidwait like pidkill and pidterm +- ftp: mark return-ignoring calls to Curl_GetFTPResponse with (void) - Related to #5188 + They're done on purpose, make that visible in the code. + Reported-by: MonocleAI + Fixes #5412 + Closes #549 -- tests: fix conflict between Cygwin/msys and Windows PIDs - - Add 65536 to Windows PIDs to allow Windows specific treatment - by having disjunct ranges for Cygwin/msys and Windows PIDs. - - See also: - - https://cygwin.com/git/?p=newlib-cygwin.git;a=commit; ↵ - h=b5e1003722cb14235c4f166be72c09acdffc62ea - - https://cygwin.com/git/?p=newlib-cygwin.git;a=commit; ↵ - h=448cf5aa4b429d5a9cebf92a0da4ab4b5b6d23fe +- TODO: forbid TLS post-handshake auth and do TLS record padding - Replaces #5178 - Closes #5188 + Closes #5396 + Closes #5398 -Daniel Stenberg (11 Apr 2020) - RELEASE-NOTES: synced -- release-notes.pl: detect the start of the references in cleanup mode - -- Revert "file: on Windows, refuse paths that start with \\" - - This reverts commit 1b71bc532bde8621fd3260843f8197182a467ff2. +- dynbuf: return NULL when there's no buffer length - Reminded-by: Chris Roberts - Bug: https://curl.haxx.se/mail/archive-2020-04/0013.html + ... as returning a "" is not a good idea as the string is supposed to be + allocated and returning a const string will cause issues. - Closes #5215 + Reported-by: Brian Carpenter + Follow-up to ed35d6590e72c + Closes #5405 -Jay Satiro (11 Apr 2020) -- lib: fix conversion warnings for SOCKET_WRITABLE/READABLE +Peter Wu (16 May 2020) +- travis: upgrade to bionic, clang-9, improve readability - - If loss of data may occur converting a timediff_t to time_t and - the time value is > TIME_T_MAX then treat it as TIME_T_MAX. + Changes, partially to reduce build failures from external dependencies: + - Upgrade Ubuntu and drop unnecessary third-party repos. + - Properly clone apt config to ensure retries. + - Upgrade to clang-9 from the standard repos. + - Use Ubuntu 20.04 focal for the libssh build, use of ssh_get_publickey + fails on -Werror=deprecated-declarations in Ubuntu 18.04. Do not use + focal everywhere yet since Travis CI has not documented this option. + In focal, python-impacket (Py2.7) has been removed, leaving only + python3-impacket. Since it is only needed for SMB tests and not SSH, + skip it for the libssh job since it might need more work. + - apt: Remove gcc-8 and libstdc++-8-dev, already installed via g++-8. - This is a follow-up to 8843678 which removed the (time_t) typecast - from the macros so that conversion warnings could be identified. + Non-functional cleanups: + - Simplify test matrix, drop redundant os and compiler keys. + - Deprecation fixes: remove sudo, rename matrix -> jobs. + - Every job has an 'env' key, put this key first in a list item. - Closes https://github.com/curl/curl/pull/5199 + Closes #5370 -- test1148: tolerate progress updates better (again) +- travis: whitespace-only changes for consistency - - Ignore intermediate progress updates. + Automatically apply a consistent indentation with: - - Support locales that use a character other than period as decimal - separator (eg 100,0%). + python3 -c 'from ruamel.yaml import YAML;y=YAML();d=y.load(open(".travis.yml"));y.width=500;y.dump(d,open(".travis.yml.new","w"))' - test1148 checks that the progress finishes at 100% and has the right - bar width. Prior to this change the test assumed that the only progress - reported for such a quick transfer was 100%, however in rare instances - (like in the CI where transfer time can slow considerably) there may be - intermediate updates. For example, below is stderrlog1148 from a failed - CI run with explicit \r and \n added (it is one line; broken up so that - it's easier to understand). + followed by manually re-indenting three comments. - \r - \r################################## 48.3% - \r######################################################################## 100.0% - \n + Closes #5370 + +- CMake: add libssh build support - Closes https://github.com/curl/curl/pull/5194 + Closes #5372 -Marc Hoersken (10 Apr 2020) -- sshserver.pl: use cached Win32 environment check variable +Daniel Stenberg (15 May 2020) +- KNOWN_BUGS: wolfssh: publickey auth doesn't work + + Closes #4820 -- appveyor: partially revert 3413a110 to keep build without proxy +- KNOWN_BUGS: OS400 port requires deprecated IBM library - Ref: #5211 and #4526 - Reported-by: Marcel Raad + Closes #5176 -- appveyor: ignore failing 'connect to non-listening proxy' tests +- [Vyron Tsingaras brought this change] + + http2: keep trying to send pending frames after req.upload_done - Closes #5211 + Fixes #1410 + Closes #5401 -- CI/macos: convert CRLF to LF and align indentation +- [Gilles Vollant brought this change] -Daniel Stenberg (9 Apr 2020) -- url: allow non-HTTPS altsvc-matching for debug builds + setopt: support certificate options in memory with struct curl_blob - This is already partly supported but this part was missing. - Reported-by: James Fuller + This change introduces a generic way to provide binary data in setopt + options, called BLOBs. - Closes #5205 - -- server/resolve: remove AI_CANONNAME to make macos tell the truth + This change introduces these new setopts: - With this bit set, my mac successfully resolves "ip6-localhost" when in - fact there is no such host known to my machine! That in turn made test - 241 wrongly execute and fail. + CURLOPT_ISSUERCERT_BLOB, CURLOPT_PROXY_SSLCERT_BLOB, + CURLOPT_PROXY_SSLKEY_BLOB, CURLOPT_SSLCERT_BLOB and CURLOPT_SSLKEY_BLOB. - Closes #5202 + Reviewed-by: Daniel Stenberg + Closes #5357 -- runtests: fix warning about using an undefined variable +- source cleanup: remove all custom typedef structs - Follow-up from 4d939ef6ceb2db1 + - Stick to a single unified way to use structs + - Make checksrc complain on 'typedef struct {' + - Allow them in tests, public headers and examples + + - Let MD4_CTX, MD5_CTX, and SHA256_CTX typedefs remain as they actually + typedef different types/structs depending on build conditions. + + Closes #5338 -- release-notes: fix the initial reference list output +- travis: remove the .checksrc fiddling -- github actions: run when pushed to master or */ci + PRs - - Avoid double-builds when using "local" branches for PRs. For both macos - and fuzz jobs. +- ftp: make domore_getsock() return the secondary socket properly - Closes #5201 + Previously, after PASV and immediately after the data connection has + connected, the function would only return the control socket to wait for + which then made the data connection simply timeout and not get polled + correctly. This become obvious when running test 1631 and 1632 event- + based. -- runtests: provide nicer errormsg when protocol "dump" file is empty +- test1632: verify FTP through HTTPS-proxy with connection re-use -- [Gilles Vollant brought this change] +- test1631: verify FTP download through HTTPS-proxy - schannel: support .P12 or .PFX client certificates +- sws: as last resort, get test number from server cmd file - Used with curl command line option like this: --cert - : --cert-type p12 + If it can't be found in the request. Also support --cmdfile to set it to + a custom file name. - Closes #5193 + runtests.pl always writes this file with the test number in it since a + while back. -- tests: verify split initial HTTP requests with CURL_SMALLREQSEND - - test1294: "split request" being when the entire request isn't sent in - the first go, and the remainder is sent in the PERFORM state. A GET - request is otherwise not sending anything during PERFORM. - - test1295: same kind of split but with POST +- ftp: shut down the secondary connection properly when SSL is used - Closes #5197 + Reported-by: Neal Poole + Fixes #5340 + Closes #5385 -- http: don't consider upload done if the request isn't completely sent off +Marcel Raad (14 May 2020) +- KNOWN_BUGS: adapt 5.5 to recent changes - Fixes #4919 - Closes #5197 - -- http: allow Curl_add_buffer_send() to do a short first send by force + It only applies to non-Unicode builds now. + Also merge 5.10 into it as it's effectively a duplicate. - In a debug build, settting the environment variable "CURL_SMALLREQSEND" - will make the first HTTP request send not send more bytes than the set - amount, thus ending up verifying that the logic for handling a split - HTTP request send works correctly. + Closes https://github.com/curl/curl/pull/3784 -- connect: store connection info for QUIC connections +- curl_setup: support Unicode functions to open files on Windows - Restores the --head functionality to the curl utility which extracts - 'protocol' that is stored that way. + Use them only if `_UNICODE` is defined, in which case command-line + arguments have been converted to UTF-8. - Reported-by: James Fuller - Fixes #5196 - Closes #5198 + Closes https://github.com/curl/curl/pull/3784 -- tests/README: update the port numbers list +- tool: support UTF-16 command line on Windows - Since the pipelining server is long gone. - Reported-by: James Fuller - -- select: remove typecast from SOCKET_WRITABLE/READABLE macros + - use `wmain` instead of `main` when `_UNICODE` is defined [0] + - define `argv_item_t` as `wchar_t *` in this case + - use the curl_multibyte gear to convert the command-line arguments to + UTF-8 - So that they don't hide conversions-by-mistake + This makes it possible to pass parameters with characters outside of + the current locale on Windows, which is required for some tests, e.g. + the IDN tests. Out of the box, this currently only works with the + Visual Studio project files, which default to Unicode, and winbuild + with the `ENABLE_UNICODE` option. - Reviewed-by: Jay Satiro - Closes #5190 - -- CURLOPT_WRITEFUNCTION.3: add inline example and new see-also + [0] https://devblogs.microsoft.com/oldnewthing/?p=40643 - Closes #5192 - -- release-notes: output trailing references sorted numerically - -- cleanup: correct copyright year range on a few files + Ref: https://github.com/curl/curl/issues/3747 + Closes https://github.com/curl/curl/pull/3784 -- configure: remove use of -vec-report0 from CFLAGS with icc +- curl_multibyte: add to curlx - ... as it apparently isn't (always) supported. - Reported-by: Alain Miniussi - Fixes #5096 - Closes #5191 - -- warnless: remove code block for icc that didn't work + This will also be needed in the tool and tests. - Reported-by: Alain Miniussi - Fixes #5096 + Ref: https://github.com/curl/curl/pull/3758#issuecomment-482197512 + Closes https://github.com/curl/curl/pull/3784 -Marc Hoersken (6 Apr 2020) -- dist: add missing setup-win32.h +Daniel Stenberg (14 May 2020) +- url: make the updated credentials URL-encoded in the URL - Follow up to d820224b8b - -Daniel Stenberg (6 Apr 2020) -- RELEASE-NOTES: synced + Found-by: Gregory Jefferis + Reported-by: Jeroen Ooms + Added test 1168 to verify. Bug spotted when doing a redirect. + Bug: https://github.com/jeroen/curl/issues/224 + Closes #5400 -- scripts/release-notes.pl: add helper script for RELEASE-NOTES maintenance +- tests: add https-proxy support to the test suite - This script helps putting entries in the RELEASE-NOTES using a coherent - style and sorting with a minimal human editing effort - as long as the - first line in the commit message is good enough! There's a short howto - at the top of the file. + Initial test 1630 added with basic HTTPS-proxy use. HTTPS-proxy is like + HTTP proxy but with a full TLS connection to the proxy. + + Closes #5399 -- [Dennis Felsing brought this change] +- mailmap: James Fuller - configure: don't check for Security.framework when cross-compiling +- [Major_Tom brought this change] + + vauth/cleartext: fix theoretical integer overflow - Since it checks for the local file, not the cross-compiled one. + Fix theoretical integer overflow in Curl_auth_create_plain_message. - Closes #5189 - -- TODO: Option to make -Z merge lined based outputs on stdout + The security impact of the overflow was discussed on hackerone. We + agreed this is more of a theoretical vulnerability, as the integer + overflow would only be triggerable on systems using 32-bits size_t with + over 4GB of available memory space for the process. - Closes #5175 + Closes #5391 -- lib: never define CURL_CA_BUNDLE with a getenv +Jay Satiro (13 May 2020) +- curl.1: Quote globbed URLs - - it breaks the build (since 6de756c9b1de34b7a1) - - it's not documented and not consistent across platforms - - the curl tool does that getenv magic + - Quote the globbing example URLs that contain characters [] {} since + otherwise they may be interpreted as shell metacharacters. - Bug: https://github.com/curl/curl/commit/6de756c#r38127030 - Reported-by: Gisle Vanem + Bug: https://github.com/curl/curl/issues/5388 + Reported-by: John Simpson - Closes #5187 - -Marc Hoersken (5 Apr 2020) -- lib670: use the same Win32 API check as all other lib tests + Closes https://github.com/curl/curl/pull/5394 -- appveyor: use random test server ports based upon APPVEYOR_API_URL +Daniel Stenberg (14 May 2020) +- checksrc: enhance the ASTERISKSPACE and update code accordingly - Avoid conflicts of test server ports with AppVeyor API on localhost. + Fine: "struct hello *world" - Closes #5034 - -- appveyor: sort builds by type and add two new variants + Not fine: "struct hello* world" (and variations) - Related to #5034 and #5063 + Closes #5386 -- appveyor: show failed tests in log even if test is ignored +- docs/options-in-versions: which version added each cmdline option - And print API response with newline only if there is one - -- appveyor: turn disabled tests into ignored result tests - -Daniel Stenberg (5 Apr 2020) -- KNOWN_BUGS: fixed "USE_UNIX_SOCKETS on Windows" + Added test 971 to verify that the list is in sync with the files in + cmdline-opts. The check also verifies that .d-files that uses Added: + specify the same version number as the options-in-versions file does. - Fixed with #5170 (commit 23a870f2fd041278) + Closes #5381 -- test1566: verify --etag-compare that gets a 304 back +- docs: unify protocol lists - Verifies the fix in #5183 + We boast support for 25 transfer protocols. Make sure the lists are + consistent - Closes #5186 - -- [Kwon-Young Choi brought this change] + Closes #5384 - CURLINFO_CONDITION_UNMET: return true for 304 http status code +- OpenSSL: have CURLOPT_CRLFILE imply CURLSSLOPT_NO_PARTIALCHAIN - In libcurl, CURLINFO_CONDITION_UNMET is used to avoid writing to the - output file if the server did not transfered a file based on time - condition. In the same manner, getting a 304 HTTP response back from the - server, for example after passing a custom If-Match-* header, also - fulfill this condition. + ... to avoid an OpenSSL bug that otherwise makes the CRL check to fail. - Fixes #5181 - Closes #5183 + Reported-by: Michael Kaufmann + Fixes #5374 + Closes #5376 -- [Kwon-Young Choi brought this change] +- tls13-ciphers.d: shorten the Arg - curl: allow both --etag-compare and --etag-save with same file name - - This change inverse the order of processing for the --etag-compare and - --etag-save option to process first --etag-compare. This in turn allows - to use the same file name to compare and save an etag. - - The original behavior of not failing if the etag file does not exists is - conserved. - - Fixes #5179 - Closes #5180 +- sasl-authzid.d: add Arg: and shorten the desc -Viktor Szakats (4 Apr 2020) -- windows: enable UnixSockets with all build toolchains +- cert-type.d: mention the available types in the desc + +- tool: shorten 3 --help descriptions - Extend existing unix socket support in Windows builds to be - enabled for all toolchain vendors or versions. (Previously - it was only supported with certain MSVC versions + more recent - Windows 10 SDKs) + --happy-eyeballs-timeout-ms, --resolve and --ssl-revoke-best-effort - Ref: https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/ - Ref: https://github.com/curl/curl/issues/5162 - Closes: https://github.com/curl/curl/pull/5170 - -Daniel Stenberg (4 Apr 2020) -- KNOWN_BUGS: Store TLS context per transfer instead of per connection + gen.pl already warned about these lines but we didn't listen - Closes #5102 - -Marc Hoersken (3 Apr 2020) -- sockfilt: remove redundancy in timeout handling + Closes #5379 + +- configure: the wolfssh backend does not provide SCP - And update other logmsg output in select_ws on Windows. + Closes #5387 -- sockfilt: fix handling of ready closed sockets on Windows +- RELEASE-NOTES: synced + +- url: reject too long input when parsing credentials - Replace the incomplete workaround regarding FD_CLOSE - only signalling once by instead doing a pre-check with - standard select and storing the result for later use. + Since input passed to libcurl with CURLOPT_USERPWD and + CURLOPT_PROXYUSERPWD circumvents the regular string length check we have + in Curl_setstropt(), the input length limit is enforced in + Curl_parse_login_details too, separately. - select keeps triggering on closed sockets on Windows while - WSAEventSelect fires only once with data still available. - By doing the pre-check we do not run in a deadlock - due to waiting forever for another FD_CLOSE event. + Reported-by: Thomas Bouzerar + Closes #5383 -- sockfilt: fix race-condition of waiting threads and event handling +- list-only.d: this option existed already in 4.0 + +Jay Satiro (12 May 2020) +- retry-all-errors.d: Shorten the summary line - Fix race-condition of waiting threads finishing while events are - already being processed which lead to invalid or skipped events. + Follow-up to b995bb5 from a few moments ago. - Use mutex to check for one event at a time or do post-processing. - In addition to mutex-based locking use specific event as signal. + Reported-by: Daniel Stenberg - Closes #5156 + Ref: https://github.com/curl/curl/commit/b995bb5#r39108929 -Daniel Stenberg (2 Apr 2020) -- [Leo Neat brought this change] +- [denzor brought this change] - CI-fuzz: increase fuzz time to 40 minutes + easy: fix dangling pointer on easy_perform fail - Closes #5174 + Closes https://github.com/curl/curl/pull/5363 -Marc Hoersken (2 Apr 2020) -- CI: increase Azure Pipelines timeouts due to performance issues +- tool: Add option --retry-all-errors to retry on any error - The current demand on Azure negatively impacts the CI performance. - -- runtests.pl: log host OS as detected by Perl environment + The "sledgehammer" of retrying. + + Closes https://github.com/curl/curl/pull/5185 -- ftpserver.pl: log before and after data connection is closed +Daniel Stenberg (12 May 2020) +- [James Le Cuirot brought this change] -Daniel Stenberg (1 Apr 2020) -- RELEASE-NOTES: synced + libcurl.pc: Merge Libs.private into Libs for static-only builds + + A project being built entirely statically will call pkg-config with + --static, which utilises the Libs.private field. Conversely it will + not use --static when not being built entirely statically, even if + there is only a static build of libcurl available. This will most + likely cause the build to fail due to underlinking unless we merge the + Libs fields. + + Consider that this is what the Meson build system does when it + generates pkg-config files. + + I have also reflected this in the --libs argument of curl-config even + though REQUIRE_LIB_DEPS always seems to be "yes" anyway. + + Closes #5373 -- RELEASE-PROCEDURE.md: run the copyright.pl script! +- [Peter Wu brought this change] -- vquic/ngtcp2.h: update copyright year range + CMake: fix runtests.pl with CMake, add new test targets - Follow-up to 0736ee73d346a52 + * runtests.pl: + - Fix out-of-tree build under CMake when srcdir is not set. Default + srcdir to the location of runtests.pl. + - Add a hack to allow CMake to use the TFLAGS option as documented + in tests/README and used in scripts/travis/script.sh. + * Bump CMake version to 3.2 for USES_TERMINAL, dropping Debian Jessie + support (no one should care, it is already EOL.). + * Remove CTest since it defines its own 'test' target with no tests + since all unittests are already broken and not built by default. + * Add new test targets based on the options from Makefile.am. Since + new test targets are rarely added, I opted for duplicating the + runtests.pl options as opposed to creating a new Makefile.inc file. + Use top-level target names (test-x) instead of x-test since that is + used by CI and others. + + Closes #5358 -- [Daiki Ueno brought this change] +- [Peter Wu brought this change] - CI: add build with ngtcp2 + gnutls on Travis CI + CMake: do not build test programs by default + + The default target should only build libcurl and curl. Add a dedicated + 'testdeps' target which will be used later when running tests. Note that + unittests are currently broken in CMake and already excluded. + + Closes #5368 -- [Daiki Ueno brought this change] +- FILEFORMAT: moved up the variables section and further polished - vquic: add support for GnuTLS backend of ngtcp2 +- runtests: remove ftp2 support, not used - Currently, the TLS backend used by vquic/ngtcp2.c is selected at compile - time. Therefore OpenSSL support needs to be explicitly disabled. + We once supported two separate ftp instances in the test suite. Has not + been used the last decade. - Signed-off-by: Daiki Ueno - Closes #5148 - -- [Gisle Vanem brought this change] + Closes #5375 - examples/sessioninfo.c: add include to fix compiler warning +- url: sort the protocol schemes in rough popularity order - Fixes #5171 + When looking for a protocol match among supported schemes, check the + most "popular" schemes first. It has zero functionality difference and + for all practical purposes a speed difference will not be measureable + but it still think it makes sense to put the least likely matches last. + + "Popularity" based on the 2019 user survey. + + Closes #5377 -- misc: copyright year updates +Marc Hoersken (11 May 2020) +- test1238: avoid tftpd being busy for tests shortly following - Follow-up to 7a71965e9 + The tftpd server may still be busy if the total timeout of + 25 seconds has not been reached or no sread error was received + during or after the execution of the timeout test 1238. + + Once the next TFTP test comes around (eg. 1242 or 1243), + those will fail because the tftpd server is still waiting + on data from curl due to the UDP protocol being stateless + and having no connection close. On Linux this error may not + happen, because ICMP errors generated due to a swrite error + can also be returned async on the next sread call instead. + + Therefore we will now just kill the tftpd server after test + 1238 to make sure that the following tests are not affected. + + This enables us to no longer ignore tests 1242, 1243, 2002 + and 2003 on the CI platforms CirrusCI and AppVeyor. + + Assisted-by: Peter Wu + Closes #5364 -- [Harry Sintonen brought this change] +Daniel Stenberg (11 May 2020) +- write-out.d: added "response_code" - build: fixed build for systems with select() in unistd.h +- KNOWN_BUGS: Build with staticly built dependency - Closes #5169 + I rewrote the item 5.4 to be more generic about static dependencies. -- memdebug: don't log free(NULL) +- ROADMAP: remove old entries - ... it serves no purpose and fills up the log. - -- cleanup: insert newline after if() conditions + MQTT - the start has already landed - Our code style mandates we put the conditional block on a separate - line. These mistakes are now detected by the updated checksrc. - -- checksrc: warn on obvious conditional blocks on the same line as if() + tiny-curl - also mostly landed and is a continuous work - Closes #5164 + make menuconfig - basically no interest from users, not pushing there -- [Roger Orr brought this change] +- [Peter Wu brought this change] - cmake: add CMAKE_MSVC_RUNTIME_LIBRARY + travis: Add ngtcp2 and quiche tests for CMake - Fixes #5165 - Closes #5167 + To avoid an explosion of jobs, extend the existing CMake tests with + ngtcp2 and quiche support. macOS was previously moved to GitHub actions, + so the non-Linux case can be dropped. -- [Daiki Ueno brought this change] +- [Peter Wu brought this change] - ngtcp2: update to git master for the key installation API change - - This updates the ngtcp2 OpenSSL backend to follow the API change in - commit 32e703164 of ngtcp2. - - Notable changes are: - - ngtcp2_crypto_derive_and_install_{rx,tx}_key have been added to replace - ngtcp2_crypto_derive_and_install_key - - the 'side' argument of ngtcp2_crypto_derive_and_install_initial_key - has been removed + CMake: add ENABLE_ALT_SVC option - Fixes #5166 - Closes #5168 + Tested alt-svc with quiche. While at it, add missing MultiSSL reporting + (not tested). -- [Cyrus brought this change] +- [Peter Wu brought this change] - SECURITY.md: minor rephrase + CMake: add HTTP/3 support (ngtcp2+nghttp3, quiche) - Closes #5158 - -- output.d: quote the URL when globbing + Add three new CMake Find modules (using the curl license, but I grant + others the right to apply the CMake BSD license instead). - Some shells do globbing of their own unless the URL is quoted, so maybe - encourage this. + This CMake config is simpler than the autotools one because it assumes + ngtcp2 and nghttp3 to be used together. Another difference is that this + CMake config checks whether QUIC is actually supported by the TLS + library (patched OpenSSL or boringssl) since this can be a common + configuration mistake that could result in build errors later. - Co-authored-by: Jay Satiro - Closes #5160 - -- dist: add tests/version-scan.pl to tarball + Unlike autotools, CMake does not warn you that the features are + experimental. The user is supposed to already know that and read the + documentation. It requires a very special build environment anyway. - ... used in test 1177. + Tested with ngtcp2+OpenSSL+nghttp3 and quiche+boringssl, both built from + current git master. Use `LD_DEBUG=files src/curl |& grep need` to figure + out which features (libldap-2.4, libssh2) to disable due to conflicts + with boringssl. - Follow-up to a97d826f6de3 - -- test1177: verify that all the CURL_VERSION_ bits are documented + Closes #5359 -- curl.h: remnove CURL_VERSION_ESNI. Never supported nor documented +Marc Hoersken (10 May 2020) +- tests/server/tftpd.c: fix include and enhance debug logging - Considered experimental and therefore we can do this. + setjmp.h should only be included if HAVE_SETJMP_H is defined. - Closes #5157 + Add additional log statements to see wether reads and writes + are blocking or finishing before an alarm signal is received. + + Assisted-by: Peter Wu + Part of #5364 -- KNOWN_BUGS: DoH doesn't inherit all transfer options +Daniel Stenberg (10 May 2020) +- tool_operate: only set CURLOPT_SSL_OPTIONS if SSL support is present - Closes #4578 - Closes #4579 + Reported-by: Marcel Raad + Follow-up to 148534db5 + Fixes #5367 + Closes #5369 -- KNOWN_BUGS: DoH leaks memory after followlocation +Marc Hoersken (9 May 2020) +- appveyor: update comments to be clear about toolchain + + - CMake-based MSYS builds use mingw-w64 to cross-compile. + - autotools-based builds are compiled using msys2-devel. + + The difference is that the later ones are not cross-compiled + to Windows and instead require the msys2 runtime to be present. - Closes #4592 + At the moment only the Azure Pipelines CI builds actually + run autotools-based cross-compilation builds for Windows. -- KNOWN_BUGS: "FTPS needs session reuse" +- TODO: update regarding missing Schannel features - Closes #4654 - -- KNOWN_BUGS: "stick to same family over SOCKS pro" is presumed fixed - -- TODO: Set custom client ip when using haproxy protocol + Some aspects have already been implemented over the years. - Closes #5125 - -Michael Kaufmann (27 Mar 2020) -- writeout_json: Fix data type issues + 15.1 Client certificates are now supported: - Load long values correctly (e.g. for http_code). + - System stores via e35b0256eb34f1fe562e3e2a2615beb50a391c52 + - PKCS#12 files via 0fdf96512613574591f501d63fe49495ba40e1d5 - Use curl_off_t (not long) for: - - size_download (CURLINFO_SIZE_DOWNLOAD_T) - - size_upload (CURLINFO_SIZE_UPLOAD_T) + 15.2 Ciphers can now be specified through: - The unit for these values is bytes/second, not microseconds: - - speed_download (CURLINFO_SPEED_DOWNLOAD_T) - - speed_upload (CURLINFO_SPEED_UPLOAD_T) + - Algorithms via 9aefbff30d280c60fc9d8cc3e0b2f19fc70a2f28 - Fixes #5131 - Closes #5152 + Reviewed-by: Daniel Stenberg and Marcel Raad + Closes #5358 -Daniel Stenberg (27 Mar 2020) -- mailmap: fixup a few author names/fields - - Douglas Steinwand, Gökhan Şengün, Jessa Chandler, Julian Z and - Svyatoslav Mishyn +Daniel Stenberg (8 May 2020) +- checksrc: close the .checksrc file handle when done reading -- version: add 'cainfo' and 'capath' to version info struct - - Suggested-by: Timothe Litt - URL: https://curl.haxx.se/mail/lib-2020-03/0090.html - Reviewed-by: Jay Satiro +- RELEASE-NOTES: synced - Closes #5150 + And bumped next version to 7.71.0 -- RELEASE-NOTES: synced +- [Gilles Vollant brought this change] -Jay Satiro (26 Mar 2020) -- SSLCERTS.md: Fix example code for setting CA cert file + CURLOPT_SSL_OPTIONS: add *_NATIVE_CA to use Windows CA store (with openssl) - Prior to this change the documentation erroneously said use - CURLOPT_CAPATH to set a CA cert file. + Closes #4346 + +- TODO: native IDN support on macOS + +- urlapi: accept :: as a valid IPv6 address - Bug: https://curl.haxx.se/mail/lib-2020-03/0121.html - Reported-by: Timothe Litt + Text 1560 is extended to verify. - Closes https://github.com/curl/curl/pull/5151 + Reported-by: Pavel Volgarev + Fixes #5344 + Closes #5351 -Marc Hoersken (26 Mar 2020) -- sockfilt: add logmsg output to select_ws_wait_thread on Windows +- THANKS-filter: Peter Wang + +- [Peter Wang brought this change] + + *_sspi: fix bad uses of CURLE_NOT_BUILT_IN - Assisted-by: Jay Satiro - Reviewed-by: Daniel Stenberg + Return CURLE_AUTH_ERROR instead of CURLE_NOT_BUILT_IN for other + instances of QuerySecurityPackageInfo failing, as in + commit 2a81439553286f12cd04a4bdcdf66d8e026d8201. - Closes #5086 + Closes #5355 -Daniel Stenberg (26 Mar 2020) -- docs/make: generate curl.1 from listed files only +- docs/HTTP3: add qlog to the quiche build instruction + +- ngtcp2: introduce qlog support - Previously it rendered the page from files matching "*.d" in the correct - directory, which worked fine in git builds when the files were added but - made it easy to forget adding the files to the dist. + If the QLOGDIR environment variable is set, enable qlogging. - Now, only man page sections listed in DPAGES in Makefile.inc will be - used, thus "forcing" us to update this to get the man page right and get - it included in the dist at the same time. + ... and create Curl_qlogdir() in the new generic vquic/vquic.c file for + QUIC functions that are backend independent. - Ref: #5146 - Closes #5149 + Closes #5353 -- openssl: adapt to functions marked as deprecated since version 3 - - OpenSSL 3 deprecates SSL_CTX_load_verify_locations and the MD4, DES - functions we use. - - Fix the MD4 and SSL_CTX_load_verify_locations warnings. +- ntlm_sspi: fix bad use of CURLE_NOT_BUILT_IN - In configure, detect OpenSSL v3 and if so, inhibit the deprecation - warnings. OpenSSL v3 deprecates the DES functions we use for NTLM and - until we rewrite the code to use non-deprecated functions we better - ignore these warnings as they don't help us. + That return code is reserved for build-time conditional code not being + present while this was a regular run-time error from a Windows API. - Closes #5139 + Reported-by: wangp on github + Fixes #5349 + Closes #5350 -- dist: add mail-rcpt-allowfails.d to the tarball +- runtests: show elapsed test time with higher precision (ms) + +- RELEASE-NOTES: synced + +- http2: simplify and clean up trailer handling - Reported-by: Maksim Stsepanenka - Reviewed-by: Jat Satiro + Triggered by a crash detected by OSS-Fuzz after the dynbuf introduction in + ed35d6590e72. This should make the trailer handling more straight forward and + hopefully less error-prone. - Closes #5146 - -- travis: update the ngtcp2 build to use the latest OpenSSL patch + Deliver the trailer header to the callback already at receive-time. No + longer caches the trailers to get delivered at end of stream. - ... which also makes it OpenSSL 1.1.1d based and not v3. + Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=22030 + Closes #5348 -Marc Hoersken (24 Mar 2020) -- CI: remove default Ubuntu build from GitHub Actions +Marc Hoersken (7 May 2020) +- appveyor: disable test 1139 instead of ignoring it - We are already running a very similar Ubuntu build on Travis CI. - The macOS variant of this default build is kept on Github Actions. + Spending time on manpage checking makes no sense + for these builds due to lacking manpage support. -- CI: bring GitHub Actions fuzzing job in line with macOS jobs +- appveyor: disable flaky test 1501 and ignore broken 1056 - Update YAML formatting, job naming and triggers. + Test 1501 is flaky on Windows CI due to being time sensitive + and the testsuite relying on taskkill.exe to check for the + existance of processes which can take to much time itself. + + Test 1056 is broken in autotools-based Windows builds due + to scope ID support missing in these builds at the moment. -- CI: migrate macOS jobs from Azure and Travis CI to GitHub Actions +- test613.pl: make tests 613 and 614 work with OpenSSH for Windows - Reduce workload on Azure Pipelines and Travis CI while - consolidating macOS jobs onto less utilized GitHub Actions. + OpenSSH for Windows shows group and other/world permissions as *, + because those concepts do not exist on Windows. It also does not + show the current or parent directory, so we just ignore those. Reviewed-by: Daniel Stenberg - - Closes #5124 + Closes #5328 -Daniel Stenberg (24 Mar 2020) -- config: remove all defines of HAVE_DES_H +Daniel Stenberg (6 May 2020) +- runtests: set +x mode again + +- libssh2: convert over to use dynbuf - As there's no code using it. + In my very basic test that lists sftp://127.0.0.1/tmp/, this patched + code makes 161 allocations compared to 194 in git master. A 17% + reduction. - Closes #5144 + Closes #5336 -- copyright: fix out-of-date copyright ranges and missing headers +- travis: add "qlog" as feature in the quiche build + +- quiche: enable qlog output - Reported by the new script 'scripts/copyright.pl'. The script has a - regex whitelist for the files that don't need copyright headers. + quiche has the potential to log qlog files. To enable this, you must + build quiche with the qlog feature enabled `cargo build --features + qlog`. curl then passes a file descriptor to quiche, which takes + ownership of the file. The FD transfer only works on UNIX. - Removed three (mostly usesless) README files from docs/ + The convention is to enable logging when the QLOGDIR environment is + set. This should be a path to a folder where files are written with the + naming template .qlog. - Closes #5141 + Co-authored-by: Lucas Pardue + Replaces #5337 + Closes #5341 -- packages: add OS400/chkstrings.c to the dist +- urldata.h: remove #define HEADERSIZE, not used anymore - Reported-by: Jon Rumsey - Fixes #5142 - Closes #5143 + Follow-up to ed35d6590e72c -- [Clément Notin brought this change] +- ngtcp2: convert to dynbuf + + Closes #5335 - nghttp2: 1.12.0 required +- connect: make happy eyeballs work for QUIC (again) - since nghttp2_session_set_local_window_size is needed + Follow-up from dbd16c3e256c6c (regression in 7.70.0) - Closes #5140 - -- RELEASE-NOTES: synced + Closes #5334 -- [Calvin Buckley brought this change] +- connect: add two asserts to clue code analyzers in a little - OS400: Update strings for ccsid-ifier - - Fixes build. +- http_proxy: ported to use dynbuf instead of a static size buffer - Closes #5132 + Removes a 16K static buffer from the easy handle. Simplifies the code. -- cirrus: make freebsd ignore the tests instead of skipping - - To allow us to see in the CI logs how they actually behave +- dynbuf: introduce internal generic dynamic buffer functions - Closes #5091 - -- cirrus: move the sanitizer build from freebsd 13 to freebsd 12 - -- Revert "cirrus-ci: disable the FreeBSD 13 builds" + A common set of functions instead of many separate implementations for + creating buffers that can grow when appending data to them. Existing + functionality has been ported over. - This reverts commit 691b71be930f0e285c8f7a76efd56bbe0576cda6. - -- getinfo: provide CURLINFO_HEADER_SIZE and CURLINFO_REQUEST_SIZE override + In my early basic testing, the total number of allocations seem at + roughly the same amount as before, possibly a few less. - To let debug-builds return fake values, like in test 970. + See docs/DYNBUF.md for a description of the API. - Ref: #5131 - Closes #5136 + Closes #5300 -- test970: improve the test +- runtests: remove sleep calls - - send more data to make problems more obvious - - don't start the data with minus, it makes diffs harder to read - - skip the headers in the stdout comparison - - save to a file name to also verify 'filename_effective' + Remove many one second sleeps that were done *after* each newly started + test server already has been verified. They should not have any purpose + there. - Ref: #5131 + Closes #5323 -- CURLINFO_NUM_CONNECTS: improve accuracy - - The counter was not bumped in all cases correctly. +- asyn-*: remove support for never-used NULL entry pointers - Reported-by: Marcel Raad - Ref: #5131 - Closes #5135 + ... and instead convert those to asserts to make sure they are truly + never NULL. + + Closes #5324 -- TODO: Use "random" ports for the test servers +- [Emil Engler brought this change] -- lib/curl_setup: adjust the copyright year range + doc: Rename VERSIONS to VERSIONS.md as it already has Markdown syntax - Follow-up from d820224b8 + Closes #5325 -Jay Satiro (21 Mar 2020) -- curl_setup: define _WIN32_WINNT_[OS] symbols +Jay Satiro (2 May 2020) +- asyn-thread: fix cppcheck warning - .. because not all Windows build systems have those symbols, and even - those that do may be missing newer symbols (eg the Windows 7 SDK does - not define _WIN32_WINNT_WIN10). + - Check for NULL entry parameter before attempting to deref entry in + Curl_resolver_is_resolved, like is already done in asyn-ares. - Those symbols are used in build-time logic to decide which API to use - and prior to this change if the symbols were missing it would have - resulted in deprecated API being used when more recent functions were - available (eg GetVersionEx used instead of VerifyVersionInfo). + This is to silence cppcheck which does not seem to understand that + asyn-ares and asyn-thread have separate Curl_resolver_is_resolved + and those units are mutually exclusive. Prior to this change it warned + of a scenario where asyn-thread's Curl_resolver_is_resolved is called + with a NULL entry from asyn-ares, but that couldn't happen. - Reported-by: FuccDucc@users.noreply.github.com + Reported-by: rl1987@users.noreply.github.com - Probably fixes https://github.com/curl/curl/issues/4995 - Closes https://github.com/curl/curl/pull/5057 - -- [Ross Burton brought this change] + Fixes https://github.com/curl/curl/issues/5326 - curl-functions.m4: remove inappropriate AC_REQUIRE +- select: fix overflow protection in Curl_socket_check - AC_REQUIRE means "if this macro hasn't been executed already, execute - it". So in a wrapper around AC_RUN_IFELSE, AC_REQUIRE(AC_RUN_IFELSE) - isn't correct at that will execute AC_RUN_IFELSE without any arguments. + Follow-up to a96c752 which changed the timeout_ms type from time_t to + timediff_t. - With autoconf 2.69 this is basically a no-op, but with autoconf 2.70, - AC_RUN_IFELSE without a default value when cross-compiling is fatal. - The result is that curl with autoconf 2.70 cannot cross-compile. + Ref: https://github.com/curl/curl/pull/5240 - Fixes https://github.com/curl/curl/issues/5126 - Closes https://github.com/curl/curl/pull/5130 + Closes https://github.com/curl/curl/pull/5286 -Marc Hoersken (20 Mar 2020) -- ci/tests: fix Azure Pipelines not running Windows containers +Marc Hoersken (2 May 2020) +- sockfilt: make select_ws stop waiting on exit signal event - Workaround posted here: microsoft/azure-pipelines-agent#2864 + This makes sure that select_ws behaves similar to real select + which stops waiting on a signal handler being triggered. - Assisted-by: Simon Chalifoux - Assisted-by: Tommy Petty + This makes it possible to gracefully stop sockfilt.exe on + Windows with taskkill /IM sockfilt.exe (without /F force flag). - Fixes #5117 - Closes #5129 + Reviewed-by: Jay Satiro + Part of #5260 -Daniel Stenberg (20 Mar 2020) -- tests: add test 430, 431 and 432 to verify the --config fix +- tests/server/util.[ch]: add exit event to stop waiting on Windows - Verify the fixes in 4e0b4fee4 - -- [Rici Lake brought this change] - - cmdline: fix handling of OperationConfig linked list (--next) + This commit adds a global exit event to the test servers that + Windows-specific wait routines can use to get triggered if the + program was signaled to be terminated, eg. select_ws in sockfilt.c - Ensures that -K/--config inserts new items at the end of the list - instead of overwriting the second item, and that after a -K/--config - option has been parsed, the option parser's view of the current config - is update. + The exit event will be managed by the signal handling code and is + set to not reset automatically to support multiple wait routines. - Fixes #5120 - Closes #5123 - -Marc Hoersken (20 Mar 2020) -- test2100: fix static port instead of dynamic value being used - -- test970: fix static ip:port instead of dynamic values being used + Reviewed-by: Jay Satiro + Closes #5260 -Daniel Stenberg (19 Mar 2020) -- secure transport: remove the BACKEND define kludge +- tests/server/util.c: fix thread handle not being closed - Closes #5122 + Reviewed-by: Jay Satiro + Part of #5260 -- mbedtls: remove the BACKEND define kludge +- tests/server/util.c: use raise instead of calling signal handler + + Use raise to trigger signal handler instead of calling it + directly and causing potential unexpected control flow. + + Reviewed-by: Jay Satiro + Part of #5260 -- bearssl: remove the BACKEND define kludge +- tests: add support for SSH server variant specific transfer paths + + OpenSSH for Windows requires paths in the format of /C:/ + instead of the pseudo-POSIX paths /cygdrive/c/ or just /c/ + + Reviewed-by: Daniel Stenberg + Closes #5298 -- wolfssl: remove the BACKEND define kludge +Daniel Stenberg (2 May 2020) +- RELEASE-NOTES: synced -- nss: remove the BACKEND define kludge +- libssh2: set the expected total size in SCP upload init + + ... as otherwise the progress callback gets called without that + information, making the progress meter have less info. + + Reported-by: Murugan Balraj + Bug: https://curl.haxx.se/mail/archive-2020-05/0000.html + Closes #5317 -- gnutls: remove the BACKEND define kludge +- runtests: make the logmsg from the ssh server only show in verbose -- openssl: remove the BACKEND define kludge +- tests: make test 1248 + 1249 use %NOLISTENPORT - Use a proper variable instead to make it easier to use a debugger and - read the code. + ... instead of a port of a non-running server so that it works + stand-alone. + + Closes #5318 -Marc Hoersken (19 Mar 2020) -- tests: make Python-based servers compatible with Python 2 and 3 +- examples: remove asiohiper.cpp - Update smbserver.py and negtelnetserver.py to be compatible with - Python 3 while staying backwards-compatible to support Python 2. + This example has repeatedly been reported to contain bugs, and as users + copy and paste code from this into production, I now deem it better to + not provide the example at all. - Fix string encoding and handling of echoed and transferred data. + Closes #5090 + Closes #5322 + +- [Emil Engler brought this change] + + doc: add missing closing parenthesis in CURLINFO_SSL_VERIFYRESULT.3 - Tested with both Python 2.7.17 and Python 3.7.7 + Closes #5320 + +- [Emil Engler brought this change] + + KNOWN_BUGS: Remove "curl --upload-file . hang if delay in STDIN" - Reported-by: Daniel Stenberg - Assisted-by: Kamil Dudka - Reviewed-by: Marcel Raad + It was fixed in 9a2cbf3 - Fixes #5104 - Closes #5110 + Closes #5319 -Daniel Stenberg (18 Mar 2020) -- writeout_json: use curl_off_t printf() option for the time output +- cirrus: disable SFTP and SCP tests - Follow-up to: 04c03416e68fd635a15 + ... as we can't seem to start the sshd server on it. Those problems + existed before d1239b50bececd (running the SSH server on a random port), + but they're more noticable now since there are more failed attempts in + the logs. - Closes #5115 + Closes #5315 -- RELEASE-NOTES: synced - - Uh, I missed this in 1a46b218db +- [Emil Engler brought this change] -- RELEASE-NOTES: synced + runtests: fix typo in the existence of disabled tests checker - ... and bumped curlver.h to 7.70.0 + Closes #5316 -Jay Satiro (18 Mar 2020) -- http2: Fix erroneous debug message that h2 connection closed - - Prior to this change in libcurl debug builds http2 stream closure was - erroneously referred to as connection closure. - - Before: - * nread <= 0, server closed connection, bailing - - After: - * nread == 0, stream closed, bailing +Dan Fandrich (30 Apr 2020) +- test75: Remove precheck test - Closes https://github.com/curl/curl/pull/5118 + This has not been needed since commit 9fa42bed and often prevents it + from running at all with dynamic test ports. -Daniel Stenberg (18 Mar 2020) -- tool_setopt: correct the copyright year range +- tests: Stop referring to server ports when they're not used - Follow-up to 5450428491 + Several tests referred to specific server ports even when the test + didn't actually use that server or specify that it's needed. In such + cases, the test harness substitutes the text "[not running]" as the port + number which causes many such tests to fail due to the inability to + parse the URL. These tests are changed to use %NOLISTENPORT which will + always be substituted correctly. -Jay Satiro (18 Mar 2020) -- [Johannes Schindelin brought this change] +Daniel Stenberg (30 Apr 2020) +- [Emil Engler brought this change] - schannel: add "best effort" revocation check option - - - Implement new option CURLSSLOPT_REVOKE_BEST_EFFORT and - --ssl-revoke-best-effort to allow a "best effort" revocation check. + GnuTLS: Backend support for CURLINFO_SSL_VERIFYRESULT - A best effort revocation check ignores errors that the revocation check - was unable to take place. The reasoning is described in detail below and - discussed further in the PR. + Closes #5287 + +- conncache: various concept cleanups - --- + More connection cache accesses are protected by locks. - When running e.g. with Fiddler, the schannel backend fails with an - unhelpful error message: + CONNCACHE_* is a beter prefix for the connection cache lock macros. - Unknown error (0x80092012) - The revocation function was unable - to check revocation for the certificate. + Curl_attach_connnection: now called as soon as there's a connection + struct available and before the connection is added to the connection + cache. - Sadly, many enterprise users who are stuck behind MITM proxies suffer - the very same problem. + Curl_disconnect: now assumes that the connection is already removed from + the connection cache. - This has been discussed in plenty of issues: - https://github.com/curl/curl/issues/3727, - https://github.com/curl/curl/issues/264, for example. + Ref: #4915 + Closes #5009 + +- tests: tests: run stunnel for HTTPS and FTPS on dynamic ports - In the latter, a Microsoft Edge developer even made the case that the - common behavior is to ignore issues when a certificate has no recorded - distribution point for revocation lists, or when the server is offline. - This is also known as "best effort" strategy and addresses the Fiddler - issue. + As stunnel is an external tool and it has no specific option to export + the actually used port number when asked to listen to 0, runtests + instead iterates over ten randomly picked high number ports and sticks + to the first one stunnel can listen to. - Unfortunately, this strategy was not chosen as the default for schannel - (and is therefore a backend-specific behavior: OpenSSL seems to happily - ignore the offline servers and missing distribution points). + Closes #5267 + +- tests: pick a random port number for SSH - To maintain backward-compatibility, we therefore add a new flag - (`CURLSSLOPT_REVOKE_BEST_EFFORT`) and a new option - (`--ssl-revoke-best-effort`) to select the new behavior. + Since sshd doesn't have such an option by itself, we iterate over a + series of random ports until one works. - Due to the many related issues Git for Windows and GitHub Desktop, the - plan is to make this behavior the default in these software packages. + Closes #5273 + +- [Rikard Falkeborn brought this change] + + libtest/cmake: Remove commented code - The test 2070 was added to verify this behavior, adapted from 310. + These were commented out in e9dd0998706a when Makefile.inc was included + instead. 11 years have passed since then and the commented code is of + course very outdated. Remove it to avoid confusion. - Based-on-work-by: georgeok - Co-authored-by: Markus Olsson - Signed-off-by: Johannes Schindelin + Closes #5311 + +- schannel: source code reindent - Closes https://github.com/curl/curl/pull/4981 + White space edits only. Conform better to standard curl source code + indenting style. + + Closes #5305 -- multi: Improve parameter check for curl_multi_remove_handle +Kamil Dudka (29 Apr 2020) +- test1177: look for curl.h in source directory - - If an easy handle is owned by a multi different from the one specified - then return CURLM_BAD_EASY_HANDLE. + If we use a separate build directory, there is no copy of the header. - Prior to this change I assume user error could cause corruption. + Closes #5310 + +- tests: look for preprocessed tests in build directory - Closes https://github.com/curl/curl/pull/5116 + ... which is not always the same directory as source directory + + Closes #5310 -Viktor Szakats (17 Mar 2020) -- windows: suppress UI in all CryptAcquireContext() calls +Daniel Stenberg (29 Apr 2020) +- RELEASE-NOTES: synced - Ref: https://docs.microsoft.com/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta#parameters - Reviewed-by: Marc Hörsken - Closes https://github.com/curl/curl/pull/5088 + ... and bumped curlver.h to 7.70.1 -Daniel Stenberg (17 Mar 2020) -- writeout_json: add missing comma to fix the HTTP version +Version 7.70.0 (29 Apr 2020) + +Daniel Stenberg (29 Apr 2020) +- RELEASE-NOTES: 7.70.0 + +- THANKS: synced with the 7.70.0 release + +- headers: copyright range fix + +- [Rikard Falkeborn brought this change] + + doh: Constify some input pointers - Follow-up to 04c03416e68fd635a15 + Closes #5306 -- test 970: verify --write-out '%{json}' +- nss: check for PK11_CreateDigestContext() returning NULL - Makes curl_easy_getinfo() of "variable" numerical content instead return - the number set in the env variable `CURL_TIME`. + ... to avoid crashes! - Makes curl_version() of "variable" textual content. This guarantees a - stable version string which can be tested against. Environment variable - `CURL_VERSION` defines the content. + Reported-by: Hao Wu + Fixes #5302 + Closes #5303 + +- travis: bump the wolfssl CI build to use 4.4.0 - Assisted-by: Mathias Gumz + Closes #5301 -- [Mathias Gumz brought this change] +- copyright updates: adjust year ranges - writeout: support to generate JSON output - - This commit adds support to generate JSON via the writeout feature: - - -w "%{json}" +Marc Hoersken (26 Apr 2020) +- CI: do not include */ci branches in PR builds - It leverages the existing infrastructure as much as possible. Thus, - generating the JSON on STDERR is possible by: + Align Azure Pipelines with GitHub Actions. + +Daniel Stenberg (25 Apr 2020) +- runtests: check for the disabled tests relative srcdir - -w "%{stderr}%{json}" + To make it work correctly for out-of-tree builds. - This implements a variant of - https://github.com/curl/curl/wiki/JSON#--write-out-json. + Follow-up to 75e8feb6fb08b - Closes #4870 + Bug: https://github.com/curl/curl/pull/5288#issuecomment-619346389 + Reported-by: Marcel Raad + Closes #5297 -- CI: stop ignoring 323, it is disabled +- runtests: revert commenting out a line I did for debugging + + Follow-up to 11091cd4d. It was not meant to be pushed! -- DISABLED: disable test 323 +- smtp: set auth correctly - The test uses SRP to "a server not supporting it" but modern stunnel - versions will silently accept it and remain happy. The test is therefore - faulty. + Regression since 7.69.0 and 68fb25fa3fcff. - I haven't figured out how to make stunnel explicitly reject SRP-using - connects. + The code wrongly assigned 'from' instead of 'auth' which probably was a + copy and paste mistake from other code, leading to that auth could + remain NULL and later cause an error to be returned. - Reported-by: Marc Hörsken - Fixes #5105 - Closes #5113 + Assisted-by: Eric Sauvageau + Fixes #5294 + Closes #5295 -Marc Hoersken (17 Mar 2020) -- ci/tests: increase timeouts for torture builds on Azure Pipelines - - For some reason the torture builds have slowed down recently. +Marcel Raad (25 Apr 2020) +- lib: clean up whitespace - Reported-by: Daniel Stenberg + This fixes CodeFactor warnings. -Daniel Stenberg (16 Mar 2020) -- cmake: add support for building with wolfSSL +Daniel Stenberg (25 Apr 2020) +- [Anderson Toshiyuki Sasaki brought this change] + + libssh: avoid options override by configuration files - My working build cmdline: + Previously, options set explicitly through command line options could be + overridden by the configuration files parsed automatically when + ssh_connect() was called. - $ cmake -DCMAKE_PREFIX_PATH=$HOME/build-wolfssl -DCMAKE_USE_WOLFSSL=ON . + By calling ssh_options_parse_config() explicitly, the configuration + files are parsed before setting the options, avoiding the options + override. Once the configuration files are parsed, the automatic + configuration parsing is not executed. - Assisted-by: Brad King - Closes #5095 + Fixes #4972 + Closes #5283 + Signed-off-by: Anderson Toshiyuki Sasaki -- tool_operate: fix add_parallel_transfers when more are in queue - - Trying to return early from the function if no new transfers were added - would break the "morep" argument and cause issues. This could lead to - zero content "transfers" (within quotes since they would never be - started) when parallel-max was reduced. +- runtests: when mentions http, kill http/2 too - Reported-by: Gavin Wong - Analyzed-by: Jay Satiro - Fixes #4937 - Closes #5112 - -- vtls: free ssl_config leftovers on out-of-memory + Since the http2 test server is a mere proxy that needs to know about the + dynamic port the HTTP server is using, it too needs to get restarted + when the http server is killed. - Torture testing 2034 and 2037 found this. + A regression caused by 80d6515. - Reported-by: Marc Hörsken - Fixes #5108 - Closes #5109 + Fixes #5289 + Closes #5291 -Marc Hoersken (16 Mar 2020) -- ci/tests: fix Azure Pipelines not running for pull requests - - Closes #5111 +- [Yuri Slobodyanyuk brought this change] -Daniel Stenberg (15 Mar 2020) -- gskit: update the copyright year range + docs: fix two typos - Follow-up from 083603c63a3 + Closes #5292 -Marc Hoersken (15 Mar 2020) -- gskit: use our internal select wrapper for portability - - Follow up to c52b342 - Closes #5106 +- [Emil Engler brought this change] -- tests: fix verification of stdout in test 1452 due to newline + tests/git: ignore mqttd and port files - Fixes test1452:41:1: error: missing tag before + Closes #5290 -- ci/tests: install impacket for SMB tests on FreeBSD using CirrusCI +- tests: make runtests check that disabled tests exists - Also force the package index/cache to be updated before installing. + ... and error out if so. Removed '536' from DISABLED as there is no such + test file. - Closes #5103 + Closes #5288 -- tests/README: add note about manually installing python-impacket - - Follow up to 4be2560 +- test1154: set a proper name -Daniel Stenberg (15 Mar 2020) -- transfer: cap retries of "dead connections" to 5 +- select: make Curl_socket_check take timediff_t timeout - When libcurl retries a connection due to it being "seemingly dead" or by - REFUSED_STREAM, it will now only do it up five times before giving up, - to avoid never-ending loops. + Coverity found CID 1461718: - Reported-by: Dima Tisnek - Bug: https://curl.haxx.se/mail/lib-2020-03/0044.html - Closes #5074 - -- TODO: TLS-PSK with OpenSSL + Integer handling issues (CONSTANT_EXPRESSION_RESULT) "timeout_ms > + 9223372036854775807L" is always false regardless of the values of its + operands. This occurs as the logical second operand of "||". - Closes #5081 + Closes #5240 -Marc Hoersken (15 Mar 2020) -- select: add 'timeout_ms' wrap-around precaution to Curl_select +- [i-ky brought this change] -- select: fix 'pending_ms' is assigned a value that is never used + libcurl-multi.3: added missing full stop - Detected by Codacy + Closes #5285 -- select: move duplicate select preparation code into Curl_select +Jay Satiro (22 Apr 2020) +- transfer: Switch PUT to GET/HEAD on 303 redirect - Reviewed by Daniel Stenberg - Reviewed by Marcel Raad - Closes #5078 + Prior to this change if there was a 303 reply to a PUT request then + the subsequent request to respond to that redirect would also be a PUT. + It was determined that was most likely incorrect based on the language + of the RFCs. Basically 303 means "see other" resource, which implies it + is most likely not the same resource, therefore we should not try to PUT + to that different resource. + + Refer to the discussions in #5237 and #5248 for more information. + + Fixes https://github.com/curl/curl/issues/5237 + Closes https://github.com/curl/curl/pull/5248 + +Daniel Stenberg (22 Apr 2020) +- lib/mk-ca-bundle: skip empty certs + + Reviewed-by: Emil Engler + Reported-by: Ashwin Metpalli + Fixes #5278 + Closes #5280 -Daniel Stenberg (15 Mar 2020) -- connect: happy eyeballs cleanup - - Make sure each separate index in connn->tempaddr[] is used for a fixed - family (and only that family) during the connection process. +- version: skip idn2_check_version() check and add precaution - If family one takes a long time and family two fails immediately, the - previous logic could misbehave and retry the same family two address - repeatedly. + A gcc-10's -fanalyze complaint made me spot and do these improvements. - Reported-by: Paul Vixie - Reported-by: Jay Satiro - Fixes #5083 - Fixes #4954 - Closes #5089 + Closes #5281 -Marc Hoersken (15 Mar 2020) -- ci/tests: fix and align setting TFLAGS for make test-nonflaky +- RELEASE-NOTES: synced -- ci/tests: install test suite dependencies stunnel and impacket +- [Brian Bergeron brought this change] -- tests: remove python_dependencies for smbserver from our tree - - Users of the SMB tests will have to install impacket manually. + curl.h: update comment typo - Reasoning: our in-tree version of impacket was quite outdated - and only compatible with Python 2 which is already end-of-life. - Upgrading to Python 3 and a compatible impacket version would - require to import additional Python-only and CPython-extension - dependencies. This would have hindered portability enormously. + "routines with be invoked" -> "routines will be invoked" - Closes #5094 + Closes #5279 -Jay Satiro (14 Mar 2020) -- Makefile.m32: Improve windres parameter compatibility - - - s/COFF/coff/ - - Some versions of windres do not recognize uppercase COFF as a valid - way to specify the COFF output format. - - Reported-by: Steven Penny - - Fixes https://github.com/curl/curl/issues/5099 - Closes https://github.com/curl/curl/pull/5101 +- [Emil Engler brought this change] -- easy: Fix curl_easy_duphandle for builds missing IPv6 that use c-ares + GnuTLS: Don't skip really long certificate fields - - Ignore CURLE_NOT_BUILT_IN errors returned by c-ares functions in - curl_easy_duphandle. + Closes #5271 + +- gnutls: bump lowest supported version to 3.1.10 - Prior to this change if c-ares was used as the resolver backend and - either it was too old or libcurl was built without IPv6 support then - some of our resolver functions could return CURLE_NOT_BUILT_IN to - curl_easy_duphandle causing it to fail. + GnuTLS 3.1.10 added new functions we want to use. That version was + released on Mar 22, 2013. Removing support for older versions also + greatly simplifies the code. - Caused by c8f086b which shipped in 7.69.1. + Ref: #5271 + Closes #5276 + +- mqtt: make NOSTATE get within the debug name array + +- tests: run the RTSP test server on a dynamic port number - Reported-by: Karl Chen + To avoid port collisions. - Fixes https://github.com/curl/curl/issues/5097 - Closes https://github.com/curl/curl/pull/5100 + Closes #5272 -Daniel Stenberg (13 Mar 2020) -- docs: add warnings about FILE: URLs on Windows +- tests: add %NOLISTENPORT and use it - - --url man page section - - libcurl-security.3 gets the full text - - CURLOPT_URL.3 + The purpose with this variable is to provide a port number that is + reasonably likely to not have a listener on the local host so that tests + can try connect failures against it. It uses port 47 - "reserved" + according to IANA. - Reported-by: Tim Sedlmeyer + Updated six tests to use it instead of the previous different ports. + + Assisted-by: Emil Engler + Closes #5270 -- server/getpart: make the "XML-parser" stricter +- mqtt: remove code with no purpose - When extracting a
and there's no before -
, this now outputs an error and returns a wrong string to - make users spot the mistake. + Detected by Coverity. CID 1462319. - Ref: #5070 - Closes #5071 - -Marc Hoersken (13 Mar 2020) -- impacket: some more Python 3 code compatibility updates + "The same code is executed when the condition result is true or false, + because the code in the if-then branch and after the if statement is + identical." - This makes smbserver load on Python 3, but still not work completely. + Closes #5275 -- smbserver: pin Python version to 2 since we are not yet 3 compatible +- mqtt: fix Curl_read() error handling while reading remaining length - Even though the existing code can be fixed to run on Python 3, the - tests will fail due to the Unicode transition the protocol is invalid. + Detected by Coverity. CID 1462320. - Follow up to ee63837 - Closes #5085 - -Daniel Stenberg (12 Mar 2020) -- [Viktor Szakats brought this change] + Closes #5274 - cleanup: fix some text/comment typos +- server/tftpd: fix compiler warning - Closes #5087 + Follow-up from 369ce38ac1d + Reported-by: Marc Hörsken -Marc Hoersken (12 Mar 2020) -- smbserver: fix Python version specific ConfigParser import +- http: free memory when Alt-Used header creation fails due to OOM - Follow up to ee63837 and 8c7c4a6 - Fixes #5077 + Reported-by: James Fuller + Fixes #5268 + Closes #5269 -Daniel Stenberg (11 Mar 2020) -- RELEASE-NOTES: synced +Daniel Gustafsson (20 Apr 2020) +- lib: fix typos in comments and errormessages - bumped to 7.69.2 + This fixes a few randomly spotted typos in recently merged code, most + notably one in a userfacing errormessage the schannel code. -Dan Fandrich (11 Mar 2020) -- tests/data: Fix some XML formatting issues in test cases +Daniel Stenberg (20 Apr 2020) +- tests: run the SOCKS test server on a dynamic port number - This allows these test files to pass xmllint. + Closes #5266 -Daniel Stenberg (11 Mar 2020) -- [Muhammad Herdiansyah brought this change] +- [Johannes Schindelin brought this change] - Makefile: run the cd commands in a subshell + multi-ssl: reset the SSL backend on `Curl_global_cleanup()` - In bmake, if the directory is changed (with cd or anything else), bmake - won't return to the "root directory" on the next command (in the same - Makefile rule). This commit runs the cd command in a subshell so it - would work in bmake. + When cURL is compiled with support for multiple SSL backends, it is + possible to configure an SSL backend via `curl_global_sslset()`, but + only *before* `curl_global_init()` was called. - Closes #5073 - -- configure: convert -I to -isystem as a last step + If another SSL backend should be used after that, a user might be + tempted to call `curl_global_cleanup()` to start over. However, we did + not foresee that use case and forgot to reset the SSL backend in that + cleanup. - As all the -I uses in CFLAGS at that point are for system headers and - third party libraries this helps us remove/ignore warnings on those! + Let's allow that use case. - Closes #5060 + Fixes #5255 + Closes #5257 + Reported-by: davidedec on github + Signed-off-by: Johannes Schindelin -- configure: fix -pedantic-errors for GCC 5 and later - - If --enable-werror is used. +- tests: run the TFTP test server on a dynamic port number - Follow-up to d5c0351055d5709da which added it too early in the configure - script before $compiler_num was set correctly and thus this option was - never used. + Picking a dynamic unused port is better than a fixed to avoid the + collision risk. - Reported-by: Stepan Efremov - Fixes #5067 - Closes #5068 + Closes #5265 -- configure: document 'compiler_num' for gcc +- mqtt: improve the state machine - The CURL_CHECK_COMPILER_GNU_C function sets the number to MAJOR*100 + - MINOR and ignores the patch version, and since gcc version 7 it only - sets it to MAJOR*100. + To handle PUBLISH before SUBACK and more. - Reported-by: Stepan Efremov - Ref: #5067 - Closes #5069 + Updated the existing tests and added three new ones. + + Reported-by: Christoph Krey + Bug: https://curl.haxx.se/mail/lib-2020-04/0021.html + Closes #5246 -Version 7.69.1 (11 Mar 2020) +- runtests: always put test number in servercmd file -Daniel Stenberg (11 Mar 2020) -- RELEASE-NOTES: 7.69.1 +- RELEASE-NOTES: synced -- THANKS: from the 7.69.1 release +- release-notes.pl: fix parsing typo -- [Marc Hoersken brought this change] +James Fuller (20 Apr 2020) +- ensure all references to ports are replaced by vars - test1129: fix invalid case of closing XML-tag and Content-Length +- add more alt-svc test coverage + +Daniel Stenberg (20 Apr 2020) +- test1247: use http server to get the port number set - Fixes #5070 - Closes #5072 + Follow-up to 0f5db7b263f -Marc Hoersken (10 Mar 2020) -- tests/data: fix static ip instead of dynamic value being used +- runtests: use a unix domain socket path with the pid in the name - Follow up to 94ced8e + To make it impossible for test cases to access the file name without + using the proper variable for the purpose. + + Closes #5264 -- tests/data: fix static ip:port instead of dynamic values being used +Daniel Gustafsson (19 Apr 2020) +- [Mipsters on github brought this change] + + src: Remove C99 constructs to ensure C89 compliance - Closes #5065 + This fixes the error: 'for' loop initial declaration used outside C99 + mode by declaring the loop increment variable in the beginning of the + block instead of inside the for loop. + + Fixes #5254 + Reviewed-by: Daniel Gustafsson -- tests/server: fix missing use of exe_ext helper function +Daniel Stenberg (19 Apr 2020) +- runtests: dummy init the ports variables to avoid warnings - Follow up to 9819984 and 3dce984 - Reviewed-By: Daniel Stenberg - Closes #5064 + ... and generate something that can help debug test cases. -- runtests: log minimal and maximal used port numbers +- [Patrick Monnerat brought this change] + + mime: properly check Content-Type even if it has parameters + + New test 669 checks this fix is effective. + + Fixes #5256 + Closes #5258 + Reported-by: thanhchungbtc on github + +- tests/FILEFORMAT: converted to markdown and extended + + Closes #5261 + +- test1245: make it work with dynamic FTP server port + +- test1055: make it work with dynamic FTP port -Daniel Stenberg (9 Mar 2020) -- [James Fuller brought this change] +- test1028: make it run on dynamic FTP server port - sftp: fix segfault regression introduced by #4747 +- tests: move pingpong server to dynamic listening port - This fix adds a defensive check for the case where the char *name in - struct libssh2_knownhost is NULL + FTP, IMAP, POP3, SMTP and their IPv6 versions are now all on dynamic + ports - Fixes #5041 - Closes #5062 + Test 842-845 are unfortunately a bit hard to move over to this concept + right now and require "default port" still... -- RELEASE-NOTES: synced +- test1056: work with dynamic HTTP ipv6 port -- socks4: fix host resolve regression - - 1. The socks4 state machine was broken in the host resolving phase +- test1448: work with dynamic HTTP server port + +- tests: introduce preprocessed test cases - 2. The code now insists on IPv4-only when using SOCKS4 as the protocol - only supports that. + The runtests script now always performs variable replacement on the + entire test source file before the test gets executed, and saves the + updated version in a temporary file (log/test[num]) so that all test + case readers/servers can use that version (if present) and thus enjoy + the powers of test case variable substitution. - Regression from #4907 and 4a4b63d, shipped in 7.69.0 + This is necessary to allow complete port number freedom. - Reported-by: amishmm on github - Bug: https://github.com/curl/curl/issues/5053#issuecomment-596191594 - Closes #5061 + Test 309 is updated to work with a non-fixed port number thanks to this. -- [Patrick Monnerat brought this change] +- tests: make 2006-2010 handle different port number lengths - silly web server: silent a compilation warning +- tests: run the sws server on "any port" - Recent gcc warns when byte count of strncpy() equals the destination - buffer size. Since the destination buffer is previously cleared and - the source string is always shorter, reducing the byte count by one - silents the warning without affecting the result. + Makes the test servers for HTTP and Gopher pop up on a currently unused + port and runtests adapts to that! - Closes #5059 - -- [Patrick Monnerat brought this change] + Closes #5247 - cookie: get_top_domain() sets zero length for null domains +Marc Hoersken (18 Apr 2020) +- sockfilt: tidy variable naming and data structure in select_ws - This silents a compilation warning with gcc -O3. + This commit does not introduce any logical changes to the code. + + Reviewed-by: Jay Satiro and Marcel Raad + Closes #5238 -- [Patrick Monnerat brought this change] +Daniel Stenberg (17 Apr 2020) +- [Anderson Toshiyuki Sasaki brought this change] - test 1560: avoid valgrind false positives + libssh: Use new ECDSA key types to check known hosts - When using maximum code optimization level (-O3), valgrind wrongly - detects uses of uninitialized values in strcmp(). + From libssh 0.9.0, ssh_key_type() returns different key types for ECDSA + keys depending on the curve. - Preset buffers with all zeroes to avoid that. + Signed-off-by: Anderson Toshiyuki Sasaki + Fixes #5252 + Closes #5253 -Steve Holme (8 Mar 2020) -- sha256: Added WinCrypt implementation +Marcel Raad (17 Apr 2020) +- appveyor: add Unicode winbuild jobs - Closed #5030 - -- sha256: Added SecureTransport implementation + These are cheap as they don't build tests. + + Closes https://github.com/curl/curl/pull/5063 -Daniel Stenberg (7 Mar 2020) -- lib1564: reduce number of mid-wait wakeup calls +Daniel Stenberg (16 Apr 2020) +- mqttd: s/errno/SOCKERRNO - This test does A LOT of *wakeup() calls and then calls curl_multi_poll() - twice. The first *poll() is then expected to return early and the second - not - as the first is supposed to drain the socketpair pipe. + To behave proper on Windows + Reported-by: Gisle Vanem + Bug: https://github.com/curl/curl/commit/5e855bbd18f84a02c951be7cac6188276818cdac#r38507132 + Closes #5241 + +- buildconf: use find -execdir instead, remove -print and the ares files - It turns out however that when given "excessive" amounts of writes to - the pipe, some operating systems (the Solaris based are known) will - return EAGAIN before the pipe is drained, which in our test case causes - the second *poll() call to also abort early. + Follow-up to 1e41bec96a6e - This change attempts to avoid the OS-specific behaviors in the test by - reducing the amount of wakeup calls from 1234567 to 10. + Suggested-by: Marc Hörsken + +- [Alexander V. Tikhonov brought this change] + + buildconf: avoid using tempfile when removing files - Reported-by: Andy Fiddaman - Fixes #5037 - Closes #5058 + Closes #5213 -- [Patrick Monnerat brought this change] +- copyright: bump the copyright year range - mime: fix the binary encoder to handle large data properly +- scripts/release-notes.pl: accept colon after the Fixes/Closes keywords + +- [JP Mens brought this change] + + docs/MQTT: replace confusing 80 by 75 - New test 666 checks this is effective. - As upload buffer size is significant in this kind of tests, shorten it - in similar test 652. + I was a bit surprised by the `80`: first thought: what's HTTP doing + here? ;) - Fixes #4860 - Closes #4833 - Reported-by: RuurdBeerstra on github + Closes #5236 -- [Patrick Monnerat brought this change] +- [Brad King brought this change] - mime: do not perform more than one read in a row + cmake: Avoid MSVC C4273 warnings in send/recv checks - Input buffer filling may delay the data sending if data reads are slow. - To overcome this problem, file and callback data reads do not accumulate - in buffer anymore. All other data (memory data and mime framing) are - considered as fast and still concatenated in buffer. - As this may highly impact performance in terms of data overhead, an early - end of part data check is added to spare a read call. - When encoding a part's data, an encoder may require more bytes than made - available by a single read. In this case, the above rule does not apply - and reads are performed until the encoder is able to deliver some data. + We use `check_c_source_compiles` to check possible send/recv signatures + by reproducing the forward declarations from system headers. On Windows + the `winsock2.h` header adds dll linkage settings to its forward + declaration. If ours does not match the compiler warns: - Tests 643, 644, 645, 650 and 654 have been adapted to the output data - changes, with test data size reduced to avoid the boredom of long lists of - 1-byte chunks in verification data. - New test 667 checks mimepost using single-byte read callback with encoder. - New test 668 checks the end of part data early detection. + warning C4273: 'recv': inconsistent dll linkage - Fixes #4826 - Reported-by: MrdUkk on github - -- [Patrick Monnerat brought this change] + Add `WINSOCK_API_LINKAGE` to our test signatures when it is defined so + that our linkage is consistent with that from `winsock2.h`. + + Fixes #4764 + Closes #5232 - mime: latch last read callback status. +Jay Satiro (14 Apr 2020) +- KNOWN_BUGS: Add entry 'Blocking socket operations' - In case a read callback returns a status (pause, abort, eof, - error) instead of a byte count, drain the bytes read so far but - remember this status for further processing. - Takes care of not losing data when pausing, and properly resume a - paused mime structure when requested. - New tests 670-673 check unpausing cases, with easy or multi - interface and mime or form api. + - Add threaded resolver cleanup and GSSAPI for FTP to the TODO list of + known blocking operations. - Fixes #4813 - Reported-by: MrdUkk on github - -Marc Hoersken (7 Mar 2020) -- runtests: fix missing use of exe_ext helper function - -Daniel Stenberg (7 Mar 2020) -- [Ernst Sjöstrand brought this change] + - New known bugs entry 'Blocking socket operations in non-blocking API' + that directs to the TODO's list of known blocking operations. + + Ref: https://github.com/curl/curl/pull/5214#issuecomment-612488021 + + Reported-by: Marc Hoersken + + Closes https://github.com/curl/curl/pull/5216 - ares: store dns parameters for duphandle +Marc Hoersken (14 Apr 2020) +- test2043: use revoked.badssl.com instead of revoked.grc.com - With c-ares the dns parameters lives in ares_channel. Store them in the - curl handle and set them again in easy_duphandle. + The certificate of revoked.grc.com has expired on 2020-04-13. - Regression introduced in #3228 (6765e6d), shipped in curl 7.63.0. + Reviewed-by: Jay Satiro - Fixes #4893 - Closes #5020 - Signed-off-by: Ernst Sjöstrand + Closes #5233 -- version: make curl_version* thread-safe without using global context +- sockfilt: fix broken pipe on Windows to be ready in select_ws - Closes #5010 + Closes #5228 +Daniel Stenberg (14 Apr 2020) - RELEASE-NOTES: synced -Marc Hoersken (7 Mar 2020) -- tests: use native Sleep function as fallback on Windows - - Reviewed-By: Daniel Stenberg - Closes #5054 +- scripts/release-notes: fix duplicate output header -- perl: align order and completeness of Windows OS checks +- github/workflow: enable MQTT in the macOS debug build -Daniel Stenberg (7 Mar 2020) -- tool_cb_see: set correct copyright year range - - Follow-up to a39e5bfb9 +- azure: add mqtt support to one of the Windows builds -Marc Hoersken (7 Mar 2020) -- seek: fix fallback for missing ftruncate on Windows - - This fixes test 198 on versions of MinGW-w64 without ftruncate - - Reviewed-By: Daniel Stenberg - Reviewed-By: Marcel Raad - Closes #5055 +- travis: add mqtt job on Linux -- config-win32: Windows does not have ftruncate +- tests: add four MQTT tests 1190 - 1193 -Daniel Stenberg (7 Mar 2020) -- pause: force a connection (re-)check after unpausing +- tests: add the mqtt test server mqttd + +- tests: support hex encoded data and mqtt server - There might be data available that was already read off the socket, for - example in the TLS layer. + The mqtt server is started using a "random" port. + +- [Björn Stenberg brought this change] + + mqtt: add new experimental protocol - Reported-by: Anders Berg - Fixes #4966 - Closes #5049 + Closes #5173 -- socks5: switch state properly when the resolve is done +- TODO: Consider convenience options for JSON and XML? - Regression from 4a4b63d (and #4907) - Reported-by: vitaha85 on github - Fixes #5053 - Closes #5056 + Closes #5203 -Jay Satiro (7 Mar 2020) -- libssh: Fix matching user-specified MD5 hex key +- tool: do not declare functions with Curl_ prefix - Prior to this change a match would never be successful because it - was mistakenly coded to compare binary data from libssh to a - user-specified hex string (ie CURLOPT_SSH_HOST_PUBLIC_KEY_MD5). + To avoid collision risks with private libcurl symbols when linked with + static versions (or just versions not hiding internal symbols). - Reported-by: fds242@users.noreply.github.com + Reported-by: hydra3333 on github + Fixes #5219 + Closes #5234 + +- [Nathaniel R. Lewis brought this change] + + cmake: add aliases so exported target names are available in tree - Fixes https://github.com/curl/curl/issues/4971 - Closes https://github.com/curl/curl/pull/4974 + Reviewed-by: Brad King + Closes #5206 -Daniel Stenberg (6 Mar 2020) -- pause: bail out on bad input +- version: increase buffer space for ssl version output - A NULL easy handle or an easy handle without an associated connection - cannot be paused or unpaused. + To avoid it getting truncated, especially when several SSL backends are + built-in. - Closes #5050 + Reported-by: Gisle Vanem + Fixes #5222 + Closes #5226 -Steve Holme (6 Mar 2020) -- unit1612: fixed the inclusion and compilation of the HMAC unit test - - Follow up to 3f74e5e6 to fix: +Marc Hoersken (13 Apr 2020) +- cirrus: no longer ignore test 504 which is working again - - A typo in Makefile.inc where unit1611 was used instead - - Some compilation issues in unit1612.c + The test is working again, because TCP blackholing is disabled. + +- appveyor: completely disable tests that fail to timeout early - Closes #5024 + The tests changed from ignored to disabled are tests that are + about connecting to non-listening socket. On AppVeyor these + tests are not reliable, because for some unknown reason the + connect is not timing out before the test time limit is reached. -Daniel Stenberg (6 Mar 2020) -- pause: return early for calls that don't change pause state +Daniel Stenberg (13 Apr 2020) +- test1908: avoid using fixed port number in test data - Reviewed-by: Patrick Monnerat - Ref: #4833 - Closes #5026 + Closes #5225 -Jay Satiro (6 Mar 2020) -- curl_share_setopt.3: Note sharing cookies doesn't enable the engine +Jay Satiro (12 Apr 2020) +- [Andrew Kurushin brought this change] + + schannel: Fix blocking timeout logic - Follow-up to d0a7ee3 which fixed a bug in 7.66.0 that caused - CURL_LOCK_DATA_COOKIE to enable the easy handle's cookie engine. + - Fix schannel_send for the case when no timeout was set. - Bug: https://curl.haxx.se/mail/lib-2020-03/0019.html - Reported-by: Felipe Gasper + Prior to this change schannel would error if the socket was not ready + to send data and no timeout was set. - Closes https://github.com/curl/curl/pull/5048 + This commit is similar to parent commit 89dc6e0 which recently made the + same change for SOCKS, for the same reason. Basically it was not well + understood that when Curl_timeleft returns 0 it is not a timeout of 0 ms + but actually means no timeout. + + Fixes https://github.com/curl/curl/issues/5177 + Closes https://github.com/curl/curl/pull/5221 -- multi: skip EINTR check on wakeup socket if it was closed +- socks: Fix blocking timeout logic - - Don't check errno on wakeup socket if sread returned 0 since sread - doesn't set errno in that case. + - Document in Curl_timeleft's comment block that returning 0 signals no + timeout (ie there's infinite time left). - This is a follow-up to cf7760a from several days ago which fixed - Curl_multi_wait to stop busy looping sread on the non-blocking wakeup - socket if it was closed (ie sread returns 0). Due to a logic error it - was still possible to busy loop in that case if errno == EINTR. + - Fix SOCKS' Curl_blockread_all for the case when no timeout was set. - Closes https://github.com/curl/curl/pull/5047 + Prior to this change if the timeout had a value of 0 and that was passed + to SOCKET_READABLE it would return right away instead of blocking. That + was likely because it was not well understood that when Curl_timeleft + returns 0 it is not a timeout of 0 ms but actually means no timeout. + + Ref: https://github.com/curl/curl/pull/5214#issuecomment-612512360 + + Closes https://github.com/curl/curl/pull/5220 -Daniel Stenberg (6 Mar 2020) -- transfer: set correct copyright year range +- [Marc Hoersken brought this change] -- urldata: remove the 'stream_was_rewound' connectdata struct member + gopher: check remaining time left during write busy loop - ... as it is never set anywhere. + Prior to this change gopher's blocking code would block forever, + ignoring any set timeout value. - Follow-up to 2f44e94ef - Closes #5046 + Assisted-by: Jay Satiro + Reviewed-by: Daniel Stenberg + + Similar to #5220 and #5221 + Closes #5214 -- Revert "pause: force-drain the transfer on unpause" +Daniel Stenberg (13 Apr 2020) +- [Dirkjan Bussink brought this change] + + gnutls: ensure TLS 1.3 when SRP isn't requested - This reverts commit fa0216b294af4c7113a9040ca65eefc7fc18ac1c (from #5000) + When SRP is requested in the priority string, GnuTLS will disable + support for TLS 1.3. Before this change, curl would always add +SRP to + the priority list, effectively always disabling TLS 1.3 support. - Clearly that didn't solve the problem correctly. + With this change, +SRP is only added to the priority list when SRP + authentication is also requested. This also allows updating the error + handling here to not have to retry without SRP. This is because SRP is + only added when requested and in that case a retry is not needed. - Reported-by: Christopher Reid - Reopens #4966 - Fixes #5044 + Closes #5223 -- RELEASE-NOTES: synced +Marc Hoersken (12 Apr 2020) +- tests/server: add hidden window to gracefully handle WM_CLOSE - and bumped curlver.h + Forward Window events as signals to existing signal event handler. -- MANUAL: update a dict-using command line +- tests/server: add CTRL event handler for Win32 consoles - The 'web1913' database is now invalid, use 'gcide' instead. + Forward CTRL events as signals to existing signal event handler. -- KNOWN_BUGS: configure --with-gssapi with Heimdal is ignored on macOS +- tests/server: move all signal handling routines to util.[ch] - Closes #3841 + Avoid code duplication to prepare for portability enhancements. -- polarssl: remove more references and mentions +Daniel Stenberg (12 Apr 2020) +- compressed.d: stress that the headers are not modified + Suggested-by: Michael Osipov Assisted-by: Jay Satiro - Follow-up to 6357a19ff29dac04 - Closes #5036 - -Marc Hoersken (4 Mar 2020) -- tests: wrap ignored test failures in braces - -- tests: align some Windows sleep defines with each other + Bug: https://github.com/curl/curl/issues/5182#issuecomment-611638008 + Closes #5217 -- tests: try to make sleeping portable by avoiding select +Marc Hoersken (11 Apr 2020) +- tests/server/util.c: use curl_off_t instead of long for pid - select does not support just waiting on Windows: - https://perldoc.perl.org/perlport.html#select + Avoid potential overflow of huge PIDs on Windows. - Reviewed-By: Daniel Stenberg - Closes #5035 + Related to #5188 + Assisted-by: Marcel Raad -Daniel Stenberg (4 Mar 2020) -- runtests.1: rephrase how to specify what tests to run +- tests: use Cygwin/msys PIDs for stunnel and sshd on Windows - Also mention the new tilde-prefixed way to ignore test results. + Since the Windows versions of both programs would write Windows + PIDs to their pidfiles which we cannot handle, we need to use + our known perl.exe Cygwin/msys PID together with exec() in order + to tie the spawned processes to the existance of our perl.exe - Reviewed-By: Marc Hoersken - Closes #5033 + The perl.exe that is executing secureserver.pl and sshserver.pl + has a Cygwin/msys PID, because it is started inside Cygwin/msys. + + Related to #5188 -- cirrus-ci: disable the FreeBSD 13 builds +- tests: add Windows compatible pidwait like pidkill and pidterm - FreeBSD 13.0 is apparently close to a year away from a stable release - and has proven to cause intermittent builds failures recently. + Related to #5188 + +- tests: fix conflict between Cygwin/msys and Windows PIDs - Assisted-by: Dan Fandrich - Assisted-by: Fedor Korotkov - Fixes #5028 - Closes #5029 + Add 65536 to Windows PIDs to allow Windows specific treatment + by having disjunct ranges for Cygwin/msys and Windows PIDs. + + See also: + - https://cygwin.com/git/?p=newlib-cygwin.git;a=commit; ↵ + h=b5e1003722cb14235c4f166be72c09acdffc62ea + - https://cygwin.com/git/?p=newlib-cygwin.git;a=commit; ↵ + h=448cf5aa4b429d5a9cebf92a0da4ab4b5b6d23fe + + Replaces #5178 + Closes #5188 -Version 7.69.0 (4 Mar 2020) +Daniel Stenberg (11 Apr 2020) +- RELEASE-NOTES: synced -Daniel Stenberg (4 Mar 2020) -- RELEASE-NOTES: 7.69.0 +- release-notes.pl: detect the start of the references in cleanup mode -- THANKS: from 7.69.0 +- Revert "file: on Windows, refuse paths that start with \\" - Now sorted case insensitive - -Marc Hoersken (3 Mar 2020) -- ci/tests: fix escaping of testnames and disable proxy for CI APIs + This reverts commit 1b71bc532bde8621fd3260843f8197182a467ff2. - Follow up to ada581f and c0d8b96 - Closes #5031 - -Jay Satiro (3 Mar 2020) -- cmake: Show HTTPS-proxy in the features output + Reminded-by: Chris Roberts + Bug: https://curl.haxx.se/mail/archive-2020-04/0013.html - - Show HTTPS-proxy in the features output for those backends that - support it: OpenSSL, GnuTLS and NSS. + Closes #5215 + +Jay Satiro (11 Apr 2020) +- lib: fix conversion warnings for SOCKET_WRITABLE/READABLE - Prior to this change HTTPS-proxy was missing from the cmake features - output even if curl was built with it. Only cmake output was affected. - Both the library and tool correctly reported the feature. + - If loss of data may occur converting a timediff_t to time_t and + the time value is > TIME_T_MAX then treat it as TIME_T_MAX. - Bug: https://curl.haxx.se/mail/lib-2020-03/0008.html - Reported-by: David Lopes + This is a follow-up to 8843678 which removed the (time_t) typecast + from the macros so that conversion warnings could be identified. - Closes https://github.com/curl/curl/pull/5025 + Closes https://github.com/curl/curl/pull/5199 -Marc Hoersken (3 Mar 2020) -- ci/tests: Make it possible to still run but ignore failing tests +- test1148: tolerate progress updates better (again) - This enables the development of a solution for the failing tests by - running them on CI while ignoring their result for the overall status. + - Ignore intermediate progress updates. - Closes #4994 - -- README.md: add Azure DevOps Pipelines build status badge - -- ci/tests: Move CI test result creation above environment setup + - Support locales that use a character other than period as decimal + separator (eg 100,0%). - This avoids using our test servers as proxy to the AppVeyor API. + test1148 checks that the progress finishes at 100% and has the right + bar width. Prior to this change the test assumed that the only progress + reported for such a quick transfer was 100%, however in rare instances + (like in the CI where transfer time can slow considerably) there may be + intermediate updates. For example, below is stderrlog1148 from a failed + CI run with explicit \r and \n added (it is one line; broken up so that + it's easier to understand). + + \r + \r################################## 48.3% + \r######################################################################## 100.0% + \n - Closes #5022 + Closes https://github.com/curl/curl/pull/5194 -- ci/tests: Send test results to AppVeyor for status overview - - Closes #5021 +Marc Hoersken (10 Apr 2020) +- sshserver.pl: use cached Win32 environment check variable -Daniel Stenberg (3 Mar 2020) -- Revert "sha256: Added SecureTransport implementation" - - This reverts commit 4feb38deed33fed14ff7c370a6a9153c661dbb9c (from #4956) - - That commit broke test 1610 on macos builds without TLS. +- appveyor: partially revert 3413a110 to keep build without proxy - Closes #5027 + Ref: #5211 and #4526 + Reported-by: Marcel Raad -- dist: include tests/azure.pm in the tarball +- appveyor: ignore failing 'connect to non-listening proxy' tests - Bug: https://github.com/curl/curl/commit/ada581f2cc32f48c1629b729707ac19208435b27#commitcomment-37601589 - Reported-by: Marcel Raad + Closes #5211 -Steve Holme (3 Mar 2020) -- configure.ac: Disable metalink if mbedTLS is specified +- CI/macos: convert CRLF to LF and align indentation + +Daniel Stenberg (9 Apr 2020) +- url: allow non-HTTPS altsvc-matching for debug builds - Follow up to cdcc9df1 and #5006. Even though I mentioned mbedTLS as - being one of the backends that metalink needs to be disabled for, I - seem to have included it in the list of allowed SSL/TLS backends in - comnfigure.ac :( + This is already partly supported but this part was missing. + Reported-by: James Fuller - Closes #5013 + Closes #5205 -- sha256: Tidy up following recent changes +- server/resolve: remove AI_CANONNAME to make macos tell the truth - Reviewed-by: Daniel Stenberg - Closes #4956 + With this bit set, my mac successfully resolves "ip6-localhost" when in + fact there is no such host known to my machine! That in turn made test + 241 wrongly execute and fail. + + Closes #5202 -- sha256: Added WinCrypt implementation +- runtests: fix warning about using an undefined variable + + Follow-up from 4d939ef6ceb2db1 -- sha256: Added SecureTransport implementation +- release-notes: fix the initial reference list output -- sha256: Added mbedtls implementation +- github actions: run when pushed to master or */ci + PRs + + Avoid double-builds when using "local" branches for PRs. For both macos + and fuzz jobs. + + Closes #5201 -- sha256: Added GNU TLS gcrypt implementation +- runtests: provide nicer errormsg when protocol "dump" file is empty -- sha256: Added GNU TLS Nettle implementation +- [Gilles Vollant brought this change] -Jay Satiro (2 Mar 2020) -- curl_escape.3: Add a link to curl_free + schannel: support .P12 or .PFX client certificates - Ref: https://github.com/curl/curl/pull/5016#issuecomment-593628582 + Used with curl command line option like this: --cert + : --cert-type p12 + + Closes #5193 -- curl_getenv.3: Fix the memory handling description +- tests: verify split initial HTTP requests with CURL_SMALLREQSEND - - Tell the user to call curl_free() to free the pointer returned by - curl_getenv(). + test1294: "split request" being when the entire request isn't sent in + the first go, and the remainder is sent in the PERFORM state. A GET + request is otherwise not sending anything during PERFORM. - Prior to this change the user was directed to call free(), but that - would not work in cases where the library and application use separate C - runtimes and therefore have separate heap memory management. + test1295: same kind of split but with POST - Closes https://github.com/curl/curl/pull/5016 - -Daniel Stenberg (2 Mar 2020) -- [Nick Zitzmann brought this change] + Closes #5197 - md4: use init/update/final functions in Secure Transport - - We can use CC_MD4_Init/Update/Final without having to allocate memory - directly. +- http: don't consider upload done if the request isn't completely sent off - Closes #4979 + Fixes #4919 + Closes #5197 -Marc Hoersken (2 Mar 2020) -- ci/tests: some MacOS builds randomly take longer than 20min +- http: allow Curl_add_buffer_send() to do a short first send by force + + In a debug build, settting the environment variable "CURL_SMALLREQSEND" + will make the first HTTP request send not send more bytes than the set + amount, thus ending up verifying that the logic for handling a split + HTTP request send works correctly. -Daniel Stenberg (2 Mar 2020) -- multi_wait: stop loop when sread() returns zero +- connect: store connection info for QUIC connections - It's unclear why it would ever return zero here, but this change fixes - Robert's problem and it shouldn't loop forever... + Restores the --head functionality to the curl utility which extracts + 'protocol' that is stored that way. - Reported-by: Robert Dunaj - Bug: https://curl.haxx.se/mail/archive-2020-02/0011.html - Closes #5019 + Reported-by: James Fuller + Fixes #5196 + Closes #5198 -- http: mark POSTs with no body as "upload done" from the start - - As we have logic that checks if we get a >= 400 reponse code back before - the upload is done, which then got confused since it wasn't "done" but - yet there was no data to send! +- tests/README: update the port numbers list - Reported-by: IvanoG on github - Fixes #4996 - Closes #5002 + Since the pipelining server is long gone. + Reported-by: James Fuller -- tests: disable 962, 963 and 964 on Windows +- select: remove typecast from SOCKET_WRITABLE/READABLE macros - These tests are also doing UTF-8 SMTP. + So that they don't hide conversions-by-mistake - Follow-up to df207d2dd93b9e73 - -Marc Hoersken (2 Mar 2020) -- ci/tests: fine-tune Azure Pipeline timeouts with a small puffer + Reviewed-by: Jay Satiro + Closes #5190 -Daniel Stenberg (2 Mar 2020) -- configure: bump the AC_COPYRIGHT year range +- CURLOPT_WRITEFUNCTION.3: add inline example and new see-also + + Closes #5192 -- [Steve Holme brought this change] +- release-notes: output trailing references sorted numerically - tests: disable SMTP UTF-8 tests on Windows - - Fixes #4988 - Closes #4992 +- cleanup: correct copyright year range on a few files -- formdata/mime: copyright year range update +- configure: remove use of -vec-report0 from CFLAGS with icc - Due to the merge/revert cycle + ... as it apparently isn't (always) supported. + Reported-by: Alain Miniussi + Fixes #5096 + Closes #5191 -- Revert "mime: latch last read callback status." - - This reverts commit 87869e38d7afdec3ef1bb4965711458b088e254f. +- warnless: remove code block for icc that didn't work - Fixes #5014 - Closes #5015 - Reopens #4833 + Reported-by: Alain Miniussi + Fixes #5096 -- Revert "mime: do not perform more than one read in a row" +Marc Hoersken (6 Apr 2020) +- dist: add missing setup-win32.h - This reverts commit ed0f357f7d25566110d4302f33759f4ffb5a6f83. + Follow up to d820224b8b -- Revert "mime: fix the binary encoder to handle large data properly" - - This reverts commit b2caaa0681f329eed317ffb6ae6927f4a539f0c1. +Daniel Stenberg (6 Apr 2020) +- RELEASE-NOTES: synced -- altsvc: both h3 backends now speak h3-27 +- scripts/release-notes.pl: add helper script for RELEASE-NOTES maintenance - ... also updated the HTTP3 build description for ngtcp2 accordingly. + This script helps putting entries in the RELEASE-NOTES using a coherent + style and sorting with a minimal human editing effort - as long as the + first line in the commit message is good enough! There's a short howto + at the top of the file. -- [Patrick Monnerat brought this change] +- [Dennis Felsing brought this change] - mime: fix the binary encoder to handle large data properly + configure: don't check for Security.framework when cross-compiling - New test 666 checks this is effective. - As upload buffer size is significant in this kind of tests, shorten it - in similar test 652. + Since it checks for the local file, not the cross-compiled one. - Fixes #4860 - Reported-by: RuurdBeerstra on github + Closes #5189 -- [Patrick Monnerat brought this change] +- TODO: Option to make -Z merge lined based outputs on stdout + + Closes #5175 - mime: do not perform more than one read in a row +- lib: never define CURL_CA_BUNDLE with a getenv - Input buffer filling may delay the data sending if data reads are slow. - To overcome this problem, file and callback data reads do not accumulate - in buffer anymore. All other data (memory data and mime framing) are - considered as fast and still concatenated in buffer. - As this may highly impact performance in terms of data overhead, an early - end of part data check is added to spare a read call. - When encoding a part's data, an encoder may require more bytes than made - available by a single read. In this case, the above rule does not apply - and reads are performed until the encoder is able to deliver some data. + - it breaks the build (since 6de756c9b1de34b7a1) + - it's not documented and not consistent across platforms + - the curl tool does that getenv magic - Tests 643, 644, 645, 650 and 654 have been adapted to the output data - changes, with test data size reduced to avoid the boredom of long lists of - 1-byte chunks in verification data. - New test 664 checks mimepost using single-byte read callback with encoder. - New test 665 checks the end of part data early detection. + Bug: https://github.com/curl/curl/commit/6de756c#r38127030 + Reported-by: Gisle Vanem - Fixes #4826 - Reported-by: MrdUkk on github - -- [Patrick Monnerat brought this change] + Closes #5187 - mime: latch last read callback status. - - In case a read callback returns a status (pause, abort, eof, - error) instead of a byte count, drain the bytes read so far but - remember this status for further processing. - Takes care of not losing data when pausing, and properly resume a - paused mime structure when requested. - New tests 670-673 check unpausing cases, with easy or multi - interface and mime or form api. - - Fixes #4813 - Reported-by: MrdUkk on github - Closes #4833 +Marc Hoersken (5 Apr 2020) +- lib670: use the same Win32 API check as all other lib tests -Steve Holme (1 Mar 2020) -- unit1651: Fixed conversion compilation warning +- appveyor: use random test server ports based upon APPVEYOR_API_URL - 371:17: warning: conversion to 'unsigned char' from 'int' may alter its - value [-Wconversion] + Avoid conflicts of test server ports with AppVeyor API on localhost. - Closes #5008 + Closes #5034 -- configure.ac: Disable metalink support if an incompatible SSL/TLS specified - - tool_metalink only supports cryptography from OpenSSL, GnuTLS, NSS, - The Win32 Crypto library and Apple's Common Crypto library. - - If an TLS backend such as mbedTLS or WolfSSL is specified then the - following error is given during compilation along, with a load of - unresolved extern errors: - - Can't compile METALINK support without a crypto library. +- appveyor: sort builds by type and add two new variants - Reviewed-by: Daniel Stenberg - Closes #5006 + Related to #5034 and #5063 -Marc Hoersken (1 Mar 2020) -- ci/tests: Update Azure DevOps pipeline job display names +- appveyor: show failed tests in log even if test is ignored - Make the configure step more descriptive and align others. + And print API response with newline only if there is one -- ci/tests: Fix typo in previous commit 597cf2 +- appveyor: turn disabled tests into ignored result tests -- ci/tests: Make sure that the AZURE_ACCESS_TOKEN is available +Daniel Stenberg (5 Apr 2020) +- KNOWN_BUGS: fixed "USE_UNIX_SOCKETS on Windows" - For security reasons the access token is not available to PR builds. - Therefore we should not try to use the DevOps API with an empty token. + Fixed with #5170 (commit 23a870f2fd041278) -Daniel Stenberg (1 Mar 2020) -- build: remove all HAVE_OPENSSL_ENGINE_H defines +- test1566: verify --etag-compare that gets a 304 back - ... as there's nothing in the code that actually uses the define! The - last reference was removed in 38203f158. + Verifies the fix in #5183 - Closes #5007 + Closes #5186 -Jay Satiro (29 Feb 2020) -- [Rolf Eike Beer brought this change] +- [Kwon-Young Choi brought this change] - CMake: clean up and improve build procedures - - - remove check for unsupported old CMake versions - - - do not link to c-ares library twice - - - modernize custom Find modules - - - FindLibSSH2: - - pass version to FPHSA to show it in the output - - use LIBSSH2_VERSION define to extract the version number in - one shot. This variable exists in the header for 10 years. - - remove unneeded code + CURLINFO_CONDITION_UNMET: return true for 304 http status code - - FindNGHTTP2.cmake: - - drop needless FPHSA argument - - mark found variables as advanced + In libcurl, CURLINFO_CONDITION_UNMET is used to avoid writing to the + output file if the server did not transfered a file based on time + condition. In the same manner, getting a 304 HTTP response back from the + server, for example after passing a custom If-Match-* header, also + fulfill this condition. - - FindNSS.cmake: - - show version number + Fixes #5181 + Closes #5183 + +- [Kwon-Young Choi brought this change] + + curl: allow both --etag-compare and --etag-save with same file name - - FindCARES.cmake: - - drop default paths - - use FPHSA instead of checking things by hand + This change inverse the order of processing for the --etag-compare and + --etag-save option to process first --etag-compare. This in turn allows + to use the same file name to compare and save an etag. - - remove needless explict variable dereference + The original behavior of not failing if the etag file does not exists is + conserved. - - simplify count_true() + Fixes #5179 + Closes #5180 + +Viktor Szakats (4 Apr 2020) +- windows: enable UnixSockets with all build toolchains - - allow all policies up to version 3.16 to be set to NEW + Extend existing unix socket support in Windows builds to be + enabled for all toolchain vendors or versions. (Previously + it was only supported with certain MSVC versions + more recent + Windows 10 SDKs) - - do not rerun check for -Wstrict-aliasing=3 every time + Ref: https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/ + Ref: https://github.com/curl/curl/issues/5162 + Closes: https://github.com/curl/curl/pull/5170 + +Daniel Stenberg (4 Apr 2020) +- KNOWN_BUGS: Store TLS context per transfer instead of per connection - In contrast to every other compiler flag this has a = in it, which CMake - can't have in a variable name. + Closes #5102 + +Marc Hoersken (3 Apr 2020) +- sockfilt: remove redundancy in timeout handling - - only read the interesting strings from curlver.h + And update other logmsg output in select_ws on Windows. + +- sockfilt: fix handling of ready closed sockets on Windows - Reviewed-by: Peter Wu + Replace the incomplete workaround regarding FD_CLOSE + only signalling once by instead doing a pre-check with + standard select and storing the result for later use. - Closes https://github.com/curl/curl/pull/4975 + select keeps triggering on closed sockets on Windows while + WSAEventSelect fires only once with data still available. + By doing the pre-check we do not run in a deadlock + due to waiting forever for another FD_CLOSE event. -- runtests: fix output to command log +- sockfilt: fix race-condition of waiting threads and event handling - - Record only the command of the most recently ran test in the command - log. + Fix race-condition of waiting threads finishing while events are + already being processed which lead to invalid or skipped events. - This is a follow-up to 02988b7 from several weeks ago which fixed - writing to the command log, however it saved all commands for all tests - instead of just the most recently ran test as we would now expect. + Use mutex to check for one event at a time or do post-processing. + In addition to mutex-based locking use specific event as signal. - Fixes https://github.com/curl/curl/commit/02988b7#commitcomment-37546876 - Closes https://github.com/curl/curl/pull/5001 + Closes #5156 -Steve Holme (1 Mar 2020) -- polarssl: Additional removal +Daniel Stenberg (2 Apr 2020) +- [Leo Neat brought this change] + + CI-fuzz: increase fuzz time to 40 minutes - Follow up to 6357a19f. + Closes #5174 + +Marc Hoersken (2 Apr 2020) +- CI: increase Azure Pipelines timeouts due to performance issues - Reviewed-by: Daniel Stenberg - Closes #5004 + The current demand on Azure negatively impacts the CI performance. -- [Jonathan Cardoso Machado brought this change] +- runtests.pl: log host OS as detected by Perl environment - docs: fix typo on CURLINFO_RETRY_AFTER - alwaus -> always - - Reviewed-by: Steve Holme - Closes #5005 +- ftpserver.pl: log before and after data connection is closed -- md5: Added implementation for mbedTLS - - Reviewed-by: Jay Satiro - Closes #4980 +Daniel Stenberg (1 Apr 2020) +- RELEASE-NOTES: synced -- md5: Use pointer notation for array parameters in GnuTLS implementation +- RELEASE-PROCEDURE.md: run the copyright.pl script! -- md4: Use non-deprecated functions in mbedTLS >= 2.7.0 +- vquic/ngtcp2.h: update copyright year range - Closes #4983 + Follow-up to 0736ee73d346a52 -Marc Hoersken (29 Feb 2020) -- ci/tests: Send test results to Azure DevOps for reporting +- [Daiki Ueno brought this change] -Daniel Stenberg (29 Feb 2020) -- pause: force-drain the transfer on unpause - - ... since the socket might not actually be readable anymore when for - example the data is already buffered in the TLS layer. - - Fixes #4966 - Reported-by: Anders Berg - Closes #5000 + CI: add build with ngtcp2 + gnutls on Travis CI -- TODO: curl --proxycommand - - Suggested-by: Kristian Mide - Closes #4941 +- [Daiki Ueno brought this change] -- smtp: overwriting 'from' leaks memory - - Detected by Coverity. CID 1418139. + vquic: add support for GnuTLS backend of ngtcp2 - Also, make sure to return error if the new 'from' allocation fails. + Currently, the TLS backend used by vquic/ngtcp2.c is selected at compile + time. Therefore OpenSSL support needs to be explicitly disabled. - Closes #4997 + Signed-off-by: Daiki Ueno + Closes #5148 -- CIfuzz: switch off 'dry_run' mode - - Follow-up from #4960: now make it fail if it detects problems. - - Closes #4998 +- [Gisle Vanem brought this change] -Marc Hoersken (28 Feb 2020) -- ci/tests: Increase timeouts of Windows builds due to new tests + examples/sessioninfo.c: add include to fix compiler warning - Recently added tests increased their runtime above the limit of 60min. - -- ci/tests: align Azure Pipeline job names with each other + Fixes #5171 -- ci/tests: Add Windows builds via Azure Pipelines using Docker +- misc: copyright year updates + + Follow-up to 7a71965e9 -- tests: fix Python 3 compatibility of smbserver.py +- [Harry Sintonen brought this change] -Daniel Stenberg (27 Feb 2020) -- runtests: restore the command log - - The log file with all command lines for the invoked command lines is now - called logs/commands.log + build: fixed build for systems with select() in unistd.h - Fixes #4911 - Closes #4989 + Closes #5169 -- smtp: fix memory leak on exit path - - Detected by Coverity. CID 1418139. "leaked_storage: Variable 'from' - going out of scope leaks the storage it points to" +- memdebug: don't log free(NULL) - Closes #4990 + ... it serves no purpose and fills up the log. -Steve Holme (27 Feb 2020) -- gtls: Fixed compilation when using GnuTLS < 3.5.0 +- cleanup: insert newline after if() conditions - Reverts the functionality from 41fcb4f when compiling with GnuTLS older - than 3.5.0. + Our code style mandates we put the conditional block on a separate + line. These mistakes are now detected by the updated checksrc. + +- checksrc: warn on obvious conditional blocks on the same line as if() - Reviewed-by: Daniel Stenberg - Closes #4984 + Closes #5164 -- RELEASE-NOTES: Corrected the link to issue #4892 +- [Roger Orr brought this change] -Daniel Stenberg (27 Feb 2020) -- Curl_is_ASCII_name: handle a NULL argument - - Make the function tolerate a NULL pointer input to avoid dereferencing - that pointer. + cmake: add CMAKE_MSVC_RUNTIME_LIBRARY - Follow-up to efce3ea5a85126d - Detected by OSS-Fuzz - Reviewed-By: Steve Holme - Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=20907 - Fixes #4985 - Closes #4986 + Fixes #5165 + Closes #5167 -- RELEASE-NOTES: synced +- [Daiki Ueno brought this change] -- http2: make pausing/unpausing set/clear local stream window + ngtcp2: update to git master for the key installation API change - This reduces the HTTP/2 window size to 32 MB since libcurl might have to - buffer up to this amount of data in memory and yet we don't want it set - lower to potentially impact tranfer performance on high speed networks. + This updates the ngtcp2 OpenSSL backend to follow the API change in + commit 32e703164 of ngtcp2. - Requires nghttp2 commit b3f85e2daa629 - (https://github.com/nghttp2/nghttp2/pull/1444) to work properly, to end - up in the next release after 1.40.0. + Notable changes are: + - ngtcp2_crypto_derive_and_install_{rx,tx}_key have been added to replace + ngtcp2_crypto_derive_and_install_key + - the 'side' argument of ngtcp2_crypto_derive_and_install_initial_key + has been removed - Fixes #4939 - Closes #4940 + Fixes #5166 + Closes #5168 -- [Anderson Toshiyuki Sasaki brought this change] +- [Cyrus brought this change] - libssh: improve known hosts handling - - Previously, it was not possible to get a known hosts file entry due to - the lack of an API. ssh_session_get_known_hosts_entry(), introduced in - libssh-0.9.0, allows libcurl to obtain such information and behave the - same as when compiled with libssh2. + SECURITY.md: minor rephrase - This also tries to avoid the usage of deprecated functions when the - replacements are available. The behaviour will not change if versions - older than libssh-0.8.0 are used. + Closes #5158 + +- output.d: quote the URL when globbing - Signed-off-by: Anderson Toshiyuki Sasaki + Some shells do globbing of their own unless the URL is quoted, so maybe + encourage this. - Fixes #4953 - Closes #4962 + Co-authored-by: Jay Satiro + Closes #5160 -Steve Holme (27 Feb 2020) -- tests: Automatically deduce the tool name from the test case for unit tests - - It is still possible to override the executable to run during the test, - using the tag, but this patch removes the requirement that the - tag must be present for unit tests. +- dist: add tests/version-scan.pl to tarball - It also removes the possibility of human error when existing test cases - are used as the basis for new tests, as recently witnessed in 81c37124. + ... used in test 1177. - Reviewed-by: Daniel Stenberg - Closes #4976 + Follow-up to a97d826f6de3 -- test1323: Added the missing 'unit test' feature requirement in the test case +- test1177: verify that all the CURL_VERSION_ bits are documented -Daniel Stenberg (26 Feb 2020) -- cookie: remove unnecessary check for 'out != 0' +- curl.h: remnove CURL_VERSION_ESNI. Never supported nor documented - ... as it will always be non-NULL at this point. + Considered experimental and therefore we can do this. - Detected by Coverity: CID 1459009 + Closes #5157 -- http: added 417 response treatment - - When doing a request with a body + Expect: 100-continue and the server - responds with a 417, the same request will be retried immediately - without the Expect: header. - - Added test 357 to verify. - - Also added a control instruction to tell the sws test server to not read - the request body if Expect: is present, which the new test 357 uses. +- KNOWN_BUGS: DoH doesn't inherit all transfer options - Reported-by: bramus on github - Fixes #4949 - Closes #4964 + Closes #4578 + Closes #4579 -Steve Holme (26 Feb 2020) -- smtp: Tidy up, following recent changes, to maintain the coding style +- KNOWN_BUGS: DoH leaks memory after followlocation - Closes #4892 + Closes #4592 -- smtp: Support the SMTPUTF8 extension for the EXPN command +- KNOWN_BUGS: "FTPS needs session reuse" - Simply notify the server we support the SMTPUTF8 extension if it does. + Closes #4654 -- smtp: Support the SMTPUTF8 extension in the VRFY command +- KNOWN_BUGS: "stick to same family over SOCKS pro" is presumed fixed -- smtp: Support the SMTPUTF8 extension in the RCPT TO command +- TODO: Set custom client ip when using haproxy protocol - Note: The RCPT TO command isn't required to advertise to the server that - it contains UTF-8 characters, instead the server is told that a mail may - contain UTF-8 in any envelope command via the MAIL command. + Closes #5125 -- smtp: Support the SMTPUTF8 extension in the MAIL command +Michael Kaufmann (27 Mar 2020) +- writeout_json: Fix data type issues + + Load long values correctly (e.g. for http_code). + + Use curl_off_t (not long) for: + - size_download (CURLINFO_SIZE_DOWNLOAD_T) + - size_upload (CURLINFO_SIZE_UPLOAD_T) - Support the SMTPUTF8 extension when sending mailbox information in the - MAIL command (FROM and AUTH parameters). Non-ASCII domain names will - be ACE encoded, if IDN is supported, whilst non-ASCII characters in - the local address part are passed to the server. + The unit for these values is bytes/second, not microseconds: + - speed_download (CURLINFO_SPEED_DOWNLOAD_T) + - speed_upload (CURLINFO_SPEED_UPLOAD_T) - Reported-by: ygthien on github - Fixes #4828 + Fixes #5131 + Closes #5152 -- smtp: Detect server support for the UTF-8 extension as defined in RFC-6531 +Daniel Stenberg (27 Mar 2020) +- mailmap: fixup a few author names/fields + + Douglas Steinwand, Gökhan Şengün, Jessa Chandler, Julian Z and + Svyatoslav Mishyn -- smtp: Support UTF-8 based host names in the VRFY command +- version: add 'cainfo' and 'capath' to version info struct + + Suggested-by: Timothe Litt + URL: https://curl.haxx.se/mail/lib-2020-03/0090.html + Reviewed-by: Jay Satiro + + Closes #5150 -- smtp: Support UTF-8 based host names in the RCPT TO command +- RELEASE-NOTES: synced -- smtp: Support UTF-8 based host names in the MAIL command +Jay Satiro (26 Mar 2020) +- SSLCERTS.md: Fix example code for setting CA cert file - Non-ASCII host names will be ACE encoded if IDN is supported. - -- url: Make the IDN conversion functions available to others + Prior to this change the documentation erroneously said use + CURLOPT_CAPATH to set a CA cert file. + + Bug: https://curl.haxx.se/mail/lib-2020-03/0121.html + Reported-by: Timothe Litt + + Closes https://github.com/curl/curl/pull/5151 -- smtp: Added UTF-8 mailbox tests to verify existing behaviour +Marc Hoersken (26 Mar 2020) +- sockfilt: add logmsg output to select_ws_wait_thread on Windows + + Assisted-by: Jay Satiro + Reviewed-by: Daniel Stenberg + + Closes #5086 -- ftpserver: Updated VRFY_smtp() so the response isn't necessary in the test case +Daniel Stenberg (26 Mar 2020) +- docs/make: generate curl.1 from listed files only + + Previously it rendered the page from files matching "*.d" in the correct + directory, which worked fine in git builds when the files were added but + made it easy to forget adding the files to the dist. + + Now, only man page sections listed in DPAGES in Makefile.inc will be + used, thus "forcing" us to update this to get the man page right and get + it included in the dist at the same time. + + Ref: #5146 + Closes #5149 -- ftpserver: Corrected the e-mail address regex in MAIL_smtp() and RCTP_smtp() +- openssl: adapt to functions marked as deprecated since version 3 - The dot character between the host and the tld was not being escaped, - which meant it specified a match of 'any' character rather than an - explicit dot separator. + OpenSSL 3 deprecates SSL_CTX_load_verify_locations and the MD4, DES + functions we use. - Additionally removed the dot character from the host name as it allowed - the following to be specified as a valid address in our test cases: + Fix the MD4 and SSL_CTX_load_verify_locations warnings. - + In configure, detect OpenSSL v3 and if so, inhibit the deprecation + warnings. OpenSSL v3 deprecates the DES functions we use for NTLM and + until we rewrite the code to use non-deprecated functions we better + ignore these warnings as they don't help us. - Both are typos from 98f7ca7 and 8880f84 :( + Closes #5139 + +- dist: add mail-rcpt-allowfails.d to the tarball - I can't remember whether my intention was to allow sub-domains to be - specified in the host or not with these additional dots, but by placing - it outside of the host means it can only be specified once per domain - and by placing a + after the new grouping support for sub-domains is - kept. + Reported-by: Maksim Stsepanenka + Reviewed-by: Jat Satiro - Closes #4912 + Closes #5146 -- hmac: Added a unit test for the HMAC hash generation +- travis: update the ngtcp2 build to use the latest OpenSSL patch - Closes #4973 - -- ntlm: Moved the HMAC MD5 function into the HMAC module as a generic function + ... which also makes it OpenSSL 1.1.1d based and not v3. -- tests: Added a unit test for MD4 digest generation +Marc Hoersken (24 Mar 2020) +- CI: remove default Ubuntu build from GitHub Actions - Closes #4970 + We are already running a very similar Ubuntu build on Travis CI. + The macOS variant of this default build is kept on Github Actions. -- md4: Use const for the length input parameter +- CI: bring GitHub Actions fuzzing job in line with macOS jobs - This keeps the interface the same as md5 and sha256. + Update YAML formatting, job naming and triggers. -- test1610: Fixed the link to the unit test +- CI: migrate macOS jobs from Azure and Travis CI to GitHub Actions - Typo from 81c37124. - -- ntlm: Removed the dependency on the TLS libaries when using MD5 + Reduce workload on Azure Pipelines and Travis CI while + consolidating macOS jobs onto less utilized GitHub Actions. - As we have our own MD5 implementation use the MD5 wrapper to remove the - TLS dependency. + Reviewed-by: Daniel Stenberg - Closes #4967 - -- md5/sha256: Updated the functions to allow non-string data to be hashed + Closes #5124 -- digest: Corrected the name of the local HTTP digest function +Daniel Stenberg (24 Mar 2020) +- config: remove all defines of HAVE_DES_H + + As there's no code using it. - Follow up to 2b5b37cb. Local static functions do not require the Curl - prefix. + Closes #5144 -- tests: Added a unit test for SHA256 digest generation +- copyright: fix out-of-date copyright ranges and missing headers + + Reported by the new script 'scripts/copyright.pl'. The script has a + regex whitelist for the files that don't need copyright headers. - Follow up to 2b5b37c. + Removed three (mostly usesless) README files from docs/ - Closes #4968 + Closes #5141 -- md4: Fixed compilation issues when using GNU TLS gcrypt +- packages: add OS400/chkstrings.c to the dist - * Don't include 'struct' in the gcrypt MD4_CTX typedef - * The call to gcry_md_read() should use a dereferenced ctx - * The call to gcry_md_close() should use a dereferenced ctx + Reported-by: Jon Rumsey + Fixes #5142 + Closes #5143 + +- [Clément Notin brought this change] + + nghttp2: 1.12.0 required - Additional minor whitespace issue in the USE_WIN32_CRYPTO code. + since nghttp2_session_set_local_window_size is needed - Closes #4959 + Closes #5140 -Daniel Stenberg (21 Feb 2020) - RELEASE-NOTES: synced -- http2: now require nghttp2 >= 1.12.0 - - To simplify our code and since earlier versions lack important function - calls libcurl needs to function correctly. - - nghttp2 1.12.0 was relased on June 26, 2016. - - Closes #4961 +- [Calvin Buckley brought this change] -- gtls: fix the copyright year + OS400: Update strings for ccsid-ifier - Follow-up from 41fcb4f609 - -- [jethrogb brought this change] + Fixes build. + + Closes #5132 - GnuTLS: Always send client cert +- cirrus: make freebsd ignore the tests instead of skipping - TLS servers may request a certificate from the client. This request - includes a list of 0 or more acceptable issuer DNs. The client may use - this list to determine which certificate to send. GnuTLS's default - behavior is to not send a client certificate if there is no - match. However, OpenSSL's default behavior is to send the configured - certificate. The `GNUTLS_FORCE_CLIENT_CERT` flag mimics OpenSSL - behavior. + To allow us to see in the CI logs how they actually behave - Authored-by: jethrogb on github - Fixes #1411 - Closes #4958 + Closes #5091 -- [Leo Neat brought this change] +- cirrus: move the sanitizer build from freebsd 13 to freebsd 12 - github action: add CIFuzz +- Revert "cirrus-ci: disable the FreeBSD 13 builds" - Closes #4960 + This reverts commit 691b71be930f0e285c8f7a76efd56bbe0576cda6. -- cleanup: comment typos +- getinfo: provide CURLINFO_HEADER_SIZE and CURLINFO_REQUEST_SIZE override - Spotted by 'codespell' + To let debug-builds return fake values, like in test 970. - Closes #4957 + Ref: #5131 + Closes #5136 -Steve Holme (20 Feb 2020) -- win32: USE_WIN32_CRYPTO to enable Win32 based MD4, MD5 and SHA256 functions +- test970: improve the test - Whilst lib\md4.c used this pre-processor, lib\md5.c and - src\tool_metalink.c did not and simply relied on the WIN32 - pre-processor directive. + - send more data to make problems more obvious + - don't start the data with minus, it makes diffs harder to read + - skip the headers in the stdout comparison + - save to a file name to also verify 'filename_effective' - Reviewed-by: Marcel Raad - Closes #4955 + Ref: #5131 -Daniel Stenberg (19 Feb 2020) -- connect: remove some spurious infof() calls +- CURLINFO_NUM_CONNECTS: improve accuracy - As they were added primarily for debugging, they provide little use for - users. + The counter was not bumped in all cases correctly. - Closes #4951 + Reported-by: Marcel Raad + Ref: #5131 + Closes #5135 -- HTTP-COOKIES: mention that a trailing newline is required - - ... so that we know we got the whole and not a partial line. - - Also, changed the formatting of the fields away from a table again since - the table format requires a github-markdown tool version that we don't - run on the web server atm. - - Reported-by: Sunny Bean - Fixes #4946 - Closes #4947 +- TODO: Use "random" ports for the test servers -- nit: Copyright year out of date +- lib/curl_setup: adjust the copyright year range - Follow-up to 1fc0617dcc + Follow-up from d820224b8 -Jay Satiro (18 Feb 2020) -- tool_util: Improve Windows version of tvnow() - - - Change tool_util.c tvnow() for Windows to match more closely to - timeval.c Curl_now(). - - - Create a win32 init function for the tool, since some initialization - is required for the tvnow() changes. +Jay Satiro (21 Mar 2020) +- curl_setup: define _WIN32_WINNT_[OS] symbols - Prior to this change the monotonic time function used by curl in Windows - was determined at build-time and not runtime. That was a problem because - when curl was built targeted for compatibility with old versions of - Windows (eg _WIN32_WINNT < 0x0600) it would use GetTickCount which wraps - every 49.7 days that Windows has been running. + .. because not all Windows build systems have those symbols, and even + those that do may be missing newer symbols (eg the Windows 7 SDK does + not define _WIN32_WINNT_WIN10). - This change makes curl behave similar to libcurl's tvnow function, which - determines at runtime whether the OS is Vista+ and if so calls - QueryPerformanceCounter instead. (Note QueryPerformanceCounter is used - because it has higher resolution than the more obvious candidate - GetTickCount64). The changes to tvnow are basically a copy and paste but - the types in some cases are different. + Those symbols are used in build-time logic to decide which API to use + and prior to this change if the symbols were missing it would have + resulted in deprecated API being used when more recent functions were + available (eg GetVersionEx used instead of VerifyVersionInfo). - Ref: https://github.com/curl/curl/issues/3309 + Reported-by: FuccDucc@users.noreply.github.com - Closes https://github.com/curl/curl/pull/4847 + Probably fixes https://github.com/curl/curl/issues/4995 + Closes https://github.com/curl/curl/pull/5057 -Daniel Stenberg (18 Feb 2020) -- SOCKS: fix typo in printf formatting - - Follow-up to 4a4b63daa - - Reported-by: Peter Piekarski - Bug: https://github.com/curl/curl/commit/4a4b63daaa01ef59b131d91e8e6e6dfe275c0f08#r37351330 +- [Ross Burton brought this change] -- CURLOPT_REDIR_PROTOCOLS.3: update the DEFAULT section + curl-functions.m4: remove inappropriate AC_REQUIRE + + AC_REQUIRE means "if this macro hasn't been executed already, execute + it". So in a wrapper around AC_RUN_IFELSE, AC_REQUIRE(AC_RUN_IFELSE) + isn't correct at that will execute AC_RUN_IFELSE without any arguments. - to be in sync with the description above + With autoconf 2.69 this is basically a no-op, but with autoconf 2.70, + AC_RUN_IFELSE without a default value when cross-compiling is fatal. + The result is that curl with autoconf 2.70 cannot cross-compile. - Reported-by: Joonas Kuorilehto - Fixes #4943 - Closes #4945 - -- docs/GOVERNANCE: refreshed + added "donations" and "commercial support" + Fixes https://github.com/curl/curl/issues/5126 + Closes https://github.com/curl/curl/pull/5130 -- altsvc: make saving the cache an atomic operation +Marc Hoersken (20 Mar 2020) +- ci/tests: fix Azure Pipelines not running Windows containers - ... by writing the file to temp name then rename to the final when done. + Workaround posted here: microsoft/azure-pipelines-agent#2864 - Assisted-by: Jay Satiro - Fixes #4936 - Closes #4942 - -- rename: a new file for Curl_rename() + Assisted-by: Simon Chalifoux + Assisted-by: Tommy Petty - And make the cookie save function use it. + Fixes #5117 + Closes #5129 -- cookies: make saving atomic with a rename - - Saves the file as "[filename].[8 random hex digits].tmp" and renames - away the extension when done. +Daniel Stenberg (20 Mar 2020) +- tests: add test 430, 431 and 432 to verify the --config fix - Co-authored-by: Jay Satiro - Reported-by: Mike Frysinger - Fixes #4914 - Closes #4926 + Verify the fixes in 4e0b4fee4 -- RELEASE-NOTES: synced +- [Rici Lake brought this change] -- socks: make the connect phase non-blocking + cmdline: fix handling of OperationConfig linked list (--next) - Removes two entries from KNOWN_BUGS. + Ensures that -K/--config inserts new items at the end of the list + instead of overwriting the second item, and that after a -K/--config + option has been parsed, the option parser's view of the current config + is update. - Closes #4907 + Fixes #5120 + Closes #5123 -- multi: if Curl_readwrite sets 'comeback' use expire, not loop - - Otherwise, a very fast single transfer ricks starving out other - concurrent transfers. - - Closes #4927 +Marc Hoersken (20 Mar 2020) +- test2100: fix static port instead of dynamic value being used -- ftp: convert 'sock_accepted' to a plain boolean - - This was an array indexed with sockindex but it was only ever used for - the secondary socket. - - Closes #4929 +- test970: fix static ip:port instead of dynamic values being used -Jay Satiro (15 Feb 2020) -- CURLINFO_COOKIELIST.3: Fix example - - Prior to this change the example would try to import cookies from stdin, - which wasn't what was intended. - - Reported-by: 3dyd@users.noreply.github.com +Daniel Stenberg (19 Mar 2020) +- secure transport: remove the BACKEND define kludge - Fixes https://github.com/curl/curl/issues/4930 + Closes #5122 -Daniel Stenberg (14 Feb 2020) -- TODO: Paged searches on LDAP server - - Closes #4452 +- mbedtls: remove the BACKEND define kludge -- TODO: CURLOPT_SSL_CTX_FUNCTION for LDAPS - - Closes #4108 +- bearssl: remove the BACKEND define kludge -- azure: disable brotli on the macos debug-builds - - Because of: - - brotli/decode.h:204:33: error: variable length array used [-Werror,-Wvla] - const uint8_t encoded_buffer[BROTLI_ARRAY_PARAM(encoded_size)], - - Closes #4925 +- wolfssl: remove the BACKEND define kludge -Steve Holme (13 Feb 2020) -- tool_home: Fix the copyright year being out of date - - Follow up to 9dc350b6. +- nss: remove the BACKEND define kludge -Jay Satiro (12 Feb 2020) -- tool_homedir: Change GetEnv() to use libcurl's curl_getenv() - - - Deduplicate GetEnv() code. - - - On Windows change ultimate call to use Windows API - GetEnvironmentVariable() instead of C runtime getenv(). - - Prior to this change both libcurl and the tool had their own GetEnv - which over time diverged. Now the tool's GetEnv is a wrapper around - curl_getenv (libcurl API function which is itself a wrapper around - libcurl's GetEnv). - - Furthermore this change fixes a bug in that Windows API - GetEnvironmentVariable() is called instead of C runtime getenv() to get - the environment variable since some changes aren't always visible to the - latter. - - Reported-by: Christoph M. Becker - - Fixes https://github.com/curl/curl/issues/4774 - Closes https://github.com/curl/curl/pull/4863 +- gnutls: remove the BACKEND define kludge -Daniel Stenberg (12 Feb 2020) -- strerror.h: Copyright year out of date +- openssl: remove the BACKEND define kludge - Follow-up to 1c4fa67e8a8fcf6 + Use a proper variable instead to make it easier to use a debugger and + read the code. -Jay Satiro (12 Feb 2020) -- strerror: Increase STRERROR_LEN 128 -> 256 - - STRERROR_LEN is the constant used throughout the library to set the size - of the buffer on the stack that the curl strerror functions write to. +Marc Hoersken (19 Mar 2020) +- tests: make Python-based servers compatible with Python 2 and 3 - Prior to this change some extended length Windows error messages could - be truncated. + Update smbserver.py and negtelnetserver.py to be compatible with + Python 3 while staying backwards-compatible to support Python 2. - Closes https://github.com/curl/curl/pull/4920 - -- multi: fix outdated comment + Fix string encoding and handling of echoed and transferred data. - - Do not say that conn->data is "cleared" by multi_done(). + Tested with both Python 2.7.17 and Python 3.7.7 - If the connection is in use then multi_done assigns another easy handle - still using the connection to conn->data, therefore in that case it is - not cleared. + Reported-by: Daniel Stenberg + Assisted-by: Kamil Dudka + Reviewed-by: Marcel Raad - Closes https://github.com/curl/curl/pull/4901 + Fixes #5104 + Closes #5110 -- easy: remove dead code - - multi is already assigned to data->multi by curl_multi_add_handle. +Daniel Stenberg (18 Mar 2020) +- writeout_json: use curl_off_t printf() option for the time output - Closes https://github.com/curl/curl/pull/4900 - -Daniel Stenberg (12 Feb 2020) -- create-dirs.d: mention the mode + Follow-up to: 04c03416e68fd635a15 - Reported-by: Dan Jacobson - Fixes #4766 - Closes #4916 + Closes #5115 -- CURLOPT_ALTSVC_CTRL.3: fix the DEFAULT wording +- RELEASE-NOTES: synced - Assisted-by: Jay Satiro - Reported-by: Craig Andrews - Fixes #4909 - Closes #4910 + Uh, I missed this in 1a46b218db - RELEASE-NOTES: synced - -Steve Holme (9 Feb 2020) -- smtp: Simplify the MAIL command and avoid a duplication of send strings - - This avoids the duplication of strings when the optional AUTH and SIZE - parameters are required. It also assists with the modifications that - are part of #4892. - Closes #4903 + ... and bumped curlver.h to 7.70.0 -Daniel Stenberg (9 Feb 2020) -- altsvc: keep a copy of the file name to survive handle reset - - The alt-svc cache survives a call to curl_easy_reset fine, but the file - name to use for saving the cache was cleared. Now the alt-svc cache has - a copy of the file name to survive handle resets. +Jay Satiro (18 Mar 2020) +- http2: Fix erroneous debug message that h2 connection closed - Added test 1908 to verify. + Prior to this change in libcurl debug builds http2 stream closure was + erroneously referred to as connection closure. - Reported-by: Craig Andrews - Fixes #4898 - Closes #4902 - -Steve Holme (9 Feb 2020) -- url: Include the failure reason when curl_win32_idn_to_ascii() fails + Before: + * nread <= 0, server closed connection, bailing - Provide the failure reason in the failf() info just as we do for the - libidn2 version of code. + After: + * nread == 0, stream closed, bailing - Closes #4899 - -Jay Satiro (9 Feb 2020) -- asyn-thread: remove dead code - -Daniel Stenberg (8 Feb 2020) -- [Emil Engler brought this change] + Closes https://github.com/curl/curl/pull/5118 - github: Instructions to post "uname -a" on Unix systems in issues +Daniel Stenberg (18 Mar 2020) +- tool_setopt: correct the copyright year range - Closes #4896 + Follow-up to 5450428491 -- [Cristian Greco brought this change] +Jay Satiro (18 Mar 2020) +- [Johannes Schindelin brought this change] - configure.ac: fix comments about --with-quiche - - A simple s/nghttp3/quiche in some comments of --with-quiche. - Looks like a copy-paste error from --with-nghttp3. + schannel: add "best effort" revocation check option - Closes #4897 - -Steve Holme (7 Feb 2020) -- checksrc.bat: Fix not being able to run script from the main curl directory + - Implement new option CURLSSLOPT_REVOKE_BEST_EFFORT and + --ssl-revoke-best-effort to allow a "best effort" revocation check. - If the script was ran from the main curl directory rather then the - projects directory then the script would simply exit without error: + A best effort revocation check ignores errors that the revocation check + was unable to take place. The reasoning is described in detail below and + discussed further in the PR. - C:\url> projects\checksrc.bat + --- - The user would either need to change to the projects directory, - explicitly specify the current working directory, or perform a - oneline hacky workaround: + When running e.g. with Fiddler, the schannel backend fails with an + unhelpful error message: - C:\url> cd projects - C:\url\projects> checksrc.bat + Unknown error (0x80092012) - The revocation function was unable + to check revocation for the certificate. - C:\url> checksrc.bat %cd% + Sadly, many enterprise users who are stuck behind MITM proxies suffer + the very same problem. - C:\url> pushd projects & checksrc.bat & popd + This has been discussed in plenty of issues: + https://github.com/curl/curl/issues/3727, + https://github.com/curl/curl/issues/264, for example. - Closes #4894 - -Daniel Stenberg (7 Feb 2020) -- [Pierre-Yves Bigourdan brought this change] - - digest: Do not quote algorithm in HTTP authorisation + In the latter, a Microsoft Edge developer even made the case that the + common behavior is to ignore issues when a certificate has no recorded + distribution point for revocation lists, or when the server is offline. + This is also known as "best effort" strategy and addresses the Fiddler + issue. - RFC 7616 section 3.4 (The Authorization Header Field) states that "For - historical reasons, a sender MUST NOT generate the quoted string syntax - for the following parameters: algorithm, qop, and nc". This removes the - quoting for the algorithm parameter. + Unfortunately, this strategy was not chosen as the default for schannel + (and is therefore a backend-specific behavior: OpenSSL seems to happily + ignore the offline servers and missing distribution points). - Reviewed-by: Steve Holme - Closes #4890 - -- ftp: remove the duplicated user/password struct fields + To maintain backward-compatibility, we therefore add a new flag + (`CURLSSLOPT_REVOKE_BEST_EFFORT`) and a new option + (`--ssl-revoke-best-effort`) to select the new behavior. - Closes #4887 - -- ftp: remove superfluous checking for crlf in user or pwd + Due to the many related issues Git for Windows and GitHub Desktop, the + plan is to make this behavior the default in these software packages. - ... as this is already done much earlier in the URL parser. + The test 2070 was added to verify this behavior, adapted from 310. - Also add test case 894 that verifies that pop3 with an encodedd CR in - the user name is rejected. + Based-on-work-by: georgeok + Co-authored-by: Markus Olsson + Signed-off-by: Johannes Schindelin - Closes #4887 + Closes https://github.com/curl/curl/pull/4981 -Steve Holme (6 Feb 2020) -- ntlm_wb: Use Curl_socketpair() for greater portability +- multi: Improve parameter check for curl_multi_remove_handle - Reported-by: Daniel Stenberg - Closes #4886 - -Daniel Stenberg (5 Feb 2020) -- [Frank Gevaerts brought this change] - - contributors: Also include people who contributed to curl-www + - If an easy handle is owned by a multi different from the one specified + then return CURLM_BAD_EASY_HANDLE. - Closes #4884 + Prior to this change I assume user error could cause corruption. + + Closes https://github.com/curl/curl/pull/5116 -- [Frank Gevaerts brought this change] +Viktor Szakats (17 Mar 2020) +- windows: suppress UI in all CryptAcquireContext() calls + + Ref: https://docs.microsoft.com/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta#parameters + Reviewed-by: Marc Hörsken + Closes https://github.com/curl/curl/pull/5088 - contrithanks: Use the most recent tag by default - - (similar to 5296abe) +Daniel Stenberg (17 Mar 2020) +- writeout_json: add missing comma to fix the HTTP version - Closes #4883 + Follow-up to 04c03416e68fd635a15 -- scripts: use last set tag if none given +- test 970: verify --write-out '%{json}' - Makes 'delta' and 'contributors.sh' easier to use. + Makes curl_easy_getinfo() of "variable" numerical content instead return + the number set in the env variable `CURL_TIME`. - Make the delta script invoke contrithanks to get current number of - contributors instead of counting THANKS, for accuracy. + Makes curl_version() of "variable" textual content. This guarantees a + stable version string which can be tested against. Environment variable + `CURL_VERSION` defines the content. - Closes #4881 + Assisted-by: Mathias Gumz -- ftp: shrink temp buffers used for PORT - - These two stack based buffers only need to be 46 + 66 bytes instead of - 256 + 1024. - - Closes #4880 +- [Mathias Gumz brought this change] -- curl: error on --alt-svc use w/o support + writeout: support to generate JSON output - Make the tool check for alt-svc support at run-time and return error - accordingly if not present when the option is used. + This commit adds support to generate JSON via the writeout feature: - Reported-by: Harry Sintonen - Closes #4878 - -- docs/HTTP3: add --enable-alt-svc to curl's configure - -- RELEASE-PROCEDURE: feature win is closed post-release a few days + -w "%{json}" - We've tried to uphold this already but let's make it official by - publicly stating this is the way we do it. + It leverages the existing infrastructure as much as possible. Thus, + generating the JSON on STDERR is possible by: - Closes #4877 - -- altsvc: set h3 version at a common single spot + -w "%{stderr}%{json}" - ... and move the #ifdefs out of the functions. Addresses the fact they - were different before this change. + This implements a variant of + https://github.com/curl/curl/wiki/JSON#--write-out-json. - Reported-by: Harry Sintonen - Closes #4876 + Closes #4870 -- [Harry Sintonen brought this change] +- CI: stop ignoring 323, it is disabled - altsvc: improved header parser - - - Fixed the flag parsing to apply to specific alternative entry only, as - per RFC. The earlier code would also get totally confused by - multiprotocol header, parsing flags from the wrong part of the header. - - - Fixed the parser terminating on unknown protocols, instead of skipping - them. +- DISABLED: disable test 323 - - Fixed a busyloop when protocol-id was present without an equal sign. + The test uses SRP to "a server not supporting it" but modern stunnel + versions will silently accept it and remain happy. The test is therefore + faulty. - Closes #4875 - -- [Harry Sintonen brought this change] - - ngtcp2: fixed to only use AF_INET6 when ENABLE_IPV6 - -- docs/HTTP3: update the OpenSSL branch to use for ngtcp2 + I haven't figured out how to make stunnel explicitly reject SRP-using + connects. - Reported-by: James Fuller + Reported-by: Marc Hörsken + Fixes #5105 + Closes #5113 -Steve Holme (4 Feb 2020) -- ntlm: Pass the Curl_easy structure to the private winbind functions +Marc Hoersken (17 Mar 2020) +- ci/tests: increase timeouts for torture builds on Azure Pipelines - ...rather than the full conndata structure. - -Daniel Stenberg (4 Feb 2020) -- RELEASE-NOTES: synced - -- tool_operhlp: Copyright year out of date, should be 2020 + For some reason the torture builds have slowed down recently. - Follow-up from 2bc373740a3 - -- [Orgad Shaneh brought this change] + Reported-by: Daniel Stenberg - curl: avoid using strlen for testing if a string is empty +Daniel Stenberg (16 Mar 2020) +- cmake: add support for building with wolfSSL - Closes #4873 - -Steve Holme (3 Feb 2020) -- ntlm: Ensure the HTTP header data is not stored in the challenge/response - -Marcel Raad (3 Feb 2020) -- openssl: remove redundant assignment + My working build cmdline: - Fixes a scan-build failure on Bionic. + $ cmake -DCMAKE_PREFIX_PATH=$HOME/build-wolfssl -DCMAKE_USE_WOLFSSL=ON . - Closes https://github.com/curl/curl/pull/4872 + Assisted-by: Brad King + Closes #5095 -- travis: update non-OpenSSL Linux jobs to Bionic - - For the OpenSSL builds, test 323 [TLS-SRP to non-TLS-SRP server] is - failing with "curl returned 52, when expecting 35". +- tool_operate: fix add_parallel_transfers when more are in queue - Closes https://github.com/curl/curl/pull/4872 - -Dan Fandrich (3 Feb 2020) -- cirrus: Add some missing semicolons + Trying to return early from the function if no new transfers were added + would break the "morep" argument and cause issues. This could lead to + zero content "transfers" (within quotes since they would never be + started) when parallel-max was reduced. - Newlines aren't preserved in this section so they're needed to separate - commands. The exports luckily worked anyway as a single long line, but - erroneously exported a variable called "export" - [skip ci] - -Daniel Gustafsson (2 Feb 2020) -- [Pedro Monreal brought this change] + Reported-by: Gavin Wong + Analyzed-by: Jay Satiro + Fixes #4937 + Closes #5112 - cleanup: fix typos and wording in docs and comments +- vtls: free ssl_config leftovers on out-of-memory - Closes #4869 - Reviewed-by: Emil Engler and Daniel Gustafsson - -Steve Holme (2 Feb 2020) -- ntlm: Move the winbind data into the NTLM data structure + Torture testing 2034 and 2037 found this. - To assist with adding winbind support to the SASL NTLM authentication, - move the winbind specific data out of conndata into ntlmdata. + Reported-by: Marc Hörsken + Fixes #5108 + Closes #5109 -Daniel Stenberg (30 Jan 2020) -- quiche: Copyright year out of date +Marc Hoersken (16 Mar 2020) +- ci/tests: fix Azure Pipelines not running for pull requests - Follow-up to 7fc63d72333a + Closes #5111 -- altsvc: use h3-25 +Daniel Stenberg (15 Mar 2020) +- gskit: update the copyright year range - Closes #4868 - -- [Alessandro Ghedini brought this change] + Follow-up from 083603c63a3 - quiche: update to draft-25 +Marc Hoersken (15 Mar 2020) +- gskit: use our internal select wrapper for portability - Closes #4867 + Follow up to c52b342 + Closes #5106 -- ngtcp2: update to git master and its draft-25 support +- tests: fix verification of stdout in test 1452 due to newline - Closes #4865 + Fixes test1452:41:1: error: missing tag before -- cookie: check __Secure- and __Host- case sensitively - - While most keywords in cookies are case insensitive, these prefixes are - specified explicitly to get checked "with a case-sensitive match". +- ci/tests: install impacket for SMB tests on FreeBSD using CirrusCI - (From the 6265bis document in progress) + Also force the package index/cache to be updated before installing. - Ref: https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-04 - Closes #4864 - -- KNOWN_BUGS: Multiple methods in a single WWW-Authenticate: header + Closes #5103 -- oauth2-bearer.d: works for HTTP too +- tests/README: add note about manually installing python-impacket - Reported-by: Mischa Salle - Bug: https://curl.haxx.se/mail/lib-2020-01/0070.html - Closes #4862 + Follow up to 4be2560 -- multi_done: if multiplexed, make conn->data point to another transfer +Daniel Stenberg (15 Mar 2020) +- transfer: cap retries of "dead connections" to 5 - ... since the current transfer is being killed. Setting to NULL is - wrong, leaving it pointing to 'data' is wrong since that handle might be - about to get freed. + When libcurl retries a connection due to it being "seemingly dead" or by + REFUSED_STREAM, it will now only do it up five times before giving up, + to avoid never-ending loops. - Fixes #4845 - Closes #4858 - Reported-by: dmitrmax on github + Reported-by: Dima Tisnek + Bug: https://curl.haxx.se/mail/lib-2020-03/0044.html + Closes #5074 -- location.d: the method change is from POST to GET only - - Not from generic non-GET to GET. +- TODO: TLS-PSK with OpenSSL - Reported-by: Andrius Merkys - Ref: #4859 - Closes #4861 + Closes #5081 -- urlapi: guess scheme correct even with credentials given - - In the "scheme-less" parsing case, we need to strip off credentials - first before we guess scheme based on the host name! - - Assisted-by: Jay Satiro - Fixes #4856 - Closes #4857 +Marc Hoersken (15 Mar 2020) +- select: add 'timeout_ms' wrap-around precaution to Curl_select -- global_init: move the IPv6 works status bool to multi handle - - Previously it was stored in a global state which contributed to - curl_global_init's thread unsafety. This boolean is now instead figured - out in curl_multi_init() and stored in the multi handle. Less effective, - but thread safe. +- select: fix 'pending_ms' is assigned a value that is never used - Closes #4851 - -- [Jay Satiro brought this change] + Detected by Codacy - README: mention that the docs is in docs/ +- select: move duplicate select preparation code into Curl_select - Reported-by: Austin Green - Fixes #4830 - Closes #4853 + Reviewed by Daniel Stenberg + Reviewed by Marcel Raad + Closes #5078 -- curl.h: define CURL_WIN32 on windows +Daniel Stenberg (15 Mar 2020) +- connect: happy eyeballs cleanup - ... so that the subsequent logic below can use a single known define to know - when built on Windows (as we don't define WIN32 anymore). + Make sure each separate index in connn->tempaddr[] is used for a fixed + family (and only that family) during the connection process. - Follow-up to 1adebe7886ddf20b + If family one takes a long time and family two fails immediately, the + previous logic could misbehave and retry the same family two address + repeatedly. - Reported-by: crazydef on github - Assisted-by: Marcel Raad - Fixes #4854 - Closes #4855 + Reported-by: Paul Vixie + Reported-by: Jay Satiro + Fixes #5083 + Fixes #4954 + Closes #5089 -- RELEASE-NOTES: synced +Marc Hoersken (15 Mar 2020) +- ci/tests: fix and align setting TFLAGS for make test-nonflaky -- [Jon Rumsey brought this change] +- ci/tests: install test suite dependencies stunnel and impacket - urldata: do string enums without #ifdefs for build scripts +- tests: remove python_dependencies for smbserver from our tree + + Users of the SMB tests will have to install impacket manually. - ... and check for inconsistencies for OS400 at build time with the new - chkstrings tool. + Reasoning: our in-tree version of impacket was quite outdated + and only compatible with Python 2 which is already end-of-life. + Upgrading to Python 3 and a compatible impacket version would + require to import additional Python-only and CPython-extension + dependencies. This would have hindered portability enormously. - Closes #4822 + Closes #5094 -- curl: make the -# spaceship bar not wrap the line +Jay Satiro (14 Mar 2020) +- Makefile.m32: Improve windres parameter compatibility + + - s/COFF/coff/ - The fixed-point math made us lose precision and thus a too high index - value could be used for outputting the hashtags which could overwrite - the newline. + Some versions of windres do not recognize uppercase COFF as a valid + way to specify the COFF output format. - The fix increases the precision in the sine table (*100) and the - associated position math. + Reported-by: Steven Penny - Reported-by: Andrew Potter - Fixes #4849 - Closes #4850 + Fixes https://github.com/curl/curl/issues/5099 + Closes https://github.com/curl/curl/pull/5101 -- global_init: assume the EINTR bit by default +- easy: Fix curl_easy_duphandle for builds missing IPv6 that use c-ares + + - Ignore CURLE_NOT_BUILT_IN errors returned by c-ares functions in + curl_easy_duphandle. - - Removed from global_init since it isn't thread-safe. The symbol will - still remain to not break compiles, it just won't have any effect going - forward. + Prior to this change if c-ares was used as the resolver backend and + either it was too old or libcurl was built without IPv6 support then + some of our resolver functions could return CURLE_NOT_BUILT_IN to + curl_easy_duphandle causing it to fail. - - make the internals NOT loop on EINTR (the opposite from previously). - It only risks returning from the select/poll/wait functions early, and that - should be risk-free. + Caused by c8f086b which shipped in 7.69.1. - Closes #4840 - -- [Peter Piekarski brought this change] - - conn: do not reuse connection if SOCKS proxy credentials differ + Reported-by: Karl Chen - Closes #4835 + Fixes https://github.com/curl/curl/issues/5097 + Closes https://github.com/curl/curl/pull/5100 -- llist: removed unused Curl_llist_move() +Daniel Stenberg (13 Mar 2020) +- docs: add warnings about FILE: URLs on Windows - (and the corresponding unit test) + - --url man page section + - libcurl-security.3 gets the full text + - CURLOPT_URL.3 - Closes #4842 - -- conncache: removed unused Curl_conncache_bundle_size() + Reported-by: Tim Sedlmeyer -- strcase: turn Curl_raw_tolower into static +- server/getpart: make the "XML-parser" stricter - Only ever used from within this file. - -- singleuse.pl: support new API functions, fix curl_dbg_ handling - -- wolfssh: make it init properly via Curl_ssh_init() + When extracting a
and there's no before +
, this now outputs an error and returns a wrong string to + make users spot the mistake. - Closes #4846 - -- [Aron Rotteveel brought this change] + Ref: #5070 + Closes #5071 - form.d: fix two minor typos +Marc Hoersken (13 Mar 2020) +- impacket: some more Python 3 code compatibility updates - Closes #4843 + This makes smbserver load on Python 3, but still not work completely. -- openssl: make CURLINFO_CERTINFO not truncate x509v3 fields +- smbserver: pin Python version to 2 since we are not yet 3 compatible - Avoid "reparsing" the content and instead deliver more exactly what is - provided in the certificate and avoid truncating the data after 512 - bytes as done previously. This no longer removes embedded newlines. + Even though the existing code can be fixed to run on Python 3, the + tests will fail due to the Unicode transition the protocol is invalid. - Fixes #4837 - Reported-by: bnfp on github - Closes #4841 + Follow up to ee63837 + Closes #5085 -Jay Satiro (23 Jan 2020) -- CURLOPT_PROXY_SSL_OPTIONS.3: Sync with CURLOPT_SSL_OPTIONS.3 - - - Copy CURLOPT_SSL_OPTIONS.3 description to CURLOPT_PROXY_SSL_OPTIONS.3. - - Prior to this change CURLSSLOPT_NO_PARTIALCHAIN was missing from the - CURLOPT_PROXY_SSL_OPTIONS description. +Daniel Stenberg (12 Mar 2020) +- [Viktor Szakats brought this change] -Daniel Stenberg (22 Jan 2020) -- mk-ca-bundle: add support for CKA_NSS_SERVER_DISTRUST_AFTER + cleanup: fix some text/comment typos - For now, no cert in the bundle actually sets a date there... + Closes #5087 + +Marc Hoersken (12 Mar 2020) +- smbserver: fix Python version specific ConfigParser import - Co-Authored-by: Jay Satiro - Reported-by: Christian Heimes - Fixes #4834 - Closes #4836 + Follow up to ee63837 and 8c7c4a6 + Fixes #5077 +Daniel Stenberg (11 Mar 2020) - RELEASE-NOTES: synced - -- [Pavel Volgarev brought this change] - - smtp: Allow RCPT TO command to fail for some recipients - - Introduces CURLOPT_MAIL_RCPT_ALLLOWFAILS. - - Verified with the new tests 3002-3007 - Closes #4816 + bumped to 7.69.2 -- copyright: fix year ranges +Dan Fandrich (11 Mar 2020) +- tests/data: Fix some XML formatting issues in test cases - follow-up from dea17b519d (one of these days I'll learn to check before - I push) + This allows these test files to pass xmllint. -- [nao brought this change] +Daniel Stenberg (11 Mar 2020) +- [Muhammad Herdiansyah brought this change] - http: move "oauth_bearer" from connectdata to Curl_easy + Makefile: run the cd commands in a subshell - Fixes the bug where oauth_bearer gets deallocated when we re-use a - connection. + In bmake, if the directory is changed (with cd or anything else), bmake + won't return to the "root directory" on the next command (in the same + Makefile rule). This commit runs the cd command in a subshell so it + would work in bmake. - Closes #4824 - -- [Emil Engler brought this change] + Closes #5073 - curl: Let -D merge headers in one file again +- configure: convert -I to -isystem as a last step + + As all the -I uses in CFLAGS at that point are for system headers and + third party libraries this helps us remove/ignore warnings on those! - Closes #4762 - Fixes #4753 + Closes #5060 -- data.d: remove "Multiple files can also be specified" +- configure: fix -pedantic-errors for GCC 5 and later - It is superfluous and could even be misleading. + If --enable-werror is used. + + Follow-up to d5c0351055d5709da which added it too early in the configure + script before $compiler_num was set correctly and thus this option was + never used. - Bug: https://curl.haxx.se/mail/archive-2020-01/0016.html - Reported-by: Mike Norton - Closes #4832 + Reported-by: Stepan Efremov + Fixes #5067 + Closes #5068 -Marcel Raad (20 Jan 2020) -- CMake: support specifying the target Windows version +- configure: document 'compiler_num' for gcc - Previously, it was only possible to set it to Windows Vista or XP by - setting the option `ENABLE_INET_PTON` to `ON` resp. `OFF`. - Use a new cache variable `CURL_TARGET_WINDOWS_VERSION` to be able to - explicitly set the target Windows version. `ENABLE_INET_PTON` is - ignored in this case. + The CURL_CHECK_COMPILER_GNU_C function sets the number to MAJOR*100 + + MINOR and ignores the patch version, and since gcc version 7 it only + sets it to MAJOR*100. - Ref: https://github.com/curl/curl/pull/1639#issuecomment-313039352 - Ref: https://github.com/curl/curl/pull/4607#issuecomment-557541456 - Closes https://github.com/curl/curl/pull/4815 + Reported-by: Stepan Efremov + Ref: #5067 + Closes #5069 + +Version 7.69.1 (11 Mar 2020) + +Daniel Stenberg (11 Mar 2020) +- RELEASE-NOTES: 7.69.1 -Daniel Stenberg (20 Jan 2020) -- http.h: Copyright year out of date, should be 2020 - - Follow-up to 7ff9222ced8c +- THANKS: from the 7.69.1 release -- [加藤郁之 brought this change] +- [Marc Hoersken brought this change] - HTTP: increase EXPECT_100_THRESHOLD to 1Mb - - Mentioned: https://curl.haxx.se/mail/lib-2020-01/0050.html + test1129: fix invalid case of closing XML-tag and Content-Length - Closes #4814 + Fixes #5070 + Closes #5072 -- ROADMAP: thread-safe `curl_global_init()` +Marc Hoersken (10 Mar 2020) +- tests/data: fix static ip instead of dynamic value being used - I'd like to see this happen. - -- RELEASE-NOTES: synced + Follow up to 94ced8e -- wolfssl: use the wc-prefixed symbol alternatives - - The symbols without wc_ prefix are not always provided. - - Ref: https://github.com/wolfSSL/wolfssl/issues/2744 +- tests/data: fix static ip:port instead of dynamic values being used - Closes #4827 + Closes #5065 -- polarssl: removed - - As detailed in DEPRECATE.md, the polarssl support is now removed after - having been disabled for 6 months and nobody has missed it. - - The threadlock files used by mbedtls are renamed to an 'mbedtls' prefix - instead of the former 'polarssl' and the common functions that - previously were shared between mbedtls and polarssl and contained the - name 'polarssl' have now all been renamed to instead say 'mbedtls'. +- tests/server: fix missing use of exe_ext helper function - Closes #4825 + Follow up to 9819984 and 3dce984 + Reviewed-By: Daniel Stenberg + Closes #5064 -Marcel Raad (16 Jan 2020) -- libssh2: fix variable type - - This led to a conversion warning on 64-bit MinGW, which has 32-bit - `long` but 64-bit `size_t`. - - Closes https://github.com/curl/curl/pull/4823 +- runtests: log minimal and maximal used port numbers + +Daniel Stenberg (9 Mar 2020) +- [James Fuller brought this change] -Daniel Stenberg (16 Jan 2020) -- curl:progressbarinit: ignore column width from terminals < 20 + sftp: fix segfault regression introduced by #4747 - To avoid division by zero - or other issues. + This fix adds a defensive check for the case where the char *name in + struct libssh2_knownhost is NULL - Reported-by: Daniel Marjamäki - Closes #4818 - -- wolfssh: set the password correctly for PASSWORD auth + Fixes #5041 + Closes #5062 -- wolfssh: remove fprintf() calls (and uses of __func__) +- RELEASE-NOTES: synced -Marcel Raad (14 Jan 2020) -- CMake: use check_symbol_exists also for inet_pton +- socks4: fix host resolve regression - It doesn't make much sense to only check if the function can be linked - when it's not declared in any header and that is treated as an error. - With the correct target Windows version set, the function is declared - in ws2tcpip.h and the comment above the modified block is invalid. + 1. The socks4 state machine was broken in the host resolving phase - Also, move the definition of `_WIN32_WINNT` up to before all symbol - availability checks so that we don't have to care which ones must be - done after it. + 2. The code now insists on IPv4-only when using SOCKS4 as the protocol + only supports that. - Tested with Visual Studio 2019 and current MinGW-w64. + Regression from #4907 and 4a4b63d, shipped in 7.69.0 - Closes https://github.com/curl/curl/pull/4808 + Reported-by: amishmm on github + Bug: https://github.com/curl/curl/issues/5053#issuecomment-596191594 + Closes #5061 -Jay Satiro (13 Jan 2020) -- schannel_verify: Fix alt names manual verify for UNICODE builds - - Follow-up to 29e40a6 from two days ago, which added that feature for - Windows 7 and earlier. The bug only occurred in same. - - Ref: https://github.com/curl/curl/pull/4761 +- [Patrick Monnerat brought this change] -Daniel Stenberg (13 Jan 2020) -- HTTP-COOKIES.md: describe the cookie file format + silly web server: silent a compilation warning - ... and refer to that file from from CURLOPT_COOKIEFILE.3 and - CURLOPT_COOKIELIST.3 + Recent gcc warns when byte count of strncpy() equals the destination + buffer size. Since the destination buffer is previously cleared and + the source string is always shorter, reducing the byte count by one + silents the warning without affecting the result. - Assisted-by: Jay Satiro - Reported-by: bsammon on github - Fixes #4805 - Closes #4806 + Closes #5059 -- [Tobias Hieta brought this change] +- [Patrick Monnerat brought this change] - CMake: Add support for CMAKE_LTO option. - - This enables Link Time Optimization. LTO is a proven technique for - optimizing across compilation units. + cookie: get_top_domain() sets zero length for null domains - Closes #4799 + This silents a compilation warning with gcc -O3. -- RELEASE-NOTES: synced +- [Patrick Monnerat brought this change] -- ConnectionExists: respect the max_concurrent_streams limits - - A regression made the code use 'multiplexed' as a boolean instead of the - counter it is intended to be. This made curl try to "over-populate" - connections with new streams. - - This regression came with 41fcdf71a1, shipped in curl 7.65.0. + test 1560: avoid valgrind false positives - Also, respect the CURLMOPT_MAX_CONCURRENT_STREAMS value in the same - check. + When using maximum code optimization level (-O3), valgrind wrongly + detects uses of uninitialized values in strcmp(). - Reported-by: Kunal Ekawde - Fixes #4779 - Closes #4784 + Preset buffers with all zeroes to avoid that. -- curl: make #0 not output the full URL - - It was not intended nor documented! - - Added test 1176 to verify. - - Reported-by: vshmuk on hackerone +Steve Holme (8 Mar 2020) +- sha256: Added WinCrypt implementation - Closes #4812 + Closed #5030 -- wolfSSH: new SSH backend - - Adds support for SFTP (not SCP) using WolfSSH. - - Closes #4231 +- sha256: Added SecureTransport implementation -- curl: remove 'config' field from OutStruct - - As it was just unnecessary duplicated information already stored in the - 'per_transfer' struct and that's around mostly anyway. +Daniel Stenberg (7 Mar 2020) +- lib1564: reduce number of mid-wait wakeup calls - The duplicated pointer caused problems when the code flow was aborted - before the dupe was filled in and could cause a NULL pointer access. + This test does A LOT of *wakeup() calls and then calls curl_multi_poll() + twice. The first *poll() is then expected to return early and the second + not - as the first is supposed to drain the socketpair pipe. - Reported-by: Brian Carpenter - Fixes #4807 - Closes #4810 - -- misc: Copyright year out of date, should be 2020 + It turns out however that when given "excessive" amounts of writes to + the pipe, some operating systems (the Solaris based are known) will + return EAGAIN before the pipe is drained, which in our test case causes + the second *poll() call to also abort early. - Follow-up to recent commits + This change attempts to avoid the OS-specific behaviors in the test by + reducing the amount of wakeup calls from 1234567 to 10. - [skip ci] + Reported-by: Andy Fiddaman + Fixes #5037 + Closes #5058 -Jay Satiro (11 Jan 2020) -- [Santino Keupp brought this change] +- [Patrick Monnerat brought this change] - libssh2: add support for forcing a hostkey type - - - Allow forcing the host's key type found in the known_hosts file. + mime: fix the binary encoder to handle large data properly - Currently, curl (with libssh2) does not take keys from your known_hosts - file into account when talking to a server. With this patch the - known_hosts file will be searched for an entry matching the hostname - and, if found, libssh2 will be told to claim this key type from the - server. + New test 666 checks this is effective. + As upload buffer size is significant in this kind of tests, shorten it + in similar test 652. - Closes https://github.com/curl/curl/pull/4747 + Fixes #4860 + Closes #4833 + Reported-by: RuurdBeerstra on github -- [Nicolas Guillier brought this change] +- [Patrick Monnerat brought this change] - cmake: Improve libssh2 check on Windows - - - Add "libssh2" name to FindLibSSH2 library search. + mime: do not perform more than one read in a row - On Windows systems, libSSH2 CMake installation may name the library - "LibSSH2". + Input buffer filling may delay the data sending if data reads are slow. + To overcome this problem, file and callback data reads do not accumulate + in buffer anymore. All other data (memory data and mime framing) are + considered as fast and still concatenated in buffer. + As this may highly impact performance in terms of data overhead, an early + end of part data check is added to spare a read call. + When encoding a part's data, an encoder may require more bytes than made + available by a single read. In this case, the above rule does not apply + and reads are performed until the encoder is able to deliver some data. - Prior to this change cmake only checked for name "ssh2". On Linux that - works fine because it will prepend the "lib", but it doesn't do that on - Windows. + Tests 643, 644, 645, 650 and 654 have been adapted to the output data + changes, with test data size reduced to avoid the boredom of long lists of + 1-byte chunks in verification data. + New test 667 checks mimepost using single-byte read callback with encoder. + New test 668 checks the end of part data early detection. - Closes https://github.com/curl/curl/pull/4804 + Fixes #4826 + Reported-by: MrdUkk on github -- [Faizur Rahman brought this change] +- [Patrick Monnerat brought this change] - schannel: Make CURLOPT_CAINFO work better on Windows 7 - - - Support hostname verification via alternative names (SAN) in the - peer certificate when CURLOPT_CAINFO is used in Windows 7 and earlier. - - CERT_NAME_SEARCH_ALL_NAMES_FLAG doesn't exist before Windows 8. As a - result CertGetNameString doesn't quite work on those versions of - Windows. This change provides an alternative solution for - CertGetNameString by iterating through CERT_ALT_NAME_INFO for earlier - versions of Windows. - - Prior to this change many certificates failed the hostname validation - when CURLOPT_CAINFO was used in Windows 7 and earlier. Most certificates - now represent multiple hostnames and rely on the alternative names field - exclusively to represent their hostnames. + mime: latch last read callback status. - Reported-by: Jeroen Ooms + In case a read callback returns a status (pause, abort, eof, + error) instead of a byte count, drain the bytes read so far but + remember this status for further processing. + Takes care of not losing data when pausing, and properly resume a + paused mime structure when requested. + New tests 670-673 check unpausing cases, with easy or multi + interface and mime or form api. - Fixes https://github.com/curl/curl/issues/3711 - Closes https://github.com/curl/curl/pull/4761 + Fixes #4813 + Reported-by: MrdUkk on github -- [Emil Engler brought this change] +Marc Hoersken (7 Mar 2020) +- runtests: fix missing use of exe_ext helper function - ngtcp2: Add an error code for QUIC connection errors - - - Add new error code CURLE_QUIC_CONNECT_ERROR for QUIC connection - errors. - - Prior to this change CURLE_FAILED_INIT was used, but that was not - correct. - - Closes https://github.com/curl/curl/pull/4754 +Daniel Stenberg (7 Mar 2020) +- [Ernst Sjöstrand brought this change] -- multi: Change curl_multi_wait/poll to error on negative timeout - - - Add new error CURLM_BAD_FUNCTION_ARGUMENT and return that error when - curl_multi_wait/poll is passed timeout param < 0. + ares: store dns parameters for duphandle - Prior to this change passing a negative value to curl_multi_wait/poll - such as -1 could cause the function to wait forever. + With c-ares the dns parameters lives in ares_channel. Store them in the + curl handle and set them again in easy_duphandle. - Reported-by: hamstergene@users.noreply.github.com + Regression introduced in #3228 (6765e6d), shipped in curl 7.63.0. - Fixes https://github.com/curl/curl/issues/4763 + Fixes #4893 + Closes #5020 + Signed-off-by: Ernst Sjöstrand + +- version: make curl_version* thread-safe without using global context - Closes https://github.com/curl/curl/pull/4765 + Closes #5010 -- [Marc Aldorasi brought this change] +- RELEASE-NOTES: synced - cmake: Enable SMB for Windows builds - - - Define USE_WIN32_CRYPTO by default. This enables SMB. - - - Show whether SMB is enabled in the "Enabled features" output. - - - Fix mingw compiler warning for call to CryptHashData by casting away - const param. mingw CryptHashData prototype is wrong. +Marc Hoersken (7 Mar 2020) +- tests: use native Sleep function as fallback on Windows - Closes https://github.com/curl/curl/pull/4717 + Reviewed-By: Daniel Stenberg + Closes #5054 -- vtls: Refactor Curl_multissl_version to make the code clearer - - Reported-by: Johannes Schindelin - - Ref: https://github.com/curl/curl/pull/3863#pullrequestreview-241395121 - - Closes https://github.com/curl/curl/pull/4803 +- perl: align order and completeness of Windows OS checks -Daniel Stenberg (10 Jan 2020) -- fix: Copyright year out of date, should be 2020 +Daniel Stenberg (7 Mar 2020) +- tool_cb_see: set correct copyright year range - Follow-up to 875314ed0bf3b + Follow-up to a39e5bfb9 -Marcel Raad (10 Jan 2020) -- hostip: move code to resolve IP address literals to `Curl_resolv` - - The code was duplicated in the various resolver backends. - - Also, it was called after the call to `Curl_ipvalid`, which matters in - case of `CURLRES_IPV4` when called from `connect.c:bindlocal`. This - caused test 1048 to fail on classic MinGW. - - The code ignores `conn->ip_version` as done previously in the - individual resolver backends. +Marc Hoersken (7 Mar 2020) +- seek: fix fallback for missing ftruncate on Windows - Move the call to the `resolver_start` callback up to appease test 655, - which wants it to be called also for literal addresses. + This fixes test 198 on versions of MinGW-w64 without ftruncate - Closes https://github.com/curl/curl/pull/4798 + Reviewed-By: Daniel Stenberg + Reviewed-By: Marcel Raad + Closes #5055 -Daniel Stenberg (9 Jan 2020) -- scripts/delta: adapt to new public header layout +- config-win32: Windows does not have ftruncate -- test1167: verify global symbols in public headers are curl prefixed +Daniel Stenberg (7 Mar 2020) +- pause: force a connection (re-)check after unpausing - ... using the new badsymbols.pl perl script + There might be data available that was already read off the socket, for + example in the TLS layer. - Fixes #4793 - Closes #4794 - -- libtest/mk-lib1521: adapt to new public header layout + Reported-by: Anders Berg + Fixes #4966 + Closes #5049 -- include: remove non-curl prefixed defines +- socks5: switch state properly when the resolve is done - ...requires some rearranging of the setup of CURLOPT_ and CURLMOPT_ - enums. + Regression from 4a4b63d (and #4907) + Reported-by: vitaha85 on github + Fixes #5053 + Closes #5056 -- curl.h: remove WIN32 define +Jay Satiro (7 Mar 2020) +- libssh: Fix matching user-specified MD5 hex key - It isn't our job to define this in a public header - and it defines a - name outside of our naming scope. - -- tool_dirhie.c: fix the copyright year range + Prior to this change a match would never be successful because it + was mistakenly coded to compare binary data from libssh to a + user-specified hex string (ie CURLOPT_SSH_HOST_PUBLIC_KEY_MD5). - Follow-up to: 4027bd72d9 - -- bump: work towards 7.69.0 is started + Reported-by: fds242@users.noreply.github.com + + Fixes https://github.com/curl/curl/issues/4971 + Closes https://github.com/curl/curl/pull/4974 -Jay Satiro (9 Jan 2020) -- tool_dirhie: Allow directory traversal during creation +Daniel Stenberg (6 Mar 2020) +- pause: bail out on bad input - - When creating a directory hierarchy do not error when mkdir fails due - to error EACCESS (13) "access denied". + A NULL easy handle or an easy handle without an associated connection + cannot be paused or unpaused. - Some file systems allow for directory traversal; in this case that it - should be possible to create child directories when permission to the - parent directory is restricted. + Closes #5050 + +Steve Holme (6 Mar 2020) +- unit1612: fixed the inclusion and compilation of the HMAC unit test - This is a regression caused by me in f16bed0 (precedes curl-7_61_1). - Basically I had assumed that if a directory already existed it would - fail only with error EEXIST, and not error EACCES. The latter may - happen if the directory exists but has certain restricted permissions. + Follow up to 3f74e5e6 to fix: - Reported-by: mbeifuss@users.noreply.github.com + - A typo in Makefile.inc where unit1611 was used instead + - Some compilation issues in unit1612.c - Fixes https://github.com/curl/curl/issues/4796 - Closes https://github.com/curl/curl/pull/4797 + Closes #5024 -Daniel Stenberg (9 Jan 2020) -- KNOWN_BUGS: AUTH PLAIN for SMTP is not working on all servers +Daniel Stenberg (6 Mar 2020) +- pause: return early for calls that don't change pause state - Closes #4080 + Reviewed-by: Patrick Monnerat + Ref: #4833 + Closes #5026 -- docs/RELEASE-PROCEDURE.md: pushed some release dates +Jay Satiro (6 Mar 2020) +- curl_share_setopt.3: Note sharing cookies doesn't enable the engine - Ref: https://curl.haxx.se/mail/lib-2020-01/0031.html - -- runtests: make random seed fixed for a month + Follow-up to d0a7ee3 which fixed a bug in 7.66.0 that caused + CURL_LOCK_DATA_COOKIE to enable the easy handle's cookie engine. - When using randomized features of runtests (-R and --shallow) it is - useful to have a fixed random seed to make sure for example extra - commits in a branch or a rebase won't change the seed that would make - repeated runs work differently. + Bug: https://curl.haxx.se/mail/lib-2020-03/0019.html + Reported-by: Felipe Gasper - As it is also useful to change seed sometimes, the default seed is now - determined based on the current month (and first line curl -V - output). When the month changes, so will the random seed. + Closes https://github.com/curl/curl/pull/5048 + +- multi: skip EINTR check on wakeup socket if it was closed - The specific seed is also shown in the standard test suite top header - and it can be set explictly with the new --seed=[num] option so that the - exact order of a previous run can be achieved. + - Don't check errno on wakeup socket if sread returned 0 since sread + doesn't set errno in that case. - Closes #4734 - -- RELEASE-PROCEDURE.md: fix next release date (Feb 26) + This is a follow-up to cf7760a from several days ago which fixed + Curl_multi_wait to stop busy looping sread on the non-blocking wakeup + socket if it was closed (ie sread returns 0). Due to a logic error it + was still possible to busy loop in that case if errno == EINTR. - [skip ci] - -Version 7.68.0 (8 Jan 2020) - -Daniel Stenberg (8 Jan 2020) -- RELEASE-NOTES: 7.68.0 + Closes https://github.com/curl/curl/pull/5047 -- THANKS: updated with names from the 7.68.0 release +Daniel Stenberg (6 Mar 2020) +- transfer: set correct copyright year range -- RELEASE-PROCEDURE: add four future release dates +- urldata: remove the 'stream_was_rewound' connectdata struct member - and remove four past release dates + ... as it is never set anywhere. - [skip ci] + Follow-up to 2f44e94ef + Closes #5046 -Marcel Raad (6 Jan 2020) -- TrackMemory tests: always remove CR before LF +- Revert "pause: force-drain the transfer on unpause" + + This reverts commit fa0216b294af4c7113a9040ca65eefc7fc18ac1c (from #5000) - It was removed for output containing ' =' via `s/ =.*//`. With classic - MinGW, this made lines with `free()` end with CRLF, but lines with e.g. - `malloc()` end with only LF. The tests expect LF only. + Clearly that didn't solve the problem correctly. - Closes https://github.com/curl/curl/pull/4788 + Reported-by: Christopher Reid + Reopens #4966 + Fixes #5044 -Daniel Stenberg (6 Jan 2020) -- multi.h: move INITIAL_MAX_CONCURRENT_STREAMS from public header - - ... to the private multihhandle.h. It is not for public use and it - wasn't prefixed correctly anyway! +- RELEASE-NOTES: synced - Closes #4790 + and bumped curlver.h -- file: fix copyright year range +- MANUAL: update a dict-using command line - Follow-up to 1b71bc532bd + The 'web1913' database is now invalid, use 'gcide' instead. -- curl -w: handle a blank input file correctly - - Previously it would end up with an uninitialized memory buffer that - would lead to a crash or junk getting output. - - Added test 1271 to verify. +- KNOWN_BUGS: configure --with-gssapi with Heimdal is ignored on macOS - Reported-by: Brian Carpenter - Closes #4786 + Closes #3841 -- file: on Windows, refuse paths that start with \\ - - ... as that might cause an unexpected SMB connection to a given host - name. +- polarssl: remove more references and mentions - Reported-by: Fernando Muñoz - CVE-2019-15601 - Bug: https://curl.haxx.se/docs/CVE-2019-15601.html - -Jay Satiro (6 Jan 2020) -- CURLOPT_READFUNCTION.3: fix fopen params in example + Assisted-by: Jay Satiro + Follow-up to 6357a19ff29dac04 + Closes #5036 -- CURLOPT_READFUNCTION.3: fix variable name in example - - Reported-by: Paul Joyce - - Fixes https://github.com/curl/curl/issues/4787 +Marc Hoersken (4 Mar 2020) +- tests: wrap ignored test failures in braces -Daniel Stenberg (5 Jan 2020) -- curl:getparameter return error for --http3 if libcurl doesn't support - - Closes #4785 +- tests: align some Windows sleep defines with each other -- docs: mention CURL_MAX_INPUT_LENGTH restrictions - - ... for curl_easy_setopt() and curl_url_set(). +- tests: try to make sleeping portable by avoiding select - [skip ci] + select does not support just waiting on Windows: + https://perldoc.perl.org/perlport.html#select - Closes #4783 + Reviewed-By: Daniel Stenberg + Closes #5035 -- curl: properly free mimepost data - - ... as it could otherwise leak memory when a transfer failed. +Daniel Stenberg (4 Mar 2020) +- runtests.1: rephrase how to specify what tests to run - Added test 1293 to verify. + Also mention the new tilde-prefixed way to ignore test results. - Reported-by: Brian Carpenter - Fixes #4781 - Closes #4782 + Reviewed-By: Marc Hoersken + Closes #5033 -- curl: cleanup multi handle on failure - - ... to fix memory leak in error path. +- cirrus-ci: disable the FreeBSD 13 builds - Fixes #4772 - Closes #4780 - Reported-by: Brian Carpenter - -Marcel Raad (3 Jan 2020) -- lib: fix compiler warnings with `CURL_DISABLE_VERBOSE_STRINGS` + FreeBSD 13.0 is apparently close to a year away from a stable release + and has proven to cause intermittent builds failures recently. - Closes https://github.com/curl/curl/pull/4775 + Assisted-by: Dan Fandrich + Assisted-by: Fedor Korotkov + Fixes #5028 + Closes #5029 -Daniel Stenberg (3 Jan 2020) -- COPYING: it's 2020! - - [skip ci] +Version 7.69.0 (4 Mar 2020) -Jay Satiro (3 Jan 2020) -- [Marc Aldorasi brought this change] +Daniel Stenberg (4 Mar 2020) +- RELEASE-NOTES: 7.69.0 - tests: Fix bounce requests with truncated writes - - Prior to this change the swsbounce check in service_connection could - fail because prevtestno and prevpartno were not set, which would cause - the wrong response data to be sent to some tests and cause them to fail. +- THANKS: from 7.69.0 - Ref: https://github.com/curl/curl/pull/4717#issuecomment-570240785 + Now sorted case insensitive -Marcel Raad (31 Dec 2019) -- tool: make a few char pointers point to const char instead - - These are read-only. +Marc Hoersken (3 Mar 2020) +- ci/tests: fix escaping of testnames and disable proxy for CI APIs - Closes https://github.com/curl/curl/pull/4771 + Follow up to ada581f and c0d8b96 + Closes #5031 -Jay Satiro (31 Dec 2019) -- tests: Change NTLM tests to require SSL +Jay Satiro (3 Mar 2020) +- cmake: Show HTTPS-proxy in the features output - Prior to this change tests that required NTLM feature did not require - SSL feature. + - Show HTTPS-proxy in the features output for those backends that + support it: OpenSSL, GnuTLS and NSS. - There are pending changes to cmake builds that will allow enabling NTLM - in non-SSL builds in Windows. In that case the NTLM auth strings created - are different from what is expected by the NTLM tests and they fail: + Prior to this change HTTPS-proxy was missing from the cmake features + output even if curl was built with it. Only cmake output was affected. + Both the library and tool correctly reported the feature. - "The issue with NTLM is that previous non-SSL builds would not enable - NTLM and so the NTLM tests would be skipped." + Bug: https://curl.haxx.se/mail/lib-2020-03/0008.html + Reported-by: David Lopes - Assisted-by: marc-groundctl@users.noreply.github.com + Closes https://github.com/curl/curl/pull/5025 + +Marc Hoersken (3 Mar 2020) +- ci/tests: Make it possible to still run but ignore failing tests - Ref: https://github.com/curl/curl/pull/4717#issuecomment-566218729 + This enables the development of a solution for the failing tests by + running them on CI while ignoring their result for the overall status. - Closes https://github.com/curl/curl/pull/4768 + Closes #4994 -- [Michael Forney brought this change] +- README.md: add Azure DevOps Pipelines build status badge - bearssl: Improve I/O handling - - Factor out common I/O loop as bearssl_run_until, which reads/writes TLS - records until the desired engine state is reached. This is now used for - the handshake, read, write, and close. - - Match OpenSSL SSL_write behavior, and don't return the number of bytes - written until the corresponding records have been completely flushed - across the socket. This involves keeping track of the length of data - buffered into the TLS engine, and assumes that when CURLE_AGAIN is - returned, the write function will be called again with the same data - and length arguments. This is the same requirement of SSL_write. +- ci/tests: Move CI test result creation above environment setup - Handle TLS close notify as EOF when reading by returning 0. + This avoids using our test servers as proxy to the AppVeyor API. - Closes https://github.com/curl/curl/pull/4748 + Closes #5022 -- travis: Fix error detection +- ci/tests: Send test results to AppVeyor for status overview - - Stop using inline shell scripts for before_script and script sections. + Closes #5021 + +Daniel Stenberg (3 Mar 2020) +- Revert "sha256: Added SecureTransport implementation" - Prior to this change Travis could ignore errors from commands in inline - scripts. I don't understand how or why it happens. This is a workaround. + This reverts commit 4feb38deed33fed14ff7c370a6a9153c661dbb9c (from #4956) - Assisted-by: Simon Warta + That commit broke test 1610 on macos builds without TLS. - Ref: https://github.com/travis-ci/travis-ci/issues/1066 + Closes #5027 + +- dist: include tests/azure.pm in the tarball - Fixes https://github.com/curl/curl/issues/3730 - Closes https://github.com/curl/curl/pull/3755 + Bug: https://github.com/curl/curl/commit/ada581f2cc32f48c1629b729707ac19208435b27#commitcomment-37601589 + Reported-by: Marcel Raad -- tool_operate: fix mem leak when failed config parse +Steve Holme (3 Mar 2020) +- configure.ac: Disable metalink if mbedTLS is specified - Found by fuzzing the config file. + Follow up to cdcc9df1 and #5006. Even though I mentioned mbedTLS as + being one of the backends that metalink needs to be disabled for, I + seem to have included it in the list of allowed SSL/TLS backends in + comnfigure.ac :( - Reported-by: Geeknik Labs + Closes #5013 + +- sha256: Tidy up following recent changes - Fixes https://github.com/curl/curl/issues/4767 + Reviewed-by: Daniel Stenberg + Closes #4956 -- [Xiang Xiao brought this change] +- sha256: Added WinCrypt implementation - lib: remove erroneous +x file permission on some c files - - Modified by commit eb9a604 accidentally. - - Closes https://github.com/curl/curl/pull/4756 +- sha256: Added SecureTransport implementation -- [Xiang Xiao brought this change] +- sha256: Added mbedtls implementation - lib: fix warnings found when porting to NuttX - - - Undefine DEBUGASSERT in curl_setup_once.h in case it was already - defined as a system macro. - - - Don't compile write32_le in curl_endian unless - CURL_SIZEOF_CURL_OFF_T > 4, since it's only used by Curl_write64_le. - - - Include in socketpair.c. - - Closes https://github.com/curl/curl/pull/4756 +- sha256: Added GNU TLS gcrypt implementation -- os400: Add missing CURLE error constants - - Bug: https://github.com/curl/curl/pull/4754#issuecomment-569126922 - Reported-by: Emil Engler +- sha256: Added GNU TLS Nettle implementation -- CURLOPT_HEADERFUNCTION.3: Document that size is always 1 - - For compatibility with `fwrite`, the `CURLOPT_HEADERFUNCTION` callback - is passed two `size_t` parameters which, when multiplied, designate the - number of bytes of data passed in. In practice, CURL always sets the - first parameter (`size`) to 1. - - This practice is also enshrined in documentation and cannot be changed - in future. The documentation states that the default callback is - `fwrite`, which means `fwrite` must be a suitable function for this - purpose. However, the documentation also states that the callback must - return the number of *bytes* it successfully handled, whereas ISO C - `fwrite` returns the number of items (each of size `size`) which it - wrote. The only way these numbers can be equal is if `size` is 1. - - Since `size` is 1 and can never be changed in future anyway, document - that fact explicitly and let users rely on it. - - Reported-by: Frank Gevaerts - Commit-message-by: Christopher Head - - Ref: https://github.com/curl/curl/pull/2787 +Jay Satiro (2 Mar 2020) +- curl_escape.3: Add a link to curl_free - Fixes https://github.com/curl/curl/issues/4758 + Ref: https://github.com/curl/curl/pull/5016#issuecomment-593628582 -- examples/postinmemory.c: Call curl_global_cleanup always - - Prior to this change curl_global_cleanup was not called if - curl_easy_init failed. +- curl_getenv.3: Fix the memory handling description - Reported-by: kouzhudong@users.noreply.github.com + - Tell the user to call curl_free() to free the pointer returned by + curl_getenv(). - Fixes https://github.com/curl/curl/issues/4751 - -Daniel Stenberg (21 Dec 2019) -- url2file.c: fix copyright year + Prior to this change the user was directed to call free(), but that + would not work in cases where the library and application use separate C + runtimes and therefore have separate heap memory management. - Follow-up to 525787269599b5 + Closes https://github.com/curl/curl/pull/5016 -- [Rickard Hallerbäck brought this change] +Daniel Stenberg (2 Mar 2020) +- [Nick Zitzmann brought this change] - examples/url2file.c: corrected a comment + md4: use init/update/final functions in Secure Transport - The comment was confusing and suggested that setting CURLOPT_NOPROGRESS - to 0L would both enable and disable debug output at the same time, like - a Schrödinger's cat of CURLOPTs. + We can use CC_MD4_Init/Update/Final without having to allocate memory + directly. - Closes #4745 - -- HISTORY: OSS-Fuzz started fuzzing libcurl in 2017 + Closes #4979 -- RELEASE-NOTES: synced +Marc Hoersken (2 Mar 2020) +- ci/tests: some MacOS builds randomly take longer than 20min -Jay Satiro (20 Dec 2019) -- ngtcp2: Support the latest update key callback type - - - Remove our cb_update_key in favor of ngtcp2's new - ngtcp2_crypto_update_key_cb which does the same thing. - - Several days ago the ngtcp2_update_key callback function prototype was - changed in ngtcp2/ngtcp2@42ce09c. Though it would be possible to - fix up our cb_update_key for that change they also added - ngtcp2_crypto_update_key_cb which does the same thing so we'll use that - instead. +Daniel Stenberg (2 Mar 2020) +- multi_wait: stop loop when sread() returns zero - Ref: https://github.com/ngtcp2/ngtcp2/commit/42ce09c + It's unclear why it would ever return zero here, but this change fixes + Robert's problem and it shouldn't loop forever... - Closes https://github.com/curl/curl/pull/4735 + Reported-by: Robert Dunaj + Bug: https://curl.haxx.se/mail/archive-2020-02/0011.html + Closes #5019 -Daniel Stenberg (19 Dec 2019) -- sws: search for "Testno:" header uncondtionally if no testno - - Even if the initial request line wasn't found. With the fix to 1455, the - test number is now detected correctly. +- http: mark POSTs with no body as "upload done" from the start - (Problem found when running tests in random order.) + As we have logic that checks if we get a >= 400 reponse code back before + the upload is done, which then got confused since it wasn't "done" but + yet there was no data to send! - Closes #4744 + Reported-by: IvanoG on github + Fixes #4996 + Closes #5002 -- tests: set LC_ALL in more tests +- tests: disable 962, 963 and 964 on Windows - Follow-up to 23208e330ac0c21 + These tests are also doing UTF-8 SMTP. - Closes #4743 + Follow-up to df207d2dd93b9e73 -- test165: set LC_ALL=en_US.UTF-8 too - - On my current Debian Unstable with libidn2 2.2.0, I get an error if - LC_ALL is set to blank. Then curl errors out with: +Marc Hoersken (2 Mar 2020) +- ci/tests: fine-tune Azure Pipeline timeouts with a small puffer + +Daniel Stenberg (2 Mar 2020) +- configure: bump the AC_COPYRIGHT year range + +- [Steve Holme brought this change] + + tests: disable SMTP UTF-8 tests on Windows - curl: (3) Failed to convert www.åäö.se to ACE; could not convert string to UTF-8 + Fixes #4988 + Closes #4992 + +- formdata/mime: copyright year range update - Closes #4738 + Due to the merge/revert cycle -- curl.h: add two defines for the "pre ISO C" case +- Revert "mime: latch last read callback status." - Without this fix, this caused a compilation failure on AIX with IBM xlc - 13.1.3 compiler. + This reverts commit 87869e38d7afdec3ef1bb4965711458b088e254f. - Reported-by: Ram Krushna Mishra - Fixes #4739 - Closes #4740 + Fixes #5014 + Closes #5015 + Reopens #4833 -- create_conn: prefer multiplexing to using new connections +- Revert "mime: do not perform more than one read in a row" - ... as it would previously prefer new connections rather than - multiplexing in most conditions! The (now removed) code was a leftover - from the Pipelining code that was translated wrongly into a - multiplex-only world. + This reverts commit ed0f357f7d25566110d4302f33759f4ffb5a6f83. + +- Revert "mime: fix the binary encoder to handle large data properly" - Reported-by: Kunal Ekawde - Bug: https://curl.haxx.se/mail/lib-2019-12/0060.html - Closes #4732 + This reverts commit b2caaa0681f329eed317ffb6ae6927f4a539f0c1. -- test1456: remove the use of a fixed local port +- altsvc: both h3 backends now speak h3-27 - Fixup the test to instead not compare the port number. It sometimes - caused problems like this: + ... also updated the HTTP3 build description for ngtcp2 accordingly. + +- [Patrick Monnerat brought this change] + + mime: fix the binary encoder to handle large data properly - "curl: (45) bind failed with errno 98: Address already in use" + New test 666 checks this is effective. + As upload buffer size is significant in this kind of tests, shorten it + in similar test 652. - Closes #4733 + Fixes #4860 + Reported-by: RuurdBeerstra on github -Jay Satiro (18 Dec 2019) -- CURLOPT_QUOTE.3: fix typos +- [Patrick Monnerat brought this change] + + mime: do not perform more than one read in a row - Prior to this change the EXAMPLE in the QUOTE/PREQUOTE/POSTQUOTE man - pages would not compile because a variable name was incorrect. + Input buffer filling may delay the data sending if data reads are slow. + To overcome this problem, file and callback data reads do not accumulate + in buffer anymore. All other data (memory data and mime framing) are + considered as fast and still concatenated in buffer. + As this may highly impact performance in terms of data overhead, an early + end of part data check is added to spare a read call. + When encoding a part's data, an encoder may require more bytes than made + available by a single read. In this case, the above rule does not apply + and reads are performed until the encoder is able to deliver some data. - Reported-by: Bylon2@users.noreply.github.com + Tests 643, 644, 645, 650 and 654 have been adapted to the output data + changes, with test data size reduced to avoid the boredom of long lists of + 1-byte chunks in verification data. + New test 664 checks mimepost using single-byte read callback with encoder. + New test 665 checks the end of part data early detection. - Fixes https://github.com/curl/curl/issues/4736 + Fixes #4826 + Reported-by: MrdUkk on github -- [Gisle Vanem brought this change] +- [Patrick Monnerat brought this change] - strerror: Fix compiler warning "empty expression" - - - Remove the final semi-colon in the SEC2TXT() macro definition. + mime: latch last read callback status. - Before: #define SEC2TXT(sec) case sec: txt = #sec; break; + In case a read callback returns a status (pause, abort, eof, + error) instead of a byte count, drain the bytes read so far but + remember this status for further processing. + Takes care of not losing data when pausing, and properly resume a + paused mime structure when requested. + New tests 670-673 check unpausing cases, with easy or multi + interface and mime or form api. - After: #define SEC2TXT(sec) case sec: txt = #sec; break + Fixes #4813 + Reported-by: MrdUkk on github + Closes #4833 + +Steve Holme (1 Mar 2020) +- unit1651: Fixed conversion compilation warning - Prior to this change SEC2TXT(foo); would generate break;; which caused - the empty expression warning. + 371:17: warning: conversion to 'unsigned char' from 'int' may alter its + value [-Wconversion] - Ref: https://github.com/curl/curl/commit/5b22e1a#r36458547 + Closes #5008 -Daniel Stenberg (18 Dec 2019) -- curl/parseconfig: use curl_free() to free memory allocated by libcurl +- configure.ac: Disable metalink support if an incompatible SSL/TLS specified - Reported-by: bxac on github - Fixes #4730 - Closes #4731 - -- curl/parseconfig: fix mem-leak + tool_metalink only supports cryptography from OpenSSL, GnuTLS, NSS, + The Win32 Crypto library and Apple's Common Crypto library. - When looping, first trying '.curlrc' and then '_curlrc', the function - would not free the first string. + If an TLS backend such as mbedTLS or WolfSSL is specified then the + following error is given during compilation along, with a load of + unresolved extern errors: - Closes #4731 - -- CURLOPT_URL.3: "curl supports SMB version 1 (only)" + Can't compile METALINK support without a crypto library. - [skip ci] + Reviewed-by: Daniel Stenberg + Closes #5006 -- test1270: a basic -w redirect_url test +Marc Hoersken (1 Mar 2020) +- ci/tests: Update Azure DevOps pipeline job display names - Closes #4728 + Make the configure step more descriptive and align others. -- HISTORY: the SMB(S) support landed in 2014 +- ci/tests: Fix typo in previous commit 597cf2 -- define: remove HAVE_ENGINE_LOAD_BUILTIN_ENGINES, not used anymore - - It is covered by USE_OPENSSL_ENGINE now. - - Reported-by: Gisle Vanem - Bug: https://github.com/curl/curl/commit/87b9337c8f76c21c57b204e88b68c6ecf3bd1ac0#commitcomment-36447951 +- ci/tests: Make sure that the AZURE_ACCESS_TOKEN is available - Closes #4725 + For security reasons the access token is not available to PR builds. + Therefore we should not try to use the DevOps API with an empty token. diff --git a/libs/libcurl/docs/THANKS b/libs/libcurl/docs/THANKS index ccec12146e..9e037eecf1 100644 --- a/libs/libcurl/docs/THANKS +++ b/libs/libcurl/docs/THANKS @@ -135,6 +135,7 @@ Andrei Sedoi Andrei Valeriu BICA Andrei Virtosu Andrej E Baranov +Andrew Barnes Andrew Benham Andrew Biggs Andrew Bushnell @@ -158,7 +159,9 @@ Andy Fiddaman Andy Serpa Andy Tsouladze Angus Mackay +anio on github anshnd on github +Antarpreet Singh Anthon Pang Anthony Avina Anthony Bryan @@ -213,6 +216,7 @@ Bastien Bouclet Basuke Suzuki baumanj on github bdry on github +beckenc on github Ben Boeckel Ben Darnell Ben Greear @@ -343,6 +347,7 @@ Chris Flerackers Chris Gaukroger Chris Maltby Chris Mumford +Chris Paulson-Ellis Chris Roberts Chris Smowton Chris Young @@ -383,6 +388,7 @@ cmfrolick on github codesniffer13 on github Cody Jones Cody Mack +COFFEETALES on github coinhubs on github Colby Ranger Colin Blair @@ -426,6 +432,7 @@ Dan Donahue Dan Fandrich Dan Jacobson Dan Johnson +Dan Kenigsberg Dan Locks Dan McNulty Dan Nelson @@ -539,6 +546,7 @@ Dirk Eddelbuettel Dirk Feytons Dirk Manske Dirkjan Bussink +Diven Qi divinity76 on github dkjjr89 on github dkwolfe4 on github @@ -578,6 +586,7 @@ Drake Arconis dtmsecurity on github Duane Cathey Duncan Mac-Vicar Prett +Duncan Wilcox Dustin Boswell Dusty Mabe Duy Phan Thanh @@ -709,8 +718,10 @@ Fred Noz Fred Stluka Frederic Lepied Frederik B +Frederik Wedel-Heinen Fredrik Thulin FuccDucc on github +fullincome on github Gabriel Kuri Gabriel Sjoberg Garrett Holmstrom @@ -822,12 +833,14 @@ Hongli Lai Howard Blaise Howard Chu hsiao yi +htasta on github Hubert Kario Hugo van Kemenade Huzaifa Sidhpurwala huzunhao on github hydra3333 on github Hzhijun +iammrtau on github Ian D Allen Ian Fette Ian Ford @@ -854,6 +867,7 @@ infinnovation-dev on github Ingmar Runge Ingo Ralf Blum Ingo Wilken +Ionuț-Francisc Oancea Irfan Adilovic Ironbars13 on github Irving Wolfe @@ -920,6 +934,7 @@ Jason S. Priebe Javier Barroso Javier Blazquez Javier G. Sogo +Javier Navarro Javier Sixto Jay Austin Jayesh A Shah @@ -979,6 +994,7 @@ Jiri Dvorak Jiri Hruska Jiri Jaburek Jiří Malák +jmdavitt on github jnbr on github Jocelyn Jaubert Joe Halpin @@ -1161,6 +1177,7 @@ Kristian Köhntopp Kristian Mide Kristiyan Tsaklev Kristoffer Gleditsch +Kunal Chandarana Kunal Ekawde Kurt Fankhauser Kwon-Young Choi @@ -1249,6 +1266,7 @@ Luz Paz Luật Nguyễn Lyman Epp Lyndon Hill +M.R.T on github Maciej Karpiuk Maciej Puzio Maciej W. Rozycki @@ -1316,6 +1334,7 @@ Maros Priputen Marquis de Muesli Martijn Koster Martin Ankerl +Martin Bašti Martin C. Martin Martin Drasar Martin Dreher @@ -1386,6 +1405,7 @@ Melissa Mears Mert Yazıcıoğlu Mettgut Jamalla Michael Anti +Michael Baentsch Michael Benedict Michael Brehm Michael Calmer @@ -1407,6 +1427,8 @@ Michael Lee Michael Maltese Michael Mealling Michael Mueller +Michael Musset +Michael Olbrich Michael Osipov Michael Schmid Michael Smith @@ -1451,6 +1473,7 @@ Mike Revi Miklos Nemeth Miloš Ljumović Mingliang Zhu +Mingtao Yang Miroslav Franc Miroslav Spousta Mischa Salle @@ -1632,6 +1655,7 @@ Peter Gal Peter Heuchert Peter Hjalmarsson Peter Korsgaard +Peter Körner Peter Lamare Peter Lamberg Peter Laser @@ -1690,6 +1714,7 @@ Puneet Pawaia qiandu2006 on github Quagmire Quanah Gibson-Mount +Quentin Balland Quinn Slack R. Dennis Steed Radoslav Georgiev @@ -1721,6 +1746,7 @@ Ray Dassen Ray Pekowski Ray Satiro Razvan Cojocaru +rcombs on github Reed Loden Reinhard Max Reinout van Schouwen @@ -1796,6 +1822,7 @@ Robert Schumann Robert Weaver Robert Wruck Robin Cornelius +Robin Douine Robin Johnson Robin Kay Robson Braga Araujo @@ -1849,12 +1876,14 @@ Sam Deane Sam Hurst Sam Roth Sam Schanken +Samanta Navarro Sampo Kellomaki Samuel Díaz García Samuel Listopad Samuel Marks Samuel Surtees Samuel Thibault +Samuel Tranchet Sander Gates Sandor Feldi Santhana Todatry @@ -1924,6 +1953,7 @@ Siva Sivaraman SLDiggie on github smuellerDD on github sn on hackerone +sofaboss on github Somnath Kundu Song Ma Sonia Subramanian @@ -1947,6 +1977,7 @@ Stefan Grether Stefan Kanthak Stefan Krause Stefan Neis +Stefan Strogin Stefan Teleman Stefan Tomanek Stefan Ulrich diff --git a/libs/libcurl/include/README b/libs/libcurl/include/README deleted file mode 100644 index 091ef76d10..0000000000 --- a/libs/libcurl/include/README +++ /dev/null @@ -1,18 +0,0 @@ - _ _ ____ _ - ___| | | | _ \| | - / __| | | | |_) | | - | (__| |_| | _ <| |___ - \___|\___/|_| \_\_____| - -Include files for libcurl, external users. - -They're all placed in the curl subdirectory here for better fit in any kind -of environment. You must include files from here using... - - #include - -... style and point the compiler's include path to the directory holding the -curl subdirectory. It makes it more likely to survive future modifications. - -The public curl include files can be shared freely between different platforms -and different architectures. diff --git a/libs/libcurl/include/README.md b/libs/libcurl/include/README.md new file mode 100644 index 0000000000..bd28a30e85 --- /dev/null +++ b/libs/libcurl/include/README.md @@ -0,0 +1,14 @@ +# include + +Public include files for libcurl, external users. + +They're all placed in the curl subdirectory here for better fit in any kind of +environment. You must include files from here using... + + #include + +... style and point the compiler's include path to the directory holding the +curl subdirectory. It makes it more likely to survive future modifications. + +The public curl include files can be shared freely between different platforms +and different architectures. diff --git a/libs/libcurl/include/curl/curl.h b/libs/libcurl/include/curl/curl.h index 5aeaca91d0..9026aa5c16 100644 --- a/libs/libcurl/include/curl/curl.h +++ b/libs/libcurl/include/curl/curl.h @@ -610,6 +610,7 @@ typedef enum { error */ CURLE_HTTP3, /* 95 - An HTTP/3 layer problem */ CURLE_QUIC_CONNECT_ERROR, /* 96 - QUIC connection error */ + CURLE_PROXY, /* 97 - proxy handshake error */ CURL_LAST /* never use! */ } CURLcode; @@ -689,6 +690,48 @@ typedef enum { #endif /*!CURL_NO_OLDIES*/ +/* + * Proxy error codes. Returned in CURLINFO_PROXY_ERROR if CURLE_PROXY was + * return for the transfers. + */ +typedef enum { + CURLPX_OK, + CURLPX_BAD_ADDRESS_TYPE, + CURLPX_BAD_VERSION, + CURLPX_CLOSED, + CURLPX_GSSAPI, + CURLPX_GSSAPI_PERMSG, + CURLPX_GSSAPI_PROTECTION, + CURLPX_IDENTD, + CURLPX_IDENTD_DIFFER, + CURLPX_LONG_HOSTNAME, + CURLPX_LONG_PASSWD, + CURLPX_LONG_USER, + CURLPX_NO_AUTH, + CURLPX_RECV_ADDRESS, + CURLPX_RECV_AUTH, + CURLPX_RECV_CONNECT, + CURLPX_RECV_REQACK, + CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED, + CURLPX_REPLY_COMMAND_NOT_SUPPORTED, + CURLPX_REPLY_CONNECTION_REFUSED, + CURLPX_REPLY_GENERAL_SERVER_FAILURE, + CURLPX_REPLY_HOST_UNREACHABLE, + CURLPX_REPLY_NETWORK_UNREACHABLE, + CURLPX_REPLY_NOT_ALLOWED, + CURLPX_REPLY_TTL_EXPIRED, + CURLPX_REPLY_UNASSIGNED, + CURLPX_REQUEST_FAILED, + CURLPX_RESOLVE_HOST, + CURLPX_SEND_AUTH, + CURLPX_SEND_CONNECT, + CURLPX_SEND_REQUEST, + CURLPX_UNKNOWN_FAIL, + CURLPX_UNKNOWN_MODE, + CURLPX_USER_REJECTED, + CURLPX_LAST /* never use */ +} CURLproxycode; + /* This prototype applies to all conversion callbacks */ typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length); @@ -789,6 +832,7 @@ enum curl_khstat { CURLKHSTAT_DEFER, /* do not accept it, but we can't answer right now so this causes a CURLE_DEFER error but otherwise the connection will be left intact etc */ + CURLKHSTAT_FINE_REPLACE, /* accept and replace the wrong key*/ CURLKHSTAT_LAST /* not for use, only a marker for last-in-list */ }; @@ -958,17 +1002,27 @@ typedef enum { #define CURLOPT(na,t,nu) na = t + nu -/* handy aliases that make no run-time difference */ -#define CURLOPTTYPE_STRINGPOINT CURLOPTTYPE_OBJECTPOINT +/* CURLOPT aliases that make no run-time difference */ + +/* 'char *' argument to a string with a trailing zero */ +#define CURLOPTTYPE_STRINGPOINT CURLOPTTYPE_OBJECTPOINT + +/* 'struct curl_slist *' argument */ #define CURLOPTTYPE_SLISTPOINT CURLOPTTYPE_OBJECTPOINT +/* 'void *' argument passed untouched to callback */ +#define CURLOPTTYPE_CBPOINT CURLOPTTYPE_OBJECTPOINT + +/* 'long' argument with a set of values/bitmask */ +#define CURLOPTTYPE_VALUES CURLOPTTYPE_LONG + /* * All CURLOPT_* values. */ typedef enum { /* This is the FILE * or void * the regular output should be written to. */ - CURLOPT(CURLOPT_WRITEDATA, CURLOPTTYPE_OBJECTPOINT, 1), + CURLOPT(CURLOPT_WRITEDATA, CURLOPTTYPE_CBPOINT, 1), /* The full URL to get/put */ CURLOPT(CURLOPT_URL, CURLOPTTYPE_STRINGPOINT, 2), @@ -991,7 +1045,7 @@ typedef enum { /* not used */ /* Specified file stream to upload from (use as input): */ - CURLOPT(CURLOPT_READDATA, CURLOPTTYPE_OBJECTPOINT, 9), + CURLOPT(CURLOPT_READDATA, CURLOPTTYPE_CBPOINT, 9), /* Buffer to receive error messages in, must be at least CURL_ERROR_SIZE * bytes big. */ @@ -1076,7 +1130,7 @@ typedef enum { /* send FILE * or void * to store headers to, if you use a callback it is simply passed to the callback unmodified */ - CURLOPT(CURLOPT_HEADERDATA, CURLOPTTYPE_OBJECTPOINT, 29), + CURLOPT(CURLOPT_HEADERDATA, CURLOPTTYPE_CBPOINT, 29), /* point to a file to read the initial cookies from, also enables "cookie awareness" */ @@ -1084,10 +1138,10 @@ typedef enum { /* What version to specifically try to use. See CURL_SSLVERSION defines below. */ - CURLOPT(CURLOPT_SSLVERSION, CURLOPTTYPE_LONG, 32), + CURLOPT(CURLOPT_SSLVERSION, CURLOPTTYPE_VALUES, 32), /* What kind of HTTP time condition to use, see defines */ - CURLOPT(CURLOPT_TIMECONDITION, CURLOPTTYPE_LONG, 33), + CURLOPT(CURLOPT_TIMECONDITION, CURLOPTTYPE_VALUES, 33), /* Time to use with the above condition. Specified in number of seconds since 1 Jan 1970 */ @@ -1141,7 +1195,7 @@ typedef enum { /* Specify whether to read the user+password from the .netrc or the URL. * This must be one of the CURL_NETRC_* enums below. */ - CURLOPT(CURLOPT_NETRC, CURLOPTTYPE_LONG, 51), + CURLOPT(CURLOPT_NETRC, CURLOPTTYPE_VALUES, 51), /* use Location: Luke! */ CURLOPT(CURLOPT_FOLLOWLOCATION, CURLOPTTYPE_LONG, 52), @@ -1162,8 +1216,8 @@ typedef enum { /* Data passed to the CURLOPT_PROGRESSFUNCTION and CURLOPT_XFERINFOFUNCTION callbacks */ - CURLOPT(CURLOPT_PROGRESSDATA, CURLOPTTYPE_OBJECTPOINT, 57), -#define CURLOPT_XFERINFODATA CURLOPT_PROGRESSDATA + CURLOPT(CURLOPT_XFERINFODATA, CURLOPTTYPE_CBPOINT, 57), +#define CURLOPT_PROGRESSDATA CURLOPT_XFERINFODATA /* We want the referrer field set automatically when following locations */ CURLOPT(CURLOPT_AUTOREFERER, CURLOPTTYPE_LONG, 58), @@ -1258,7 +1312,7 @@ typedef enum { /* Specify which HTTP version to use! This must be set to one of the CURL_HTTP_VERSION* enums set below. */ - CURLOPT(CURLOPT_HTTP_VERSION, CURLOPTTYPE_LONG, 84), + CURLOPT(CURLOPT_HTTP_VERSION, CURLOPTTYPE_VALUES, 84), /* Specifically switch on or off the FTP engine's use of the EPSV command. By default, that one will always be attempted before the more traditional @@ -1296,7 +1350,7 @@ typedef enum { CURLOPT(CURLOPT_DEBUGFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 94), /* set the data for the debug function */ - CURLOPT(CURLOPT_DEBUGDATA, CURLOPTTYPE_OBJECTPOINT, 95), + CURLOPT(CURLOPT_DEBUGDATA, CURLOPTTYPE_CBPOINT, 95), /* mark this as start of a cookie session */ CURLOPT(CURLOPT_COOKIESESSION, CURLOPTTYPE_LONG, 96), @@ -1319,7 +1373,7 @@ typedef enum { /* indicates type of proxy. accepted values are CURLPROXY_HTTP (default), CURLPROXY_HTTPS, CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and CURLPROXY_SOCKS5. */ - CURLOPT(CURLOPT_PROXYTYPE, CURLOPTTYPE_LONG, 101), + CURLOPT(CURLOPT_PROXYTYPE, CURLOPTTYPE_VALUES, 101), /* Set the Accept-Encoding string. Use this to tell a server you would like the response to be compressed. Before 7.21.6, this was known as @@ -1345,7 +1399,7 @@ typedef enum { /* Set this to a bitmask value to enable the particular authentications methods you like. Use this in combination with CURLOPT_USERPWD. Note that setting multiple bits may cause extra network round-trips. */ - CURLOPT(CURLOPT_HTTPAUTH, CURLOPTTYPE_LONG, 107), + CURLOPT(CURLOPT_HTTPAUTH, CURLOPTTYPE_VALUES, 107), /* Set the ssl context callback function, currently only for OpenSSL or WolfSSL ssl_ctx, or mbedTLS mbedtls_ssl_config in the second argument. @@ -1354,7 +1408,7 @@ typedef enum { /* Set the userdata for the ssl context callback function's third argument */ - CURLOPT(CURLOPT_SSL_CTX_DATA, CURLOPTTYPE_OBJECTPOINT, 109), + CURLOPT(CURLOPT_SSL_CTX_DATA, CURLOPTTYPE_CBPOINT, 109), /* FTP Option that causes missing dirs to be created on the remote server. In 7.19.4 we introduced the convenience enums for this option using the @@ -1365,7 +1419,7 @@ typedef enum { /* Set this to a bitmask value to enable the particular authentications methods you like. Use this in combination with CURLOPT_PROXYUSERPWD. Note that setting multiple bits may cause extra network round-trips. */ - CURLOPT(CURLOPT_PROXYAUTH, CURLOPTTYPE_LONG, 111), + CURLOPT(CURLOPT_PROXYAUTH, CURLOPTTYPE_VALUES, 111), /* FTP option that changes the timeout, in seconds, associated with getting a response. This is different from transfer timeout time and @@ -1377,7 +1431,7 @@ typedef enum { /* Set this option to one of the CURL_IPRESOLVE_* defines (see below) to tell libcurl to resolve names to those IP versions only. This only has affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */ - CURLOPT(CURLOPT_IPRESOLVE, CURLOPTTYPE_LONG, 113), + CURLOPT(CURLOPT_IPRESOLVE, CURLOPTTYPE_VALUES, 113), /* Set this option to limit the size of a file that will be downloaded from an HTTP or FTP server. @@ -1412,7 +1466,7 @@ typedef enum { CURLUSESSL_CONTROL - SSL for the control connection or fail CURLUSESSL_ALL - SSL for all communication or fail */ - CURLOPT(CURLOPT_USE_SSL, CURLOPTTYPE_LONG, 119), + CURLOPT(CURLOPT_USE_SSL, CURLOPTTYPE_VALUES, 119), /* The _LARGE version of the standard POSTFIELDSIZE option */ CURLOPT(CURLOPT_POSTFIELDSIZE_LARGE, CURLOPTTYPE_OFF_T, 120), @@ -1438,10 +1492,10 @@ typedef enum { CURLFTPAUTH_SSL - try "AUTH SSL" first, then TLS CURLFTPAUTH_TLS - try "AUTH TLS" first, then SSL */ - CURLOPT(CURLOPT_FTPSSLAUTH, CURLOPTTYPE_LONG, 129), + CURLOPT(CURLOPT_FTPSSLAUTH, CURLOPTTYPE_VALUES, 129), CURLOPT(CURLOPT_IOCTLFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 130), - CURLOPT(CURLOPT_IOCTLDATA, CURLOPTTYPE_OBJECTPOINT, 131), + CURLOPT(CURLOPT_IOCTLDATA, CURLOPTTYPE_CBPOINT, 131), /* 132 OBSOLETE. Gone in 7.16.0 */ /* 133 OBSOLETE. Gone in 7.16.0 */ @@ -1464,7 +1518,7 @@ typedef enum { /* Select "file method" to use when doing FTP, see the curl_ftpmethod above. */ - CURLOPT(CURLOPT_FTP_FILEMETHOD, CURLOPTTYPE_LONG, 138), + CURLOPT(CURLOPT_FTP_FILEMETHOD, CURLOPTTYPE_VALUES, 138), /* Local port number to bind the socket to */ CURLOPT(CURLOPT_LOCALPORT, CURLOPTTYPE_LONG, 139), @@ -1501,14 +1555,14 @@ typedef enum { /* callback function for setting socket options */ CURLOPT(CURLOPT_SOCKOPTFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 148), - CURLOPT(CURLOPT_SOCKOPTDATA, CURLOPTTYPE_OBJECTPOINT, 149), + CURLOPT(CURLOPT_SOCKOPTDATA, CURLOPTTYPE_CBPOINT, 149), /* set to 0 to disable session ID re-use for this transfer, default is enabled (== 1) */ CURLOPT(CURLOPT_SSL_SESSIONID_CACHE, CURLOPTTYPE_LONG, 150), /* allowed SSH authentication methods */ - CURLOPT(CURLOPT_SSH_AUTH_TYPES, CURLOPTTYPE_LONG, 151), + CURLOPT(CURLOPT_SSH_AUTH_TYPES, CURLOPTTYPE_VALUES, 151), /* Used by scp/sftp to do public/private key authentication */ CURLOPT(CURLOPT_SSH_PUBLIC_KEYFILE, CURLOPTTYPE_STRINGPOINT, 152), @@ -1533,7 +1587,7 @@ typedef enum { /* Set the behaviour of POST when redirecting. Values must be set to one of CURL_REDIR* defines below. This used to be called CURLOPT_POST301 */ - CURLOPT(CURLOPT_POSTREDIR, CURLOPTTYPE_LONG, 161), + CURLOPT(CURLOPT_POSTREDIR, CURLOPTTYPE_VALUES, 161), /* used by scp/sftp to verify the host's public key */ CURLOPT(CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, CURLOPTTYPE_STRINGPOINT, 162), @@ -1543,7 +1597,7 @@ typedef enum { CURL_SOCKET_BAD. The callback should have type curl_opensocket_callback */ CURLOPT(CURLOPT_OPENSOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 163), - CURLOPT(CURLOPT_OPENSOCKETDATA, CURLOPTTYPE_OBJECTPOINT, 164), + CURLOPT(CURLOPT_OPENSOCKETDATA, CURLOPTTYPE_CBPOINT, 164), /* POST volatile input fields. */ CURLOPT(CURLOPT_COPYPOSTFIELDS, CURLOPTTYPE_OBJECTPOINT, 165), @@ -1553,7 +1607,7 @@ typedef enum { /* Callback function for seeking in the input stream */ CURLOPT(CURLOPT_SEEKFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 167), - CURLOPT(CURLOPT_SEEKDATA, CURLOPTTYPE_OBJECTPOINT, 168), + CURLOPT(CURLOPT_SEEKDATA, CURLOPTTYPE_CBPOINT, 168), /* CRL file */ CURLOPT(CURLOPT_CRLFILE, CURLOPTTYPE_STRINGPOINT, 169), @@ -1614,7 +1668,7 @@ typedef enum { CURLOPT(CURLOPT_SSH_KEYFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 184), /* set the SSH host key callback custom pointer */ - CURLOPT(CURLOPT_SSH_KEYDATA, CURLOPTTYPE_OBJECTPOINT, 185), + CURLOPT(CURLOPT_SSH_KEYDATA, CURLOPTTYPE_CBPOINT, 185), /* set the SMTP mail originator */ CURLOPT(CURLOPT_MAIL_FROM, CURLOPTTYPE_STRINGPOINT, 186), @@ -1626,7 +1680,7 @@ typedef enum { CURLOPT(CURLOPT_FTP_USE_PRET, CURLOPTTYPE_LONG, 188), /* RTSP request method (OPTIONS, SETUP, PLAY, etc...) */ - CURLOPT(CURLOPT_RTSP_REQUEST, CURLOPTTYPE_LONG, 189), + CURLOPT(CURLOPT_RTSP_REQUEST, CURLOPTTYPE_VALUES, 189), /* The RTSP session identifier */ CURLOPT(CURLOPT_RTSP_SESSION_ID, CURLOPTTYPE_STRINGPOINT, 190), @@ -1644,7 +1698,7 @@ typedef enum { CURLOPT(CURLOPT_RTSP_SERVER_CSEQ, CURLOPTTYPE_LONG, 194), /* The stream to pass to INTERLEAVEFUNCTION. */ - CURLOPT(CURLOPT_INTERLEAVEDATA, CURLOPTTYPE_OBJECTPOINT, 195), + CURLOPT(CURLOPT_INTERLEAVEDATA, CURLOPTTYPE_CBPOINT, 195), /* Let the application define a custom write method for RTP data */ CURLOPT(CURLOPT_INTERLEAVEFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 196), @@ -1664,10 +1718,10 @@ typedef enum { CURLOPT(CURLOPT_FNMATCH_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 200), /* Let the application define custom chunk data pointer */ - CURLOPT(CURLOPT_CHUNK_DATA, CURLOPTTYPE_OBJECTPOINT, 201), + CURLOPT(CURLOPT_CHUNK_DATA, CURLOPTTYPE_CBPOINT, 201), /* FNMATCH_FUNCTION user pointer */ - CURLOPT(CURLOPT_FNMATCH_DATA, CURLOPTTYPE_OBJECTPOINT, 202), + CURLOPT(CURLOPT_FNMATCH_DATA, CURLOPTTYPE_CBPOINT, 202), /* send linked-list of name:port:address sets */ CURLOPT(CURLOPT_RESOLVE, CURLOPTTYPE_SLISTPOINT, 203), @@ -1696,10 +1750,10 @@ typedef enum { /* Callback function for closing socket (instead of close(2)). The callback should have type curl_closesocket_callback */ CURLOPT(CURLOPT_CLOSESOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 208), - CURLOPT(CURLOPT_CLOSESOCKETDATA, CURLOPTTYPE_OBJECTPOINT, 209), + CURLOPT(CURLOPT_CLOSESOCKETDATA, CURLOPTTYPE_CBPOINT, 209), /* allow GSSAPI credential delegation */ - CURLOPT(CURLOPT_GSSAPI_DELEGATION, CURLOPTTYPE_LONG, 210), + CURLOPT(CURLOPT_GSSAPI_DELEGATION, CURLOPTTYPE_VALUES, 210), /* Set the name servers to use for DNS resolution */ CURLOPT(CURLOPT_DNS_SERVERS, CURLOPTTYPE_STRINGPOINT, 211), @@ -1716,7 +1770,7 @@ typedef enum { CURLOPT(CURLOPT_TCP_KEEPINTVL, CURLOPTTYPE_LONG, 215), /* Enable/disable specific SSL features with a bitmask, see CURLSSLOPT_* */ - CURLOPT(CURLOPT_SSL_OPTIONS, CURLOPTTYPE_LONG, 216), + CURLOPT(CURLOPT_SSL_OPTIONS, CURLOPTTYPE_VALUES, 216), /* Set the SMTP auth originator */ CURLOPT(CURLOPT_MAIL_AUTH, CURLOPTTYPE_STRINGPOINT, 217), @@ -1763,7 +1817,7 @@ typedef enum { CURLOPT(CURLOPT_PROXYHEADER, CURLOPTTYPE_SLISTPOINT, 228), /* Pass in a bitmask of "header options" */ - CURLOPT(CURLOPT_HEADEROPT, CURLOPTTYPE_LONG, 229), + CURLOPT(CURLOPT_HEADEROPT, CURLOPTTYPE_VALUES, 229), /* The public key in DER form used to validate the peer public key this option is used only if SSL_VERIFYPEER is true */ @@ -1835,7 +1889,7 @@ typedef enum { /* What version to specifically try to use for proxy. See CURL_SSLVERSION defines below. */ - CURLOPT(CURLOPT_PROXY_SSLVERSION, CURLOPTTYPE_LONG, 250), + CURLOPT(CURLOPT_PROXY_SSLVERSION, CURLOPTTYPE_VALUES, 250), /* Set a username for authenticated TLS for proxy */ CURLOPT(CURLOPT_PROXY_TLSAUTH_USERNAME, CURLOPTTYPE_STRINGPOINT, 251), @@ -1909,7 +1963,7 @@ typedef enum { CURLOPT(CURLOPT_RESOLVER_START_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 272), /* User data to pass to the resolver start callback. */ - CURLOPT(CURLOPT_RESOLVER_START_DATA, CURLOPTTYPE_OBJECTPOINT, 273), + CURLOPT(CURLOPT_RESOLVER_START_DATA, CURLOPTTYPE_CBPOINT, 273), /* send HAProxy PROXY protocol header? */ CURLOPT(CURLOPT_HAPROXYPROTOCOL, CURLOPTTYPE_LONG, 274), @@ -1940,7 +1994,7 @@ typedef enum { CURLOPT(CURLOPT_TRAILERFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 283), /* pointer to be passed to HTTP_TRAILER_FUNCTION */ - CURLOPT(CURLOPT_TRAILERDATA, CURLOPTTYPE_OBJECTPOINT, 284), + CURLOPT(CURLOPT_TRAILERDATA, CURLOPTTYPE_CBPOINT, 284), /* set this to 1L to allow HTTP/0.9 responses or 0L to disallow */ CURLOPT(CURLOPT_HTTP09_ALLOWED, CURLOPTTYPE_LONG, 285), @@ -1971,6 +2025,12 @@ typedef enum { CURLOPT(CURLOPT_PROXY_ISSUERCERT, CURLOPTTYPE_STRINGPOINT, 296), CURLOPT(CURLOPT_PROXY_ISSUERCERT_BLOB, CURLOPTTYPE_BLOB, 297), + /* the EC curves requested by the TLS client (RFC 8422, 5.1); + * OpenSSL support via 'set_groups'/'set_curves': + * https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set1_groups.html + */ + CURLOPT(CURLOPT_SSL_EC_CURVES, CURLOPTTYPE_STRINGPOINT, 298), + CURLOPT_LASTENTRY /* the last unused */ } CURLoption; @@ -2643,8 +2703,9 @@ typedef enum { CURLINFO_APPCONNECT_TIME_T = CURLINFO_OFF_T + 56, CURLINFO_RETRY_AFTER = CURLINFO_OFF_T + 57, CURLINFO_EFFECTIVE_METHOD = CURLINFO_STRING + 58, + CURLINFO_PROXY_ERROR = CURLINFO_LONG + 59, - CURLINFO_LASTONE = 58 + CURLINFO_LASTONE = 59 } CURLINFO; /* CURLINFO_RESPONSE_CODE is the new name for the option previously known as @@ -2903,6 +2964,7 @@ CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask); #include "easy.h" /* nothing in curl is fun without the easy stuff */ #include "multi.h" #include "urlapi.h" +#include "options.h" /* the typechecker doesn't work in C++ (yet) */ #if defined(__GNUC__) && defined(__GNUC_MINOR__) && \ diff --git a/libs/libcurl/include/curl/curlver.h b/libs/libcurl/include/curl/curlver.h index ce0f7ac907..2c3010e195 100644 --- a/libs/libcurl/include/curl/curlver.h +++ b/libs/libcurl/include/curl/curlver.h @@ -30,12 +30,12 @@ /* This is the version number of the libcurl package from which this header file origins: */ -#define LIBCURL_VERSION "7.72.0" +#define LIBCURL_VERSION "7.73.0" /* The numeric version number is also available "in parts" by using these defines: */ #define LIBCURL_VERSION_MAJOR 7 -#define LIBCURL_VERSION_MINOR 72 +#define LIBCURL_VERSION_MINOR 73 #define LIBCURL_VERSION_PATCH 0 /* This is the numeric version of the libcurl version number, meant for easier @@ -57,7 +57,7 @@ CURL_VERSION_BITS() macro since curl's own configure script greps for it and needs it to contain the full number. */ -#define LIBCURL_VERSION_NUM 0x074800 +#define LIBCURL_VERSION_NUM 0x074900 /* * This is the date and time when the full source package was created. The @@ -68,7 +68,7 @@ * * "2007-11-23" */ -#define LIBCURL_TIMESTAMP "2020-08-19" +#define LIBCURL_TIMESTAMP "2020-10-14" #define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|(z)) #define CURL_AT_LEAST_VERSION(x,y,z) \ diff --git a/libs/libcurl/include/curl/options.h b/libs/libcurl/include/curl/options.h new file mode 100644 index 0000000000..f3bd8e191d --- /dev/null +++ b/libs/libcurl/include/curl/options.h @@ -0,0 +1,68 @@ +#ifndef CURLINC_OPTIONS_H +#define CURLINC_OPTIONS_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 2018 - 2020, 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 + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + CURLOT_LONG, /* long (a range of values) */ + CURLOT_VALUES, /* (a defined set or bitmask) */ + CURLOT_OFF_T, /* curl_off_t (a range of values) */ + CURLOT_OBJECT, /* pointer (void *) */ + CURLOT_STRING, /* (char * to zero terminated buffer) */ + CURLOT_SLIST, /* (struct curl_slist *) */ + CURLOT_CBPTR, /* (void * passed as-is to a callback) */ + CURLOT_BLOB, /* blob (struct curl_blob *) */ + CURLOT_FUNCTION /* function pointer */ +} curl_easytype; + +/* Flag bits */ + +/* "alias" means it is provided for old programs to remain functional, + we prefer another name */ +#define CURLOT_FLAG_ALIAS (1<<0) + +/* The CURLOPTTYPE_* id ranges can still be used to figure out what type/size + to use for curl_easy_setopt() for the given id */ +struct curl_easyoption { + const char *name; + CURLoption id; + curl_easytype type; + unsigned int flags; +}; + +CURL_EXTERN const struct curl_easyoption * +curl_easy_option_by_name(const char *name); + +CURL_EXTERN const struct curl_easyoption * +curl_easy_option_by_id (CURLoption id); + +CURL_EXTERN const struct curl_easyoption * +curl_easy_option_next(const struct curl_easyoption *prev); + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif +#endif /* CURLINC_OPTIONS_H */ diff --git a/libs/libcurl/include/curl/typecheck-gcc.h b/libs/libcurl/include/curl/typecheck-gcc.h index f8cb921f2e..318ab0abb3 100644 --- a/libs/libcurl/include/curl/typecheck-gcc.h +++ b/libs/libcurl/include/curl/typecheck-gcc.h @@ -292,6 +292,7 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t, (option) == CURLOPT_PROXY_CAINFO || \ (option) == CURLOPT_PROXY_CAPATH || \ (option) == CURLOPT_PROXY_CRLFILE || \ + (option) == CURLOPT_PROXY_ISSUERCERT || \ (option) == CURLOPT_PROXY_KEYPASSWD || \ (option) == CURLOPT_PROXY_PINNEDPUBLICKEY || \ (option) == CURLOPT_PROXY_SERVICE_NAME || \ @@ -334,6 +335,7 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t, (option) == CURLOPT_USERNAME || \ (option) == CURLOPT_USERPWD || \ (option) == CURLOPT_XOAUTH2_BEARER || \ + (option) == CURLOPT_SSL_EC_CURVES || \ 0) /* evaluates to true if option takes a curl_write_callback argument */ @@ -357,7 +359,6 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t, (option) == CURLOPT_INTERLEAVEDATA || \ (option) == CURLOPT_IOCTLDATA || \ (option) == CURLOPT_OPENSOCKETDATA || \ - (option) == CURLOPT_PRIVATE || \ (option) == CURLOPT_PROGRESSDATA || \ (option) == CURLOPT_READDATA || \ (option) == CURLOPT_SEEKDATA || \ diff --git a/libs/libcurl/libcurl.vcxproj b/libs/libcurl/libcurl.vcxproj index 03c3680d48..fca047ec2d 100644 --- a/libs/libcurl/libcurl.vcxproj +++ b/libs/libcurl/libcurl.vcxproj @@ -122,6 +122,12 @@ NotUsing + + NotUsing + + + NotUsing + NotUsing @@ -281,9 +287,6 @@ NotUsing - - NotUsing - NotUsing @@ -455,6 +458,7 @@ + @@ -468,7 +472,6 @@ - @@ -479,6 +482,7 @@ + diff --git a/libs/libcurl/libcurl.vcxproj.filters b/libs/libcurl/libcurl.vcxproj.filters index 522c003d21..1b7c14dc7b 100644 --- a/libs/libcurl/libcurl.vcxproj.filters +++ b/libs/libcurl/libcurl.vcxproj.filters @@ -95,6 +95,12 @@ Source Files + + Source Files + + + Source Files + Source Files @@ -254,9 +260,6 @@ Source Files - - Source Files - Source Files @@ -529,6 +532,9 @@ Header Files + + Header Files + Header Files @@ -568,9 +574,6 @@ Header Files - - Header Files - Header Files @@ -598,6 +601,9 @@ Header Files + + Header Files + Header Files diff --git a/libs/libcurl/src/CMakeLists.txt b/libs/libcurl/src/CMakeLists.txt index 1d71e14904..911c9096dd 100644 --- a/libs/libcurl/src/CMakeLists.txt +++ b/libs/libcurl/src/CMakeLists.txt @@ -50,15 +50,6 @@ endif() # # strtoofft.c - specify later # ) -# # if we have Kerberos 4, right now this is never on -# #OPTION(CURL_KRB4 "Use Kerberos 4" OFF) -# IF(CURL_KRB4) -# SET(CSOURCES ${CSOURCES} -# krb4.c -# security.c -# ) -# ENDIF(CURL_KRB4) - # #OPTION(CURL_MALLOC_DEBUG "Debug mallocs in Curl" OFF) # MARK_AS_ADVANCED(CURL_MALLOC_DEBUG) # IF(CURL_MALLOC_DEBUG) diff --git a/libs/libcurl/src/Makefile.Watcom b/libs/libcurl/src/Makefile.Watcom deleted file mode 100644 index 6ea975b537..0000000000 --- a/libs/libcurl/src/Makefile.Watcom +++ /dev/null @@ -1,274 +0,0 @@ -#*************************************************************************** -# _ _ ____ _ -# Project ___| | | | _ \| | -# / __| | | | |_) | | -# | (__| |_| | _ <| |___ -# \___|\___/|_| \_\_____| -# -# Copyright (C) 2005 - 2009, Gisle Vanem . -# Copyright (C) 2005 - 2020, 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 -# are also available at https://curl.haxx.se/docs/copyright.html. -# -# You may opt to use, copy, modify, merge, publish, distribute and/or sell -# copies of the Software, and permit persons to whom the Software is -# furnished to do so, under the terms of the COPYING file. -# -# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY -# KIND, either express or implied. -# -#*************************************************************************** - -# -# Watcom / OpenWatcom / Win32 makefile for libcurl. -# - -.ERASE - -!if $(__VERSION__) < 1280 -!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!message ! This Open Watcom version is too old and is no longer supported ! -!message ! Please download latest version from www.openwatcom.org ! -!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!error Unsupported version of Open Watcom -!endif - -!ifndef %watcom -!error WATCOM environment variable not set! -!endif - -# In order to process Makefile.inc wmake must be called with -u switch! -!ifndef %MAKEFLAGS -!error You MUST call wmake with the -u switch! -!endif - -!ifdef %libname -LIBNAME = $(%libname) -!else -LIBNAME = libcurl -!endif -TARGETS = $(LIBNAME).dll $(LIBNAME).lib - -CC = wcc386 -LD = wlink -AR = wlib -RC = wrc - -!ifdef __LOADDLL__ -! loaddll wcc386 wccd386 -! loaddll wpp386 wppd386 -! loaddll wlib wlibd -! loaddll wlink wlinkd -!endif - -!ifdef __LINUX__ -CP = cp -MD = mkdir -p -!else -CP = copy 2>NUL -MD = mkdir -!endif -!if $(__VERSION__) > 1290 -RD = rm -rf -!else ifdef __UNIX__ -RD = rm -rf -!else -RD = rmdir /q /s 2>NUL -!endif - -SYS_INCL = -I"$(%watcom)/h/nt" -I"$(%watcom)/h" - -CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm & - -wcd=201 -bt=nt -d+ -dWIN32 & - -dBUILDING_LIBCURL -I. -I"../include" $(SYS_INCL) - -!ifdef %debug -DEBUG = -dDEBUG=1 -dDEBUGBUILD -CFLAGS += -d3 $(DEBUG) -!else -CFLAGS += -d0 -!endif - -!ifdef %use_ipv6 -CFLAGS += -d_WIN32_WINNT=0x0501 -dENABLE_IPV6 -!endif - -!ifdef %use_sspi -CFLAGS += -dUSE_WINDOWS_SSPI -!endif - -!ifdef %use_winssl -CFLAGS += -dUSE_WINDOWS_SSPI -CFLAGS += -DUSE_SCHANNEL -!endif - -!ifdef %use_winidn -CFLAGS += -dWINVER=0x0600 -dUSE_WIN32_IDN -! if $(__VERSION__) <= 1290 -CFLAGS += -dWANT_IDN_PROTOTYPES -! endif -!endif - -# -# Change to suite. -# -!ifdef %zlib_root -ZLIB_ROOT = $(%zlib_root) -!else -ZLIB_ROOT = ../../zlib-1.2.8 -!endif - -!ifdef %libssh2_root -LIBSSH2_ROOT = $(%libssh2_root) -!else -LIBSSH2_ROOT = ../../libssh2-1.5.0 -!endif - -!ifdef %librtmp_root -LIBRTMP_ROOT = $(%librtmp_root) -!else -LIBRTMP_ROOT = ../../rtmpdump-2.3 -!endif - -!ifdef %openssl_root -OPENSSL_ROOT = $(%openssl_root) -!else -OPENSSL_ROOT = ../../openssl-1.0.2a -!endif - -!ifdef %ares_root -ARES_ROOT = $(%ares_root) -!else -ARES_ROOT = ../ares -!endif - -!ifdef %use_zlib -CFLAGS += -dHAVE_ZLIB_H -dHAVE_LIBZ -I"$(ZLIB_ROOT)" -!endif - -!ifdef %use_rtmp -CFLAGS += -dUSE_LIBRTMP -I"$(LIBRTMP_ROOT)" -!endif - -!ifdef %use_ssh2 -CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H -I"$(LIBSSH2_ROOT)/include" -I"$(LIBSSH2_ROOT)/win32" -!endif - -!ifdef %use_ssl -CFLAGS += -wcd=138 -dUSE_OPENSSL -I"$(OPENSSL_ROOT)/inc32" -!endif - -!ifdef %use_ares -CFLAGS += -dUSE_ARES -I"$(ARES_ROOT)" -!endif - -!ifdef %use_watt32 -CFLAGS += -dUSE_WATT32 -I"$(%watt_root)/inc" -!endif - -OBJ_BASE = WC_Win32.obj -!if $(__VERSION__) > 1290 -OBJ_STAT = $(OBJ_BASE)/stat -OBJ_DYN = $(OBJ_BASE)/dyn -!else ifdef __UNIX__ -OBJ_STAT = $(OBJ_BASE)/stat -OBJ_DYN = $(OBJ_BASE)/dyn -!else -OBJ_STAT = $(OBJ_BASE)\stat -OBJ_DYN = $(OBJ_BASE)\dyn -!endif - -LINK_ARG = $(OBJ_DYN)/wlink.arg -LIB_ARG = $(OBJ_STAT)/wlib.arg - -!include Makefile.inc - -OBJS1 = ./$(CSOURCES:.c=.obj) -OBJS2 = $(OBJS1:vtls/=) -OBJS3 = $(OBJS2:vauth/=) -OBJS4 = $(OBJS3: = ./) -OBJS_STAT = $(OBJS4:./=$(OBJ_STAT)/) -OBJS_DYN = $(OBJS4:./=$(OBJ_DYN)/) - -RESOURCE = $(OBJ_DYN)/libcurl.res - -DIRS = $(OBJ_BASE) $(OBJ_BASE)/stat $(OBJ_BASE)/dyn - -.c : vauth vtls - -all: $(DIRS) $(TARGETS) .SYMBOLIC - @echo Welcome to libcurl - -clean: .SYMBOLIC - -rm -f $(OBJS_STAT) - -rm -f $(OBJS_DYN) - -rm -f $(RESOURCE) $(LINK_ARG) $(LIB_ARG) - -vclean distclean: clean .SYMBOLIC - -rm -f $(TARGETS) $(LIBNAME).map $(LIBNAME).sym - -$(RD) $(OBJ_STAT) - -$(RD) $(OBJ_DYN) - -$(RD) $(OBJ_BASE) - -$(DIRS): - -$(MD) $^@ - -$(LIBNAME).dll: $(OBJS_DYN) $(RESOURCE) $(__MAKEFILES__) - %create $(LINK_ARG) - @%append $(LINK_ARG) system nt dll -!ifdef %debug - @%append $(LINK_ARG) debug all - @%append $(LINK_ARG) option symfile -!endif - @%append $(LINK_ARG) option quiet, caseexact, eliminate - @%append $(LINK_ARG) option map=$(OBJ_DYN)/$(LIBNAME).map - @%append $(LINK_ARG) option implib=$(LIBNAME)_imp.lib - @%append $(LINK_ARG) option res=$(RESOURCE) - @for %f in ($(OBJS_DYN)) do @%append $(LINK_ARG) file %f - @%append $(LINK_ARG) library wldap32.lib -!ifdef %use_watt32 - @%append $(LINK_ARG) library '$(%watt_root)/lib/wattcpw_imp.lib' -!else - @%append $(LINK_ARG) library ws2_32.lib -!endif -!ifdef %use_zlib - @%append $(LINK_ARG) library '$(ZLIB_ROOT)/zlib.lib' -!endif -!ifdef %use_rtmp - @%append $(LINK_ARG) library '$(LIBRTMP_ROOT)/librtmp/librtmp.lib' -!endif -!ifdef %use_ssh2 - @%append $(LINK_ARG) library '$(LIBSSH2_ROOT)/win32/libssh2.lib' -!endif -!ifdef %use_ssl - @%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/libeay32.lib' - @%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/ssleay32.lib' -!endif -!ifdef %use_ares - @%append $(LINK_ARG) library '$(ARES_ROOT)/cares.lib' -!endif -!ifdef %use_winidn -! if $(__VERSION__) > 1290 - @%append $(LINK_ARG) library normaliz.lib -! else - @%append $(LINK_ARG) import '_IdnToAscii@20' 'NORMALIZ.DLL'.'IdnToAscii' - @%append $(LINK_ARG) import '_IdnToUnicode@20' 'NORMALIZ.DLL'.'IdnToUnicode' -! endif -!endif - $(LD) name $^@ @$(LINK_ARG) - -$(LIBNAME).lib: $(OBJS_STAT) - %create $(LIB_ARG) - @for %f in ($<) do @%append $(LIB_ARG) +- %f - $(AR) -q -b -c -pa $^@ @$(LIB_ARG) - -$(RESOURCE): libcurl.rc - $(RC) $(DEBUG) -q -r -zm -bt=nt -I"../include" $(SYS_INCL) $[@ -fo=$^@ - -.c{$(OBJ_DYN)}.obj: - $(CC) $(CFLAGS) -bd -br $[@ -fo=$^@ - -.c{$(OBJ_STAT)}.obj: - $(CC) $(CFLAGS) -DCURL_STATICLIB $[@ -fo=$^@ diff --git a/libs/libcurl/src/Makefile.am b/libs/libcurl/src/Makefile.am index f2886ec63c..78b068ffe1 100644 --- a/libs/libcurl/src/Makefile.am +++ b/libs/libcurl/src/Makefile.am @@ -27,7 +27,7 @@ EXTRA_DIST = Makefile.m32 config-win32.h config-win32ce.h \ config-plan9.h config-riscos.h config-mac.h curl_config.h.in \ makefile.dj config-dos.h libcurl.plist libcurl.rc config-amigaos.h \ makefile.amiga Makefile.netware nwlib.c nwos.c config-win32ce.h \ - config-os400.h setup-os400.h config-symbian.h Makefile.Watcom \ + config-os400.h setup-os400.h \ config-tpf.h mk-ca-bundle.pl mk-ca-bundle.vbs $(CMAKE_DIST) \ firefox-db2pem.sh config-vxworks.h Makefile.vxworks checksrc.pl \ setup-win32.h @@ -66,7 +66,7 @@ endif # Prevent LIBS from being used for all link targets LIBS = $(BLANK_AT_MAKETIME) -VERSIONINFO=-version-info 10:0:6 +VERSIONINFO=-version-info 11:0:7 # This flag accepts an argument of the form current[:revision[:age]]. So, # passing -version-info 3:12:1 sets current to 3, revision to 12, and age to # 1. @@ -153,3 +153,6 @@ TIDY:=clang-tidy tidy: $(TIDY) $(CSOURCES) $(TIDYFLAGS) -- $(AM_CPPFLAGS) $(CPPFLAGS) -DHAVE_CONFIG_H + +optiontable: + perl optiontable.pl < $(top_srcdir)/include/curl/curl.h > easyoptions.c diff --git a/libs/libcurl/src/Makefile.in b/libs/libcurl/src/Makefile.in index 3cdf666b3c..ca348fbaf5 100644 --- a/libs/libcurl/src/Makefile.in +++ b/libs/libcurl/src/Makefile.in @@ -215,20 +215,21 @@ am__objects_1 = libcurl_la-altsvc.lo libcurl_la-amigaos.lo \ libcurl_la-parsedate.lo libcurl_la-pingpong.lo \ libcurl_la-pop3.lo libcurl_la-progress.lo libcurl_la-psl.lo \ libcurl_la-doh.lo libcurl_la-rand.lo libcurl_la-rename.lo \ - libcurl_la-rtsp.lo libcurl_la-security.lo libcurl_la-select.lo \ - libcurl_la-sendf.lo libcurl_la-setopt.lo libcurl_la-sha256.lo \ - libcurl_la-share.lo libcurl_la-slist.lo libcurl_la-smb.lo \ - libcurl_la-smtp.lo libcurl_la-socketpair.lo \ - libcurl_la-socks.lo libcurl_la-socks_gssapi.lo \ - libcurl_la-socks_sspi.lo libcurl_la-speedcheck.lo \ - libcurl_la-splay.lo libcurl_la-strcase.lo libcurl_la-strdup.lo \ + libcurl_la-rtsp.lo libcurl_la-select.lo libcurl_la-sendf.lo \ + libcurl_la-setopt.lo libcurl_la-sha256.lo libcurl_la-share.lo \ + libcurl_la-slist.lo libcurl_la-smb.lo libcurl_la-smtp.lo \ + libcurl_la-socketpair.lo libcurl_la-socks.lo \ + libcurl_la-socks_gssapi.lo libcurl_la-socks_sspi.lo \ + libcurl_la-speedcheck.lo libcurl_la-splay.lo \ + libcurl_la-strcase.lo libcurl_la-strdup.lo \ libcurl_la-strerror.lo libcurl_la-strtok.lo \ libcurl_la-strtoofft.lo libcurl_la-system_win32.lo \ libcurl_la-telnet.lo libcurl_la-tftp.lo libcurl_la-timeval.lo \ libcurl_la-transfer.lo libcurl_la-urlapi.lo \ libcurl_la-version.lo libcurl_la-warnless.lo \ libcurl_la-wildcard.lo libcurl_la-x509asn1.lo \ - libcurl_la-dynbuf.lo libcurl_la-version_win32.lo + libcurl_la-dynbuf.lo libcurl_la-version_win32.lo \ + libcurl_la-easyoptions.lo libcurl_la-easygetopt.lo am__dirstamp = $(am__leading_dot)dirstamp am__objects_2 = vauth/libcurl_la-cleartext.lo vauth/libcurl_la-cram.lo \ vauth/libcurl_la-digest.lo vauth/libcurl_la-digest_sspi.lo \ @@ -303,22 +304,22 @@ am__objects_9 = libcurlu_la-altsvc.lo libcurlu_la-amigaos.lo \ libcurlu_la-pingpong.lo libcurlu_la-pop3.lo \ libcurlu_la-progress.lo libcurlu_la-psl.lo libcurlu_la-doh.lo \ libcurlu_la-rand.lo libcurlu_la-rename.lo libcurlu_la-rtsp.lo \ - libcurlu_la-security.lo libcurlu_la-select.lo \ - libcurlu_la-sendf.lo libcurlu_la-setopt.lo \ - libcurlu_la-sha256.lo libcurlu_la-share.lo \ - libcurlu_la-slist.lo libcurlu_la-smb.lo libcurlu_la-smtp.lo \ - libcurlu_la-socketpair.lo libcurlu_la-socks.lo \ - libcurlu_la-socks_gssapi.lo libcurlu_la-socks_sspi.lo \ - libcurlu_la-speedcheck.lo libcurlu_la-splay.lo \ - libcurlu_la-strcase.lo libcurlu_la-strdup.lo \ - libcurlu_la-strerror.lo libcurlu_la-strtok.lo \ - libcurlu_la-strtoofft.lo libcurlu_la-system_win32.lo \ - libcurlu_la-telnet.lo libcurlu_la-tftp.lo \ - libcurlu_la-timeval.lo libcurlu_la-transfer.lo \ - libcurlu_la-urlapi.lo libcurlu_la-version.lo \ - libcurlu_la-warnless.lo libcurlu_la-wildcard.lo \ - libcurlu_la-x509asn1.lo libcurlu_la-dynbuf.lo \ - libcurlu_la-version_win32.lo + libcurlu_la-select.lo libcurlu_la-sendf.lo \ + libcurlu_la-setopt.lo libcurlu_la-sha256.lo \ + libcurlu_la-share.lo libcurlu_la-slist.lo libcurlu_la-smb.lo \ + libcurlu_la-smtp.lo libcurlu_la-socketpair.lo \ + libcurlu_la-socks.lo libcurlu_la-socks_gssapi.lo \ + libcurlu_la-socks_sspi.lo libcurlu_la-speedcheck.lo \ + libcurlu_la-splay.lo libcurlu_la-strcase.lo \ + libcurlu_la-strdup.lo libcurlu_la-strerror.lo \ + libcurlu_la-strtok.lo libcurlu_la-strtoofft.lo \ + libcurlu_la-system_win32.lo libcurlu_la-telnet.lo \ + libcurlu_la-tftp.lo libcurlu_la-timeval.lo \ + libcurlu_la-transfer.lo libcurlu_la-urlapi.lo \ + libcurlu_la-version.lo libcurlu_la-warnless.lo \ + libcurlu_la-wildcard.lo libcurlu_la-x509asn1.lo \ + libcurlu_la-dynbuf.lo libcurlu_la-version_win32.lo \ + libcurlu_la-easyoptions.lo libcurlu_la-easygetopt.lo am__objects_10 = vauth/libcurlu_la-cleartext.lo \ vauth/libcurlu_la-cram.lo vauth/libcurlu_la-digest.lo \ vauth/libcurlu_la-digest_sspi.lo \ @@ -394,6 +395,8 @@ am__depfiles_remade = ./$(DEPDIR)/libcurl_la-altsvc.Plo \ ./$(DEPDIR)/libcurl_la-dotdot.Plo \ ./$(DEPDIR)/libcurl_la-dynbuf.Plo \ ./$(DEPDIR)/libcurl_la-easy.Plo \ + ./$(DEPDIR)/libcurl_la-easygetopt.Plo \ + ./$(DEPDIR)/libcurl_la-easyoptions.Plo \ ./$(DEPDIR)/libcurl_la-escape.Plo \ ./$(DEPDIR)/libcurl_la-file.Plo \ ./$(DEPDIR)/libcurl_la-fileinfo.Plo \ @@ -443,7 +446,6 @@ am__depfiles_remade = ./$(DEPDIR)/libcurl_la-altsvc.Plo \ ./$(DEPDIR)/libcurl_la-psl.Plo ./$(DEPDIR)/libcurl_la-rand.Plo \ ./$(DEPDIR)/libcurl_la-rename.Plo \ ./$(DEPDIR)/libcurl_la-rtsp.Plo \ - ./$(DEPDIR)/libcurl_la-security.Plo \ ./$(DEPDIR)/libcurl_la-select.Plo \ ./$(DEPDIR)/libcurl_la-sendf.Plo \ ./$(DEPDIR)/libcurl_la-setopt.Plo \ @@ -506,6 +508,8 @@ am__depfiles_remade = ./$(DEPDIR)/libcurl_la-altsvc.Plo \ ./$(DEPDIR)/libcurlu_la-dotdot.Plo \ ./$(DEPDIR)/libcurlu_la-dynbuf.Plo \ ./$(DEPDIR)/libcurlu_la-easy.Plo \ + ./$(DEPDIR)/libcurlu_la-easygetopt.Plo \ + ./$(DEPDIR)/libcurlu_la-easyoptions.Plo \ ./$(DEPDIR)/libcurlu_la-escape.Plo \ ./$(DEPDIR)/libcurlu_la-file.Plo \ ./$(DEPDIR)/libcurlu_la-fileinfo.Plo \ @@ -557,7 +561,6 @@ am__depfiles_remade = ./$(DEPDIR)/libcurl_la-altsvc.Plo \ ./$(DEPDIR)/libcurlu_la-rand.Plo \ ./$(DEPDIR)/libcurlu_la-rename.Plo \ ./$(DEPDIR)/libcurlu_la-rtsp.Plo \ - ./$(DEPDIR)/libcurlu_la-security.Plo \ ./$(DEPDIR)/libcurlu_la-select.Plo \ ./$(DEPDIR)/libcurlu_la-sendf.Plo \ ./$(DEPDIR)/libcurlu_la-setopt.Plo \ @@ -735,6 +738,7 @@ CURL_DISABLE_HTTP = @CURL_DISABLE_HTTP@ CURL_DISABLE_IMAP = @CURL_DISABLE_IMAP@ CURL_DISABLE_LDAP = @CURL_DISABLE_LDAP@ CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ +CURL_DISABLE_MQTT = @CURL_DISABLE_MQTT@ CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ @@ -742,7 +746,6 @@ CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ -CURL_ENABLE_MQTT = @CURL_ENABLE_MQTT@ CURL_LT_SHLIB_VERSIONED_FLAVOUR = @CURL_LT_SHLIB_VERSIONED_FLAVOUR@ CURL_NETWORK_AND_TIME_LIBS = @CURL_NETWORK_AND_TIME_LIBS@ CURL_NETWORK_LIBS = @CURL_NETWORK_LIBS@ @@ -944,7 +947,7 @@ EXTRA_DIST = Makefile.m32 config-win32.h config-win32ce.h \ config-plan9.h config-riscos.h config-mac.h curl_config.h.in \ makefile.dj config-dos.h libcurl.plist libcurl.rc config-amigaos.h \ makefile.amiga Makefile.netware nwlib.c nwos.c config-win32ce.h \ - config-os400.h setup-os400.h config-symbian.h Makefile.Watcom \ + config-os400.h setup-os400.h \ config-tpf.h mk-ca-bundle.pl mk-ca-bundle.vbs $(CMAKE_DIST) \ firefox-db2pem.sh config-vxworks.h Makefile.vxworks checksrc.pl \ setup-win32.h @@ -977,7 +980,7 @@ lib_LTLIBRARIES = libcurl.la # For the full guide on libcurl ABI rules, see docs/libcurl/ABI AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/lib \ -I$(top_srcdir)/lib $(am__append_1) -DBUILDING_LIBCURL -VERSIONINFO = -version-info 10:0:6 +VERSIONINFO = -version-info 11:0:7 AM_LDFLAGS = AM_CFLAGS = libcurl_la_CPPFLAGS_EXTRA = $(am__append_7) $(am__append_8) @@ -1021,19 +1024,19 @@ LIB_CFILES = altsvc.c amigaos.c asyn-ares.c asyn-thread.c base64.c \ http_ntlm.c http_proxy.c idn_win32.c if2ip.c imap.c inet_ntop.c inet_pton.c \ krb5.c ldap.c llist.c md4.c md5.c memdebug.c mime.c mprintf.c mqtt.c \ multi.c netrc.c non-ascii.c nonblock.c openldap.c parsedate.c pingpong.c \ - pop3.c progress.c psl.c doh.c rand.c rename.c rtsp.c security.c select.c \ + pop3.c progress.c psl.c doh.c rand.c rename.c rtsp.c select.c \ sendf.c setopt.c sha256.c share.c slist.c smb.c smtp.c socketpair.c socks.c \ socks_gssapi.c socks_sspi.c speedcheck.c splay.c strcase.c strdup.c \ strerror.c strtok.c strtoofft.c system_win32.c telnet.c tftp.c timeval.c \ transfer.c urlapi.c version.c warnless.c wildcard.c x509asn1.c dynbuf.c \ - version_win32.c + version_win32.c easyoptions.c easygetopt.c LIB_HFILES = altsvc.h amigaos.h arpa_telnet.h asyn.h conncache.h connect.h \ content_encoding.h cookie.h curl_addrinfo.h curl_base64.h curl_ctype.h \ curl_des.h curl_endian.h curl_fnmatch.h curl_get_line.h curl_gethostname.h \ curl_gssapi.h curl_hmac.h curl_ldap.h curl_md4.h curl_md5.h curl_memory.h \ curl_memrchr.h curl_multibyte.h curl_ntlm_core.h curl_ntlm_wb.h curl_path.h \ - curl_printf.h curl_range.h curl_rtmp.h curl_sasl.h curl_sec.h curl_setup.h \ + curl_printf.h curl_range.h curl_rtmp.h curl_sasl.h curl_krb5.h curl_setup.h \ curl_setup_once.h curl_sha256.h curl_sspi.h curl_threads.h curlx.h dict.h \ dotdot.h easyif.h escape.h file.h fileinfo.h formdata.h ftp.h url.h \ ftplistparser.h getinfo.h gopher.h hash.h hostcheck.h hostip.h http.h \ @@ -1045,7 +1048,7 @@ LIB_HFILES = altsvc.h amigaos.h arpa_telnet.h asyn.h conncache.h connect.h \ smb.h smtp.h sockaddr.h socketpair.h socks.h speedcheck.h splay.h strcase.h \ strdup.h strerror.h strtok.h strtoofft.h system_win32.h telnet.h tftp.h \ timeval.h transfer.h urlapi-int.h urldata.h warnless.h wildcard.h \ - x509asn1.h dynbuf.h version_win32.h + x509asn1.h dynbuf.h version_win32.h easyoptions.h LIB_RCFILES = libcurl.rc CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES) \ @@ -1369,6 +1372,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-dotdot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-dynbuf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-easy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-easygetopt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-easyoptions.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-escape.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-fileinfo.Plo@am__quote@ # am--include-marker @@ -1420,7 +1425,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-rand.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-rename.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-rtsp.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-security.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-select.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-sendf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-setopt.Plo@am__quote@ # am--include-marker @@ -1484,6 +1488,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-dotdot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-dynbuf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-easy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-easygetopt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-easyoptions.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-escape.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-fileinfo.Plo@am__quote@ # am--include-marker @@ -1535,7 +1541,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-rand.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-rename.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-rtsp.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-security.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-select.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-sendf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-setopt.Plo@am__quote@ # am--include-marker @@ -2243,13 +2248,6 @@ libcurl_la-rtsp.lo: rtsp.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-rtsp.lo `test -f 'rtsp.c' || echo '$(srcdir)/'`rtsp.c -libcurl_la-security.lo: security.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-security.lo -MD -MP -MF $(DEPDIR)/libcurl_la-security.Tpo -c -o libcurl_la-security.lo `test -f 'security.c' || echo '$(srcdir)/'`security.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-security.Tpo $(DEPDIR)/libcurl_la-security.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='security.c' object='libcurl_la-security.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-security.lo `test -f 'security.c' || echo '$(srcdir)/'`security.c - libcurl_la-select.lo: select.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-select.lo -MD -MP -MF $(DEPDIR)/libcurl_la-select.Tpo -c -o libcurl_la-select.lo `test -f 'select.c' || echo '$(srcdir)/'`select.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-select.Tpo $(DEPDIR)/libcurl_la-select.Plo @@ -2467,6 +2465,20 @@ libcurl_la-version_win32.lo: version_win32.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-version_win32.lo `test -f 'version_win32.c' || echo '$(srcdir)/'`version_win32.c +libcurl_la-easyoptions.lo: easyoptions.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-easyoptions.lo -MD -MP -MF $(DEPDIR)/libcurl_la-easyoptions.Tpo -c -o libcurl_la-easyoptions.lo `test -f 'easyoptions.c' || echo '$(srcdir)/'`easyoptions.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-easyoptions.Tpo $(DEPDIR)/libcurl_la-easyoptions.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='easyoptions.c' object='libcurl_la-easyoptions.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-easyoptions.lo `test -f 'easyoptions.c' || echo '$(srcdir)/'`easyoptions.c + +libcurl_la-easygetopt.lo: easygetopt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-easygetopt.lo -MD -MP -MF $(DEPDIR)/libcurl_la-easygetopt.Tpo -c -o libcurl_la-easygetopt.lo `test -f 'easygetopt.c' || echo '$(srcdir)/'`easygetopt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-easygetopt.Tpo $(DEPDIR)/libcurl_la-easygetopt.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='easygetopt.c' object='libcurl_la-easygetopt.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-easygetopt.lo `test -f 'easygetopt.c' || echo '$(srcdir)/'`easygetopt.c + vauth/libcurl_la-cleartext.lo: vauth/cleartext.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vauth/libcurl_la-cleartext.lo -MD -MP -MF vauth/$(DEPDIR)/libcurl_la-cleartext.Tpo -c -o vauth/libcurl_la-cleartext.lo `test -f 'vauth/cleartext.c' || echo '$(srcdir)/'`vauth/cleartext.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vauth/$(DEPDIR)/libcurl_la-cleartext.Tpo vauth/$(DEPDIR)/libcurl_la-cleartext.Plo @@ -3272,13 +3284,6 @@ libcurlu_la-rtsp.lo: rtsp.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-rtsp.lo `test -f 'rtsp.c' || echo '$(srcdir)/'`rtsp.c -libcurlu_la-security.lo: security.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-security.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-security.Tpo -c -o libcurlu_la-security.lo `test -f 'security.c' || echo '$(srcdir)/'`security.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-security.Tpo $(DEPDIR)/libcurlu_la-security.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='security.c' object='libcurlu_la-security.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-security.lo `test -f 'security.c' || echo '$(srcdir)/'`security.c - libcurlu_la-select.lo: select.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-select.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-select.Tpo -c -o libcurlu_la-select.lo `test -f 'select.c' || echo '$(srcdir)/'`select.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-select.Tpo $(DEPDIR)/libcurlu_la-select.Plo @@ -3496,6 +3501,20 @@ libcurlu_la-version_win32.lo: version_win32.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-version_win32.lo `test -f 'version_win32.c' || echo '$(srcdir)/'`version_win32.c +libcurlu_la-easyoptions.lo: easyoptions.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-easyoptions.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-easyoptions.Tpo -c -o libcurlu_la-easyoptions.lo `test -f 'easyoptions.c' || echo '$(srcdir)/'`easyoptions.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-easyoptions.Tpo $(DEPDIR)/libcurlu_la-easyoptions.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='easyoptions.c' object='libcurlu_la-easyoptions.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-easyoptions.lo `test -f 'easyoptions.c' || echo '$(srcdir)/'`easyoptions.c + +libcurlu_la-easygetopt.lo: easygetopt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-easygetopt.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-easygetopt.Tpo -c -o libcurlu_la-easygetopt.lo `test -f 'easygetopt.c' || echo '$(srcdir)/'`easygetopt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-easygetopt.Tpo $(DEPDIR)/libcurlu_la-easygetopt.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='easygetopt.c' object='libcurlu_la-easygetopt.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-easygetopt.lo `test -f 'easygetopt.c' || echo '$(srcdir)/'`easygetopt.c + vauth/libcurlu_la-cleartext.lo: vauth/cleartext.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vauth/libcurlu_la-cleartext.lo -MD -MP -MF vauth/$(DEPDIR)/libcurlu_la-cleartext.Tpo -c -o vauth/libcurlu_la-cleartext.lo `test -f 'vauth/cleartext.c' || echo '$(srcdir)/'`vauth/cleartext.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) vauth/$(DEPDIR)/libcurlu_la-cleartext.Tpo vauth/$(DEPDIR)/libcurlu_la-cleartext.Plo @@ -3899,6 +3918,8 @@ distclean: distclean-am -rm -f ./$(DEPDIR)/libcurl_la-dotdot.Plo -rm -f ./$(DEPDIR)/libcurl_la-dynbuf.Plo -rm -f ./$(DEPDIR)/libcurl_la-easy.Plo + -rm -f ./$(DEPDIR)/libcurl_la-easygetopt.Plo + -rm -f ./$(DEPDIR)/libcurl_la-easyoptions.Plo -rm -f ./$(DEPDIR)/libcurl_la-escape.Plo -rm -f ./$(DEPDIR)/libcurl_la-file.Plo -rm -f ./$(DEPDIR)/libcurl_la-fileinfo.Plo @@ -3950,7 +3971,6 @@ distclean: distclean-am -rm -f ./$(DEPDIR)/libcurl_la-rand.Plo -rm -f ./$(DEPDIR)/libcurl_la-rename.Plo -rm -f ./$(DEPDIR)/libcurl_la-rtsp.Plo - -rm -f ./$(DEPDIR)/libcurl_la-security.Plo -rm -f ./$(DEPDIR)/libcurl_la-select.Plo -rm -f ./$(DEPDIR)/libcurl_la-sendf.Plo -rm -f ./$(DEPDIR)/libcurl_la-setopt.Plo @@ -4014,6 +4034,8 @@ distclean: distclean-am -rm -f ./$(DEPDIR)/libcurlu_la-dotdot.Plo -rm -f ./$(DEPDIR)/libcurlu_la-dynbuf.Plo -rm -f ./$(DEPDIR)/libcurlu_la-easy.Plo + -rm -f ./$(DEPDIR)/libcurlu_la-easygetopt.Plo + -rm -f ./$(DEPDIR)/libcurlu_la-easyoptions.Plo -rm -f ./$(DEPDIR)/libcurlu_la-escape.Plo -rm -f ./$(DEPDIR)/libcurlu_la-file.Plo -rm -f ./$(DEPDIR)/libcurlu_la-fileinfo.Plo @@ -4065,7 +4087,6 @@ distclean: distclean-am -rm -f ./$(DEPDIR)/libcurlu_la-rand.Plo -rm -f ./$(DEPDIR)/libcurlu_la-rename.Plo -rm -f ./$(DEPDIR)/libcurlu_la-rtsp.Plo - -rm -f ./$(DEPDIR)/libcurlu_la-security.Plo -rm -f ./$(DEPDIR)/libcurlu_la-select.Plo -rm -f ./$(DEPDIR)/libcurlu_la-sendf.Plo -rm -f ./$(DEPDIR)/libcurlu_la-setopt.Plo @@ -4238,6 +4259,8 @@ maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/libcurl_la-dotdot.Plo -rm -f ./$(DEPDIR)/libcurl_la-dynbuf.Plo -rm -f ./$(DEPDIR)/libcurl_la-easy.Plo + -rm -f ./$(DEPDIR)/libcurl_la-easygetopt.Plo + -rm -f ./$(DEPDIR)/libcurl_la-easyoptions.Plo -rm -f ./$(DEPDIR)/libcurl_la-escape.Plo -rm -f ./$(DEPDIR)/libcurl_la-file.Plo -rm -f ./$(DEPDIR)/libcurl_la-fileinfo.Plo @@ -4289,7 +4312,6 @@ maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/libcurl_la-rand.Plo -rm -f ./$(DEPDIR)/libcurl_la-rename.Plo -rm -f ./$(DEPDIR)/libcurl_la-rtsp.Plo - -rm -f ./$(DEPDIR)/libcurl_la-security.Plo -rm -f ./$(DEPDIR)/libcurl_la-select.Plo -rm -f ./$(DEPDIR)/libcurl_la-sendf.Plo -rm -f ./$(DEPDIR)/libcurl_la-setopt.Plo @@ -4353,6 +4375,8 @@ maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/libcurlu_la-dotdot.Plo -rm -f ./$(DEPDIR)/libcurlu_la-dynbuf.Plo -rm -f ./$(DEPDIR)/libcurlu_la-easy.Plo + -rm -f ./$(DEPDIR)/libcurlu_la-easygetopt.Plo + -rm -f ./$(DEPDIR)/libcurlu_la-easyoptions.Plo -rm -f ./$(DEPDIR)/libcurlu_la-escape.Plo -rm -f ./$(DEPDIR)/libcurlu_la-file.Plo -rm -f ./$(DEPDIR)/libcurlu_la-fileinfo.Plo @@ -4404,7 +4428,6 @@ maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/libcurlu_la-rand.Plo -rm -f ./$(DEPDIR)/libcurlu_la-rename.Plo -rm -f ./$(DEPDIR)/libcurlu_la-rtsp.Plo - -rm -f ./$(DEPDIR)/libcurlu_la-security.Plo -rm -f ./$(DEPDIR)/libcurlu_la-select.Plo -rm -f ./$(DEPDIR)/libcurlu_la-sendf.Plo -rm -f ./$(DEPDIR)/libcurlu_la-setopt.Plo @@ -4549,6 +4572,9 @@ checksrc: tidy: $(TIDY) $(CSOURCES) $(TIDYFLAGS) -- $(AM_CPPFLAGS) $(CPPFLAGS) -DHAVE_CONFIG_H +optiontable: + perl optiontable.pl < $(top_srcdir)/include/curl/curl.h > easyoptions.c + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/libs/libcurl/src/Makefile.inc b/libs/libcurl/src/Makefile.inc index ae3f961cf9..a2fd57a831 100644 --- a/libs/libcurl/src/Makefile.inc +++ b/libs/libcurl/src/Makefile.inc @@ -56,19 +56,19 @@ LIB_CFILES = altsvc.c amigaos.c asyn-ares.c asyn-thread.c base64.c \ http_ntlm.c http_proxy.c idn_win32.c if2ip.c imap.c inet_ntop.c inet_pton.c \ krb5.c ldap.c llist.c md4.c md5.c memdebug.c mime.c mprintf.c mqtt.c \ multi.c netrc.c non-ascii.c nonblock.c openldap.c parsedate.c pingpong.c \ - pop3.c progress.c psl.c doh.c rand.c rename.c rtsp.c security.c select.c \ + pop3.c progress.c psl.c doh.c rand.c rename.c rtsp.c select.c \ sendf.c setopt.c sha256.c share.c slist.c smb.c smtp.c socketpair.c socks.c \ socks_gssapi.c socks_sspi.c speedcheck.c splay.c strcase.c strdup.c \ strerror.c strtok.c strtoofft.c system_win32.c telnet.c tftp.c timeval.c \ transfer.c urlapi.c version.c warnless.c wildcard.c x509asn1.c dynbuf.c \ - version_win32.c + version_win32.c easyoptions.c easygetopt.c LIB_HFILES = altsvc.h amigaos.h arpa_telnet.h asyn.h conncache.h connect.h \ content_encoding.h cookie.h curl_addrinfo.h curl_base64.h curl_ctype.h \ curl_des.h curl_endian.h curl_fnmatch.h curl_get_line.h curl_gethostname.h \ curl_gssapi.h curl_hmac.h curl_ldap.h curl_md4.h curl_md5.h curl_memory.h \ curl_memrchr.h curl_multibyte.h curl_ntlm_core.h curl_ntlm_wb.h curl_path.h \ - curl_printf.h curl_range.h curl_rtmp.h curl_sasl.h curl_sec.h curl_setup.h \ + curl_printf.h curl_range.h curl_rtmp.h curl_sasl.h curl_krb5.h curl_setup.h \ curl_setup_once.h curl_sha256.h curl_sspi.h curl_threads.h curlx.h dict.h \ dotdot.h easyif.h escape.h file.h fileinfo.h formdata.h ftp.h url.h \ ftplistparser.h getinfo.h gopher.h hash.h hostcheck.h hostip.h http.h \ @@ -80,7 +80,7 @@ LIB_HFILES = altsvc.h amigaos.h arpa_telnet.h asyn.h conncache.h connect.h \ smb.h smtp.h sockaddr.h socketpair.h socks.h speedcheck.h splay.h strcase.h \ strdup.h strerror.h strtok.h strtoofft.h system_win32.h telnet.h tftp.h \ timeval.h transfer.h urlapi-int.h urldata.h warnless.h wildcard.h \ - x509asn1.h dynbuf.h version_win32.h + x509asn1.h dynbuf.h version_win32.h easyoptions.h LIB_RCFILES = libcurl.rc diff --git a/libs/libcurl/src/Makefile.m32 b/libs/libcurl/src/Makefile.m32 index 02b31106c6..37887eed5d 100644 --- a/libs/libcurl/src/Makefile.m32 +++ b/libs/libcurl/src/Makefile.m32 @@ -298,7 +298,12 @@ endif ifdef ZSTD INCLUDES += -I"$(ZSTD_PATH)/include" CFLAGS += -DHAVE_ZSTD - DLL_LIBS += -L"$(ZSTD_PATH)/lib" -lzstd + DLL_LIBS += -L"$(ZSTD_PATH)/lib" + ifdef ZSTD_LIBS + DLL_LIBS += $(ZSTD_LIBS) + else + DLL_LIBS += -lzstd + endif endif ifdef BROTLI INCLUDES += -I"$(BROTLI_PATH)/include" diff --git a/libs/libcurl/src/altsvc.c b/libs/libcurl/src/altsvc.c index c2ec489d9e..d3deba3e83 100644 --- a/libs/libcurl/src/altsvc.c +++ b/libs/libcurl/src/altsvc.c @@ -302,11 +302,12 @@ CURLcode Curl_altsvc_ctrl(struct altsvcinfo *asi, const long ctrl) * Curl_altsvc_cleanup() frees an altsvc cache instance and all associated * resources. */ -void Curl_altsvc_cleanup(struct altsvcinfo *altsvc) +void Curl_altsvc_cleanup(struct altsvcinfo **altsvcp) { - struct curl_llist_element *e; - struct curl_llist_element *n; - if(altsvc) { + struct Curl_llist_element *e; + struct Curl_llist_element *n; + if(*altsvcp) { + struct altsvcinfo *altsvc = *altsvcp; for(e = altsvc->list.head; e; e = n) { struct altsvc *as = e->ptr; n = e->next; @@ -314,6 +315,7 @@ void Curl_altsvc_cleanup(struct altsvcinfo *altsvc) } free(altsvc->filename); free(altsvc); + *altsvcp = NULL; /* clear the pointer */ } } @@ -323,8 +325,8 @@ void Curl_altsvc_cleanup(struct altsvcinfo *altsvc) CURLcode Curl_altsvc_save(struct Curl_easy *data, struct altsvcinfo *altsvc, const char *file) { - struct curl_llist_element *e; - struct curl_llist_element *n; + struct Curl_llist_element *e; + struct Curl_llist_element *n; CURLcode result = CURLE_OK; FILE *out; char *tempstore; @@ -399,8 +401,8 @@ static CURLcode getalnum(const char **ptr, char *alpnbuf, size_t buflen) static void altsvc_flush(struct altsvcinfo *asi, enum alpnid srcalpnid, const char *srchost, unsigned short srcport) { - struct curl_llist_element *e; - struct curl_llist_element *n; + struct Curl_llist_element *e; + struct Curl_llist_element *n; for(e = asi->list.head; e; e = n) { struct altsvc *as = e->ptr; n = e->next; @@ -612,8 +614,8 @@ bool Curl_altsvc_lookup(struct altsvcinfo *asi, struct altsvc **dstentry, const int versions) /* one or more bits */ { - struct curl_llist_element *e; - struct curl_llist_element *n; + struct Curl_llist_element *e; + struct Curl_llist_element *n; time_t now = time(NULL); DEBUGASSERT(asi); DEBUGASSERT(srchost); diff --git a/libs/libcurl/src/altsvc.h b/libs/libcurl/src/altsvc.h index 578a4fbfb0..1aeb625ab4 100644 --- a/libs/libcurl/src/altsvc.h +++ b/libs/libcurl/src/altsvc.h @@ -46,12 +46,12 @@ struct altsvc { time_t expires; bool persist; int prio; - struct curl_llist_element node; + struct Curl_llist_element node; }; struct altsvcinfo { char *filename; - struct curl_llist list; /* list of entries */ + struct Curl_llist list; /* list of entries */ long flags; /* the publicly set bitmask */ }; @@ -61,7 +61,7 @@ CURLcode Curl_altsvc_load(struct altsvcinfo *asi, const char *file); CURLcode Curl_altsvc_save(struct Curl_easy *data, struct altsvcinfo *asi, const char *file); CURLcode Curl_altsvc_ctrl(struct altsvcinfo *asi, const long ctrl); -void Curl_altsvc_cleanup(struct altsvcinfo *altsvc); +void Curl_altsvc_cleanup(struct altsvcinfo **altsvc); CURLcode Curl_altsvc_parse(struct Curl_easy *data, struct altsvcinfo *altsvc, const char *value, enum alpnid srcalpn, const char *srchost, @@ -74,5 +74,6 @@ bool Curl_altsvc_lookup(struct altsvcinfo *asi, #else /* disabled */ #define Curl_altsvc_save(a,b,c) +#define Curl_altsvc_cleanup(x) #endif /* CURL_DISABLE_HTTP || USE_ALTSVC */ #endif /* HEADER_CURL_ALTSVC_H */ diff --git a/libs/libcurl/src/asyn-ares.c b/libs/libcurl/src/asyn-ares.c index e65150744c..725d6cd5c8 100644 --- a/libs/libcurl/src/asyn-ares.c +++ b/libs/libcurl/src/asyn-ares.c @@ -67,8 +67,8 @@ #include "select.h" #include "progress.h" -# if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \ - (defined(WIN32) || defined(__SYMBIAN32__)) +# if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \ + defined(WIN32) # define CARES_STATICLIB # endif # include diff --git a/libs/libcurl/src/base64.c b/libs/libcurl/src/base64.c index 643cef6251..ec632e6f7a 100644 --- a/libs/libcurl/src/base64.c +++ b/libs/libcurl/src/base64.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2019, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2020, 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 @@ -26,6 +26,9 @@ #if !defined(CURL_DISABLE_HTTP_AUTH) || defined(USE_SSH) || \ !defined(CURL_DISABLE_LDAP) || \ + !defined(CURL_DISABLE_SMTP) || \ + !defined(CURL_DISABLE_POP3) || \ + !defined(CURL_DISABLE_IMAP) || \ !defined(CURL_DISABLE_DOH) || defined(USE_SSL) #include "urldata.h" /* for the Curl_easy definition */ diff --git a/libs/libcurl/src/checksrc.pl b/libs/libcurl/src/checksrc.pl index 498da94bbc..78b9cef5bd 100644 --- a/libs/libcurl/src/checksrc.pl +++ b/libs/libcurl/src/checksrc.pl @@ -52,7 +52,7 @@ my %warnings_extended = ( my %warnings = ( 'LONGLINE' => "Line longer than $max_column", 'TABS' => 'TAB characters not allowed', - 'TRAILINGSPACE' => 'Trailing white space on the line', + 'TRAILINGSPACE' => 'Trailing whitespace on the line', 'CPPCOMMENTS' => '// comment detected', 'SPACEBEFOREPAREN' => 'space before an open parenthesis', 'SPACEAFTERPAREN' => 'space after open parenthesis', @@ -82,6 +82,9 @@ my %warnings = ( 'SNPRINTF' => 'use of snprintf', 'ONELINECONDITION' => 'conditional block on the same line as the if()', 'TYPEDEFSTRUCT' => 'typedefed struct', + 'DOBRACE' => 'A single space between do and open brace', + 'BRACEWHILE' => 'A single space between open brace and while', + 'EXCLAMATIONSPACE' => 'Whitespace after exclamation mark in expression', ); sub readskiplist { @@ -397,7 +400,7 @@ sub scanfile { checkwarn("TABS", $line, length($1), $file, $l, "Contains TAB character", 1); } - # detect trailing white space + # detect trailing whitespace if($l =~ /^(.*)[ \t]+\z/) { checkwarn("TRAILINGSPACE", $line, length($1), $file, $l, "Trailing whitespace"); @@ -439,7 +442,7 @@ sub scanfile { # crude attempt to detect // comments without too many false # positives - if($l =~ /^([^"\*]*)[^:"]\/\//) { + if($l =~ /^(([^"\*]*)[^:"]|)\/\//) { checkwarn("CPPCOMMENTS", $line, length($1), $file, $l, "\/\/ comment"); } @@ -468,6 +471,14 @@ sub scanfile { } } + # check spaces in 'do {' + if($nostr =~ /^( *)do( *)\{/ && length($2) != 1) { + checkwarn("DOBRACE", $line, length($1) + 2, $file, $l, "one space after do before brace"); + } + # check spaces in 'do {' + elsif($nostr =~ /^( *)\}( *)while/ && length($2) != 1) { + checkwarn("BRACEWHILE", $line, length($1) + 2, $file, $l, "one space between brace and while"); + } if($nostr =~ /^((.*\s)(if) *\()(.*)\)(.*)/) { my $pos = length($1); my $postparen = $5; @@ -715,6 +726,12 @@ sub scanfile { "typedef'ed struct"); } + if($nostr =~ /(.*)! +(\w|\()/) { + checkwarn("EXCLAMATIONSPACE", + $line, length($1)+1, $file, $ol, + "space after exclamation mark"); + } + # check for more than one consecutive space before open brace or # question mark. Skip lines containing strings since they make it hard # due to artificially getting multiple spaces diff --git a/libs/libcurl/src/config-symbian.h b/libs/libcurl/src/config-symbian.h deleted file mode 100644 index 7f17dce252..0000000000 --- a/libs/libcurl/src/config-symbian.h +++ /dev/null @@ -1,793 +0,0 @@ -#ifndef HEADER_CURL_CONFIG_SYMBIAN_H -#define HEADER_CURL_CONFIG_SYMBIAN_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2020, 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 - * are also available at https://curl.haxx.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ - -/* ================================================================ */ -/* Hand crafted config file for Symbian */ -/* ================================================================ */ - -/* Location of default ca bundle */ -/* #define CURL_CA_BUNDLE "/etc/pki/tls/certs/ca-bundle.crt"*/ - -/* Location of default ca path */ -/* #undef CURL_CA_PATH */ - -/* to disable cookies support */ -/* #undef CURL_DISABLE_COOKIES */ - -/* to disable cryptographic authentication */ -/* #undef CURL_DISABLE_CRYPTO_AUTH */ - -/* to disable DICT */ -/* #undef CURL_DISABLE_DICT */ - -/* to disable FILE */ -/* #undef CURL_DISABLE_FILE */ - -/* to disable FTP */ -/* #undef CURL_DISABLE_FTP */ - -/* to disable HTTP */ -/* #undef CURL_DISABLE_HTTP */ - -/* to disable LDAP */ -#define CURL_DISABLE_LDAP 1 - -/* to disable LDAPS */ -#define CURL_DISABLE_LDAPS 1 - -/* to disable TELNET */ -/* #undef CURL_DISABLE_TELNET */ - -/* to disable TFTP */ -/* #undef CURL_DISABLE_TFTP */ - -/* to disable verbose strings */ -/* #define CURL_DISABLE_VERBOSE_STRINGS 1*/ - -/* Definition to make a library symbol externally visible. */ -/* #undef CURL_EXTERN_SYMBOL */ - -/* Use Windows LDAP implementation */ -/* #undef USE_WIN32_LDAP */ - -/* your Entropy Gathering Daemon socket pathname */ -/* #undef EGD_SOCKET */ - -/* Define if you want to enable IPv6 support */ -#define ENABLE_IPV6 1 - -/* Define if struct sockaddr_in6 has the sin6_scope_id member */ -#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 - -/* Define to the type qualifier of arg 1 for getnameinfo. */ -#define GETNAMEINFO_QUAL_ARG1 const - -/* Define to the type of arg 1 for getnameinfo. */ -#define GETNAMEINFO_TYPE_ARG1 struct sockaddr * - -/* Define to the type of arg 2 for getnameinfo. */ -#define GETNAMEINFO_TYPE_ARG2 socklen_t - -/* Define to the type of args 4 and 6 for getnameinfo. */ -#define GETNAMEINFO_TYPE_ARG46 size_t - -/* Define to the type of arg 7 for getnameinfo. */ -#define GETNAMEINFO_TYPE_ARG7 int - -/* Define to 1 if you have the header file. */ -/*#define HAVE_ALLOCA_H 1*/ - -/* Define to 1 if you have the header file. */ -#define HAVE_ARPA_INET_H 1 - -/* Define to 1 if you have the header file. */ -/*#define HAVE_ARPA_TFTP_H 1*/ - -/* Define to 1 if you have the header file. */ -#define HAVE_ASSERT_H 1 - -/* Define to 1 if you have the `basename' function. */ -/*#define HAVE_BASENAME 1*/ - -/* Define to 1 if bool is an available type. */ -/*#define HAVE_BOOL_T 1*/ - -/* Define to 1 if you have the `closesocket' function. */ -/* #undef HAVE_CLOSESOCKET */ - -/* Define to 1 if you have the `CRYPTO_cleanup_all_ex_data' function. */ -/*#define HAVE_CRYPTO_CLEANUP_ALL_EX_DATA 1*/ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_CRYPTO_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_DLFCN_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_ERRNO_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_ERR_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_FCNTL_H 1 - -/* Define to 1 if you have the fcntl function. */ -#define HAVE_FCNTL 1 - -/* Define to 1 if you have a working fcntl O_NONBLOCK function. */ -#define HAVE_FCNTL_O_NONBLOCK 1 - -/* Define to 1 if you have the `fork' function. */ -/*#define HAVE_FORK 1*/ - -/* Define to 1 if you have the `ftruncate' function. */ -#define HAVE_FTRUNCATE 1 - -/* Define if getaddrinfo exists and works */ -#define HAVE_GETADDRINFO 1 - -/* Define to 1 if you have the `geteuid' function. */ -#define HAVE_GETEUID 1 - -/* Define to 1 if you have the `gethostbyaddr' function. */ -#define HAVE_GETHOSTBYADDR 1 - -/* If you have gethostbyname */ -#define HAVE_GETHOSTBYNAME 1 - -/* Define to 1 if you have the `gethostbyname_r' function. */ -/* #undef HAVE_GETHOSTBYNAME_R */ - -/* gethostbyname_r() takes 3 args */ -/* #undef HAVE_GETHOSTBYNAME_R_3 */ - -/* gethostbyname_r() takes 5 args */ -/* #undef HAVE_GETHOSTBYNAME_R_5 */ - -/* gethostbyname_r() takes 6 args */ -/* #undef HAVE_GETHOSTBYNAME_R_6 */ - -/* Define to 1 if you have the getnameinfo function. */ -#define HAVE_GETNAMEINFO 1 - -/* Define to 1 if you have the `getpass_r' function. */ -/* #undef HAVE_GETPASS_R */ - -/* Define to 1 if you have the `getppid' function. */ -#define HAVE_GETPPID 1 - -/* Define to 1 if you have the `getprotobyname' function. */ -#define HAVE_GETPROTOBYNAME 1 - -/* Define to 1 if you have the `getpwuid' function. */ -#define HAVE_GETPWUID 1 - -/* Define to 1 if you have the `getrlimit' function. */ -/*#define HAVE_GETRLIMIT 1*/ - -/* Define to 1 if you have the `gettimeofday' function. */ -#define HAVE_GETTIMEOFDAY 1 - -/* we have a glibc-style strerror_r() */ -/* #undef HAVE_GLIBC_STRERROR_R */ - -/* Define to 1 if you have the `gmtime_r' function. */ -#define HAVE_GMTIME_R 1 - -/* if you have the gssapi libraries */ -/* #undef HAVE_GSSAPI */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_GSSAPI_GSSAPI_GENERIC_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_GSSAPI_GSSAPI_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_GSSAPI_GSSAPI_KRB5_H */ - -/* if you have the GNU gssapi libraries */ -/* #undef HAVE_GSSGNU */ - -/* if you have the Heimdal gssapi libraries */ -/* #undef HAVE_GSSHEIMDAL */ - -/* if you have the MIT gssapi libraries */ -/* #undef HAVE_GSSMIT */ - -/* Define to 1 if you have the `idna_strerror' function. */ -/*#define HAVE_IDNA_STRERROR 1*/ - -/* Define to 1 if you have the `idn_free' function. */ -/*#define HAVE_IDN_FREE 1*/ - -/* Define to 1 if you have the header file. */ -/*#define HAVE_IDN_FREE_H 1*/ - -/* Define to 1 if you have the `inet_addr' function. */ -/*#define HAVE_INET_ADDR 1*/ - -/* Define to 1 if you have a IPv6 capable working inet_ntop function. */ -/*#define HAVE_INET_NTOP 1*/ - -/* Define to 1 if you have a IPv6 capable working inet_pton function. */ -/*#define HAVE_INET_PTON 1*/ - -/* Define to 1 if you have the header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the ioctl function. */ -#define HAVE_IOCTL 1 - -/* Define to 1 if you have a working ioctl FIONBIO function. */ -#define HAVE_IOCTL_FIONBIO 1 - -/* Define to 1 if you have the ioctlsocket function. */ -/* #undef HAVE_IOCTLSOCKET */ - -/* Define to 1 if you have a working ioctlsocket FIONBIO function. */ -/* #undef HAVE_IOCTLSOCKET_FIONBIO */ - -/* Define to 1 if you have the IoctlSocket camel case function. */ -/* #undef HAVE_IOCTLSOCKET_CAMEL */ - -/* Define to 1 if you have a working IoctlSocket camel case FIONBIO - function. */ -/* #undef HAVE_IOCTLSOCKET_CAMEL_FIONBIO */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_IO_H */ - -/* if you have the Kerberos4 libraries (including -ldes) */ -/* #undef HAVE_KRB4 */ - -/* Define to 1 if you have the `krb_get_our_ip_for_realm' function. */ -/* #undef HAVE_KRB_GET_OUR_IP_FOR_REALM */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_KRB_H */ - -/* Define to 1 if you have the lber.h header file. */ -/*#define HAVE_LBER_H 1*/ - -/* Define to 1 if you have the ldapssl.h header file. */ -/* #undef HAVE_LDAPSSL_H */ - -/* Define to 1 if you have the ldap.h header file. */ -/*#define HAVE_LDAP_H 1*/ - -/* Use LDAPS implementation */ -/*#define HAVE_LDAP_SSL 1*/ - -/* Define to 1 if you have the ldap_ssl.h header file. */ -/* #undef HAVE_LDAP_SSL_H */ - -/* Define to 1 if you have the `ldap_url_parse' function. */ -/*#define HAVE_LDAP_URL_PARSE 1*/ - -/* Define to 1 if you have the header file. */ -/*#define HAVE_LIBGEN_H 1*/ - -/* Define to 1 if you have the `idn' library (-lidn). */ -/*#define HAVE_LIBIDN 1*/ - -/* Define to 1 if you have the `resolv' library (-lresolv). */ -/* #undef HAVE_LIBRESOLV */ - -/* Define to 1 if you have the `resolve' library (-lresolve). */ -/* #undef HAVE_LIBRESOLVE */ - -/* Define to 1 if you have the `socket' library (-lsocket). */ -/* #undef HAVE_LIBSOCKET */ - -/* Define to 1 if you have the `ssh2' library (-lssh2). */ -/*#define HAVE_LIBSSH2 1*/ - -/* Define to 1 if you have the header file. */ -/*#define HAVE_LIBSSH2_H 1*/ - -/* if your compiler supports LL */ -#define HAVE_LL 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_LOCALE_H 1 - -/* Define to 1 if you have the `localtime_r' function. */ -#define HAVE_LOCALTIME_R 1 - -/* Define to 1 if the compiler supports the 'long long' data type. */ -#define HAVE_LONGLONG 1 - -/* Define to 1 if you have the malloc.h header file. */ -/*#define HAVE_MALLOC_H 1*/ - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 if you have the MSG_NOSIGNAL flag. */ -/*#define HAVE_MSG_NOSIGNAL 1*/ - -/* Define to 1 if you have the header file. */ -#define HAVE_NETDB_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_NETINET_IN_H 1 - -/* Define to 1 if you have the header file. */ -/*#define HAVE_NETINET_TCP_H 1*/ - -/* Define to 1 if you have the header file. */ -#define HAVE_NET_IF_H 1 - -/* Define to 1 if NI_WITHSCOPEID exists and works. */ -/*#define HAVE_NI_WITHSCOPEID 1*/ - -/* we have no strerror_r() proto */ -/* #undef HAVE_NO_STRERROR_R_DECL */ - -/* if you have an old MIT gssapi library, lacking GSS_C_NT_HOSTBASED_SERVICE - */ -/* #undef HAVE_OLD_GSSMIT */ - -/* Define to 1 if you have the header file. */ -/*#define HAVE_OPENSSL_CRYPTO_H 1*/ - -/* Define to 1 if you have the header file. */ -/*#define HAVE_OPENSSL_ERR_H 1*/ - -/* Define to 1 if you have the header file. */ -/*#define HAVE_OPENSSL_PEM_H 1*/ - -/* Define to 1 if you have the header file. */ -/*#define HAVE_OPENSSL_PKCS12_H 1*/ - -/* Define to 1 if you have the header file. */ -/*#define HAVE_OPENSSL_RSA_H 1*/ - -/* Define to 1 if you have the header file. */ -/*#define HAVE_OPENSSL_SSL_H 1*/ - -/* Define to 1 if you have the header file. */ -/*#define HAVE_OPENSSL_X509_H 1*/ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_PEM_H */ - -/* Define to 1 if you have the `perror' function. */ -#define HAVE_PERROR 1 - -/* Define to 1 if you have the `pipe' function. */ -#define HAVE_PIPE 1 - -/* Define to 1 if you have the `poll' function. */ -/*#define HAVE_POLL 1*/ - -/* If you have a fine poll */ -/*#define HAVE_POLL_FINE 1*/ - -/* Define to 1 if you have the header file. */ -/*#define HAVE_POLL_H 1*/ - -/* we have a POSIX-style strerror_r() */ -#define HAVE_POSIX_STRERROR_R 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_PWD_H 1 - -/* Define to 1 if you have the `RAND_egd' function. */ -#define HAVE_RAND_EGD 1 - -/* Define to 1 if you have the `RAND_screen' function. */ -/* #undef HAVE_RAND_SCREEN */ - -/* Define to 1 if you have the `RAND_status' function. */ -/*#define HAVE_RAND_STATUS 1*/ - -/* Define to 1 if you have the recv function. */ -#define HAVE_RECV 1 - -/* Define to 1 if you have the recvfrom function. */ -#define HAVE_RECVFROM 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_RSA_H */ - -/* Define to 1 if you have the select function. */ -#define HAVE_SELECT 1 - -/* Define to 1 if you have the send function. */ -#define HAVE_SEND 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SETJMP_H 1 - -/* Define to 1 if you have the `setlocale' function. */ -#define HAVE_SETLOCALE 1 - -/* Define to 1 if you have the `setmode' function. */ -/* #undef HAVE_SETMODE */ - -/* Define to 1 if you have the `setrlimit' function. */ -/*#define HAVE_SETRLIMIT 1*/ - -/* Define to 1 if you have the setsockopt function. */ -/* #undef HAVE_SETSOCKOPT */ - -/* Define to 1 if you have a working setsockopt SO_NONBLOCK function. */ -/* #undef HAVE_SETSOCKOPT_SO_NONBLOCK */ - -/* Define to 1 if you have the header file. */ -/*#define HAVE_SGTTY_H 1*/ - -/* Define to 1 if you have the `sigaction' function. */ -/*#define HAVE_SIGACTION 1*/ - -/* Define to 1 if you have the `siginterrupt' function. */ -/*#define HAVE_SIGINTERRUPT 1*/ - -/* Define to 1 if you have the `signal' function. */ -/*#define HAVE_SIGNAL 1*/ - -/* Define to 1 if you have the header file. */ -#define HAVE_SIGNAL_H 1 - -/* If you have sigsetjmp */ -/*#define HAVE_SIGSETJMP 1*/ - -/* Define to 1 if sig_atomic_t is an available typedef. */ -/*#define HAVE_SIG_ATOMIC_T 1*/ - -/* Define to 1 if sig_atomic_t is already defined as volatile. */ -/* #undef HAVE_SIG_ATOMIC_T_VOLATILE */ - -/* Define to 1 if you have the `socket' function. */ -#define HAVE_SOCKET 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SSL_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_STDBOOL_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDIO_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the `strcasecmp' function. */ -#define HAVE_STRCASECMP 1 - -/* Define to 1 if you have the `strcmpi' function. */ -/* #undef HAVE_STRCMPI */ - -/* Define to 1 if you have the `strdup' function. */ -#define HAVE_STRDUP 1 - -/* Define to 1 if you have the `strerror_r' function. */ -#define HAVE_STRERROR_R 1 - -/* Define to 1 if you have the `stricmp' function. */ -/* #undef HAVE_STRICMP */ - -/* Define to 1 if you have the header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the `strlcpy' function. */ -#define HAVE_STRLCPY 1 - -/* Define to 1 if you have the `strstr' function. */ -#define HAVE_STRSTR 1 - -/* Define to 1 if you have the `strtok_r' function. */ -#define HAVE_STRTOK_R 1 - -/* Define to 1 if you have the `strtoll' function. */ -#define HAVE_STRTOLL 1 - -/* if struct sockaddr_storage is defined */ -#define HAVE_STRUCT_SOCKADDR_STORAGE 1 - -/* Define to 1 if you have the timeval struct. */ -#define HAVE_STRUCT_TIMEVAL 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_FILIO_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_IOCTL_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_PARAM_H 1 - -/* Define to 1 if you have the header file. */ -/*#define HAVE_SYS_POLL_H 1*/ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_RESOURCE_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_SELECT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_SOCKET_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_SOCKIO_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TIME_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_UTIME_H */ - -/* Define to 1 if you have the header file. */ -/*#define HAVE_TERMIOS_H 1*/ - -/* Define to 1 if you have the header file. */ -/*#define HAVE_TERMIO_H 1*/ - -/* Define to 1 if you have the header file. */ -#define HAVE_TIME_H 1 - -/* Define to 1 if you have the header file. */ -/*#define HAVE_TLD_H 1*/ - -/* Define to 1 if you have the `tld_strerror' function. */ -/*#define HAVE_TLD_STRERROR 1*/ - -/* Define to 1 if you have the `uname' function. */ -#define HAVE_UNAME 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_UNISTD_H 1 - -/* Define to 1 if you have the `utime' function. */ -#define HAVE_UTIME 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_UTIME_H 1 - -/* Define to 1 if compiler supports C99 variadic macro style. */ -#define HAVE_VARIADIC_MACROS_C99 1 - -/* Define to 1 if compiler supports old gcc variadic macro style. */ -/*#define HAVE_VARIADIC_MACROS_GCC 1*/ - -/* Define to 1 if you have the winber.h header file. */ -/* #undef HAVE_WINBER_H */ - -/* Define to 1 if you have the windows.h header file. */ -/* #undef HAVE_WINDOWS_H */ - -/* Define to 1 if you have the winldap.h header file. */ -/* #undef HAVE_WINLDAP_H */ - -/* Define to 1 if you have the winsock2.h header file. */ -/* #undef HAVE_WINSOCK2_H */ - -/* Define to 1 if you have the winsock.h header file. */ -/* #undef HAVE_WINSOCK_H */ - -/* Define this symbol if your OS supports changing the contents of argv */ -/*#define HAVE_WRITABLE_ARGV 1*/ - -/* Define to 1 if you have the ws2tcpip.h header file. */ -/* #undef HAVE_WS2TCPIP_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_X509_H */ - -/* Define to 1 if you need the lber.h header file even with ldap.h */ -/* #undef NEED_LBER_H */ - -/* Define to 1 if you need the malloc.h header file even with stdlib.h */ -/* #undef NEED_MALLOC_H */ - -/* Define to 1 if _REENTRANT preprocessor symbol must be defined. */ -/* #undef NEED_REENTRANT */ - -/* Define to 1 if _THREAD_SAFE preprocessor symbol must be defined. */ -/* #undef NEED_THREAD_SAFE */ - -/* cpu-machine-OS */ -#ifdef __WINS__ -#define OS "i386-pc-epoc32" -#elif __MARM__ -#define OS "arm-unknown-epoc32" -#else -/* This won't happen on any current Symbian version */ -#define OS "unknown-unknown-epoc32" -#endif - -/* Name of package */ -/*#define PACKAGE "curl"*/ - -/* Define to the address where bug reports for this package should be sent. */ -/*#define PACKAGE_BUGREPORT \ - "a suitable curl mailing list => https://curl.haxx.se/mail/"*/ - -/* Define to the full name of this package. */ -/*#define PACKAGE_NAME "curl"*/ - -/* Define to the full name and version of this package. */ -/*#define PACKAGE_STRING "curl -"*/ - -/* Define to the one symbol short name of this package. */ -/*#define PACKAGE_TARNAME "curl"*/ - -/* Define to the version of this package. */ -/*#define PACKAGE_VERSION "-"*/ - -/* a suitable file to read random data from */ -/*#define RANDOM_FILE "/dev/urandom"*/ - -#define RECV_TYPE_ARG1 int -#define RECV_TYPE_ARG2 void * -#define RECV_TYPE_ARG3 size_t -#define RECV_TYPE_ARG4 int -#define RECV_TYPE_RETV ssize_t - -#define RECVFROM_TYPE_ARG1 int -#define RECVFROM_TYPE_ARG2 void -#define RECVFROM_TYPE_ARG3 size_t -#define RECVFROM_TYPE_ARG4 int -#define RECVFROM_TYPE_ARG5 struct sockaddr -#define RECVFROM_TYPE_ARG6 size_t -#define RECVFROM_TYPE_RETV ssize_t -#define RECVFROM_TYPE_ARG2_IS_VOID 1 - -#define SEND_TYPE_ARG1 int -#define SEND_QUAL_ARG2 const -#define SEND_TYPE_ARG2 void * -#define SEND_TYPE_ARG3 size_t -#define SEND_TYPE_ARG4 int -#define SEND_TYPE_RETV ssize_t - - -/* Define as the return type of signal handlers (`int' or `void'). */ -/*#define RETSIGTYPE void*/ - -/* Define to the type of arg 1 for `select'. */ -#define SELECT_TYPE_ARG1 int - -/* Define to the type of args 2, 3 and 4 for `select'. */ -#define SELECT_TYPE_ARG234 (fd_set *) - -/* Define to the type of arg 5 for `select'. */ -#define SELECT_TYPE_ARG5 (struct timeval *) - -/* The size of `int', as computed by sizeof. */ -#define SIZEOF_INT 4 - -/* The size of `off_t', as computed by sizeof. */ -#define SIZEOF_OFF_T 8 - -/* The size of `short', as computed by sizeof. */ -#define SIZEOF_SHORT 2 - -/* The size of `size_t', as computed by sizeof. */ -#define SIZEOF_SIZE_T 4 - -/* The size of `time_t', as computed by sizeof. */ -#define SIZEOF_TIME_T 4 - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define to 1 if you can safely include both and . */ -#define TIME_WITH_SYS_TIME 1 - -/* Define if you want to enable c-ares support */ -/* #undef USE_ARES */ - -/* Define to disable non-blocking sockets */ -/* #undef USE_BLOCKING_SOCKETS */ - -/* if GnuTLS is enabled */ -/* #undef USE_GNUTLS */ - -/* if libSSH2 is in use */ -/*#define USE_LIBSSH2 1*/ - -/* If you want to build curl with the built-in manual */ -/*#define USE_MANUAL 1*/ - -/* if NSS is enabled */ -/* #undef USE_NSS */ - -/* to enable SSPI support */ -/* #undef USE_WINDOWS_SSPI */ - -/* Define to 1 if using yaSSL in OpenSSL compatibility mode. */ -/* #undef USE_YASSLEMUL */ - -/* Version number of package */ -/*#define VERSION "7.18.2-CVS"*/ - -/* Define to avoid automatic inclusion of winsock.h */ -/* #undef WIN32_LEAN_AND_MEAN */ - -/* Define to 1 if on AIX 3. - System headers sometimes define this. - We just want to avoid a redefinition error message. */ -#ifndef _ALL_SOURCE -/* # undef _ALL_SOURCE */ -#endif - -/* Number of bits in a file offset, on hosts where this is settable. */ -#define _FILE_OFFSET_BITS 64 - -/* Define for large files, on AIX-style hosts. */ -/* #undef _LARGE_FILES */ - -/* Define to empty if `const' does not conform to ANSI C. */ -/* #undef const */ - -/* type to use in place of in_addr_t if not defined */ -/* #undef in_addr_t */ - -/* Define to `__inline__' or `__inline' if that's what the C compiler - calls it, or to nothing if 'inline' is not supported under any name. */ -#ifndef __cplusplus -/* #undef inline */ -#endif - -/* Define to `unsigned int' if does not define. */ -/* #undef size_t */ - -/* the signed version of size_t */ -/* #undef ssize_t */ - -/* Enabling curl debug mode when building in Symbian debug mode would work */ -/* except that debug mode introduces new exports that must be frozen. */ -#ifdef _DEBUG -/* #define CURLDEBUG */ -#endif - -/* sys/cdefs.h fails to define this for WINSCW prior to Symbian OS ver. 9.4 */ -#ifndef __LONG_LONG_SUPPORTED -#define __LONG_LONG_SUPPORTED -#endif - -/* Enable appropriate header only when zlib support is enabled */ -#ifdef HAVE_LIBZ -#define HAVE_ZLIB_H 1 -#endif - -#endif /* HEADER_CURL_CONFIG_SYMBIAN_H */ diff --git a/libs/libcurl/src/config-win32.h b/libs/libcurl/src/config-win32.h index 7ac33c51fe..316043d817 100644 --- a/libs/libcurl/src/config-win32.h +++ b/libs/libcurl/src/config-win32.h @@ -246,10 +246,6 @@ /* Define if you have the socket function. */ #define HAVE_SOCKET 1 -/* Define if libSSH2 is in use */ -#define USE_LIBSSH2 1 -#define HAVE_LIBSSH2_H 1 - /* Define if you have the strcasecmp function. */ /* #define HAVE_STRCASECMP 1 */ @@ -717,9 +713,6 @@ Vista # define CURL_DISABLE_LDAP 1 #endif -/* if SSL is enabled */ -#define USE_OPENSSL 1 - /* Define to use the Windows crypto library. */ #if !defined(CURL_WINDOWS_APP) #define USE_WIN32_CRYPTO diff --git a/libs/libcurl/src/conncache.c b/libs/libcurl/src/conncache.c index d21a00cfdd..c0e4d3e30f 100644 --- a/libs/libcurl/src/conncache.c +++ b/libs/libcurl/src/conncache.c @@ -59,7 +59,7 @@ static CURLcode bundle_create(struct connectbundle **bundlep) (*bundlep)->num_connections = 0; (*bundlep)->multiuse = BUNDLE_UNKNOWN; - Curl_llist_init(&(*bundlep)->conn_list, (curl_llist_dtor) conn_llist_dtor); + Curl_llist_init(&(*bundlep)->conn_list, (Curl_llist_dtor) conn_llist_dtor); return CURLE_OK; } @@ -87,7 +87,7 @@ static void bundle_add_conn(struct connectbundle *bundle, static int bundle_remove_conn(struct connectbundle *bundle, struct connectdata *conn) { - struct curl_llist_element *curr; + struct Curl_llist_element *curr; curr = bundle->conn_list.head; while(curr) { @@ -206,8 +206,8 @@ static bool conncache_add_bundle(struct conncache *connc, static void conncache_remove_bundle(struct conncache *connc, struct connectbundle *bundle) { - struct curl_hash_iterator iter; - struct curl_hash_element *he; + struct Curl_hash_iterator iter; + struct Curl_hash_element *he; if(!connc) return; @@ -320,9 +320,9 @@ bool Curl_conncache_foreach(struct Curl_easy *data, void *param, int (*func)(struct connectdata *conn, void *param)) { - struct curl_hash_iterator iter; - struct curl_llist_element *curr; - struct curl_hash_element *he; + struct Curl_hash_iterator iter; + struct Curl_llist_element *curr; + struct Curl_hash_element *he; if(!connc) return FALSE; @@ -363,15 +363,15 @@ bool Curl_conncache_foreach(struct Curl_easy *data, static struct connectdata * conncache_find_first_connection(struct conncache *connc) { - struct curl_hash_iterator iter; - struct curl_hash_element *he; + struct Curl_hash_iterator iter; + struct Curl_hash_element *he; struct connectbundle *bundle; Curl_hash_start_iterate(&connc->hash, &iter); he = Curl_hash_next_element(&iter); while(he) { - struct curl_llist_element *curr; + struct Curl_llist_element *curr; bundle = he->ptr; curr = bundle->conn_list.head; @@ -429,7 +429,7 @@ struct connectdata * Curl_conncache_extract_bundle(struct Curl_easy *data, struct connectbundle *bundle) { - struct curl_llist_element *curr; + struct Curl_llist_element *curr; timediff_t highscore = -1; timediff_t score; struct curltime now; @@ -477,9 +477,9 @@ struct connectdata * Curl_conncache_extract_oldest(struct Curl_easy *data) { struct conncache *connc = data->state.conn_cache; - struct curl_hash_iterator iter; - struct curl_llist_element *curr; - struct curl_hash_element *he; + struct Curl_hash_iterator iter; + struct Curl_llist_element *curr; + struct Curl_hash_element *he; timediff_t highscore =- 1; timediff_t score; struct curltime now; @@ -571,9 +571,9 @@ void Curl_conncache_close_all_connections(struct conncache *connc) /* Useful for debugging the connection cache */ void Curl_conncache_print(struct conncache *connc) { - struct curl_hash_iterator iter; - struct curl_llist_element *curr; - struct curl_hash_element *he; + struct Curl_hash_iterator iter; + struct Curl_llist_element *curr; + struct Curl_hash_element *he; if(!connc) return; diff --git a/libs/libcurl/src/conncache.h b/libs/libcurl/src/conncache.h index 3dda21cdc6..c3e9ff51b9 100644 --- a/libs/libcurl/src/conncache.h +++ b/libs/libcurl/src/conncache.h @@ -30,7 +30,7 @@ */ struct conncache { - struct curl_hash hash; + struct Curl_hash hash; size_t num_conn; long next_connection_id; struct curltime last_cleanup; @@ -66,7 +66,7 @@ struct conncache { struct connectbundle { int multiuse; /* supports multi-use */ size_t num_connections; /* Number of connections in the bundle */ - struct curl_llist conn_list; /* The connectdata members of the bundle */ + struct Curl_llist conn_list; /* The connectdata members of the bundle */ }; /* returns 1 on error, 0 is fine */ diff --git a/libs/libcurl/src/connect.c b/libs/libcurl/src/connect.c index b000b1b2c2..5f23b79ca0 100644 --- a/libs/libcurl/src/connect.c +++ b/libs/libcurl/src/connect.c @@ -83,11 +83,6 @@ #include "curl_memory.h" #include "memdebug.h" -#ifdef __SYMBIAN32__ -/* This isn't actually supported under Symbian OS */ -#undef SO_NOSIGPIPE -#endif - static bool verifyconnect(curl_socket_t sockfd, int *error); #if defined(__DragonFly__) || defined(HAVE_WINSOCK_H) @@ -746,8 +741,8 @@ static CURLcode connect_SOCKS(struct connectdata *conn, int sockindex, bool *done) { CURLcode result = CURLE_OK; - #ifndef CURL_DISABLE_PROXY + CURLproxycode pxresult = CURLPX_OK; if(conn->bits.socksproxy) { /* for the secondary socket (FTP), use the "connect to host" * but ignore the "connect to port" (use the secondary port) @@ -767,20 +762,24 @@ static CURLcode connect_SOCKS(struct connectdata *conn, int sockindex, switch(conn->socks_proxy.proxytype) { case CURLPROXY_SOCKS5: case CURLPROXY_SOCKS5_HOSTNAME: - result = Curl_SOCKS5(conn->socks_proxy.user, conn->socks_proxy.passwd, - host, port, sockindex, conn, done); + pxresult = Curl_SOCKS5(conn->socks_proxy.user, conn->socks_proxy.passwd, + host, port, sockindex, conn, done); break; case CURLPROXY_SOCKS4: case CURLPROXY_SOCKS4A: - result = Curl_SOCKS4(conn->socks_proxy.user, host, port, sockindex, - conn, done); + pxresult = Curl_SOCKS4(conn->socks_proxy.user, host, port, sockindex, + conn, done); break; default: failf(conn->data, "unknown proxytype option given"); result = CURLE_COULDNT_CONNECT; } /* switch proxytype */ + if(pxresult) { + result = CURLE_PROXY; + conn->data->info.pxcode = pxresult; + } } else #else @@ -1313,10 +1312,9 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */ const struct Curl_dns_entry *remotehost) { struct Curl_easy *data = conn->data; - struct curltime before = Curl_now(); CURLcode result = CURLE_COULDNT_CONNECT; int i; - timediff_t timeout_ms = Curl_timeleft(data, &before, TRUE); + timediff_t timeout_ms = Curl_timeleft(data, NULL, TRUE); if(timeout_ms < 0) { /* a precaution, no need to continue if time already is up */ @@ -1416,8 +1414,7 @@ curl_socket_t Curl_getconnectinfo(struct Curl_easy *data, } return c->sock[FIRSTSOCKET]; } - else - return CURL_SOCKET_BAD; + return CURL_SOCKET_BAD; } /* diff --git a/libs/libcurl/src/content_encoding.c b/libs/libcurl/src/content_encoding.c index 2fc3d43c44..a6dce48804 100644 --- a/libs/libcurl/src/content_encoding.c +++ b/libs/libcurl/src/content_encoding.c @@ -28,10 +28,6 @@ #ifdef HAVE_ZLIB_H #include -#ifdef __SYMBIAN32__ -/* zlib pollutes the namespace with this definition */ -#undef WIN32 -#endif #endif #ifdef HAVE_BROTLI diff --git a/libs/libcurl/src/curl_config.h.cmake b/libs/libcurl/src/curl_config.h.cmake index dd870789ec..eca3734b0c 100644 --- a/libs/libcurl/src/curl_config.h.cmake +++ b/libs/libcurl/src/curl_config.h.cmake @@ -63,8 +63,8 @@ /* to disable LDAPS */ #cmakedefine CURL_DISABLE_LDAPS 1 -/* to enable MQTT */ -#undef CURL_ENABLE_MQTT +/* to disable MQTT */ +#cmakedefine CURL_DISABLE_MQTT 1 /* to disable POP3 */ #cmakedefine CURL_DISABLE_POP3 1 diff --git a/libs/libcurl/src/curl_config.h.in b/libs/libcurl/src/curl_config.h.in index 2f5511a747..ab8651a511 100644 --- a/libs/libcurl/src/curl_config.h.in +++ b/libs/libcurl/src/curl_config.h.in @@ -33,6 +33,9 @@ /* to disable FTP */ #undef CURL_DISABLE_FTP +/* to disable curl_easy_options */ +#undef CURL_DISABLE_GETOPTIONS + /* to disable Gopher */ #undef CURL_DISABLE_GOPHER @@ -57,6 +60,9 @@ /* disable mime API */ #undef CURL_DISABLE_MIME +/* to disable MQTT */ +#undef CURL_DISABLE_MQTT + /* disable netrc parsing */ #undef CURL_DISABLE_NETRC @@ -87,6 +93,9 @@ /* to disable SMTP */ #undef CURL_DISABLE_SMTP +/* to disable socketpair support */ +#undef CURL_DISABLE_SOCKETPAIR + /* to disable TELNET */ #undef CURL_DISABLE_TELNET @@ -96,9 +105,6 @@ /* to disable verbose strings */ #undef CURL_DISABLE_VERBOSE_STRINGS -/* to enable MQTT */ -#undef CURL_ENABLE_MQTT - /* Definition to make a library symbol externally visible. */ #undef CURL_EXTERN_SYMBOL @@ -633,8 +639,8 @@ /* Define to 1 if you have the `SSLv2_client_method' function. */ #undef HAVE_SSLV2_CLIENT_METHOD -/* Define to 1 if you have the `SSL_get_esni_status' function. */ -#undef HAVE_SSL_GET_ESNI_STATUS +/* Define to 1 if you have the `SSL_get_ech_status' function. */ +#undef HAVE_SSL_GET_ECH_STATUS /* Define to 1 if you have the header file. */ #undef HAVE_SSL_H @@ -978,8 +984,8 @@ /* if BearSSL is enabled */ #undef USE_BEARSSL -/* if ESNI support is available */ -#undef USE_ESNI +/* if ECH support is available */ +#undef USE_ECH /* if GnuTLS is enabled */ #undef USE_GNUTLS diff --git a/libs/libcurl/src/curl_get_line.c b/libs/libcurl/src/curl_get_line.c index c4194851ae..3c77be9a95 100644 --- a/libs/libcurl/src/curl_get_line.c +++ b/libs/libcurl/src/curl_get_line.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2019, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2020, 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 @@ -22,6 +22,8 @@ #include "curl_setup.h" +#if !defined(CURL_DISABLE_COOKIES) && !defined(CURL_DISABLE_ALTSVC) + #include "curl_get_line.h" #include "curl_memory.h" /* The last #include file should be: */ @@ -53,3 +55,5 @@ char *Curl_get_line(char *buf, int len, FILE *input) } return NULL; } + +#endif /* if not disabled */ diff --git a/libs/libcurl/src/curl_gethostname.c b/libs/libcurl/src/curl_gethostname.c index 8337c72e81..5f1c9998fe 100644 --- a/libs/libcurl/src/curl_gethostname.c +++ b/libs/libcurl/src/curl_gethostname.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2020, 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 @@ -48,7 +48,7 @@ * For libcurl static library release builds no overriding takes place. */ -int Curl_gethostname(char *name, GETHOSTNAME_TYPE_ARG2 namelen) +int Curl_gethostname(char * const name, GETHOSTNAME_TYPE_ARG2 namelen) { #ifndef HAVE_GETHOSTNAME diff --git a/libs/libcurl/src/curl_gethostname.h b/libs/libcurl/src/curl_gethostname.h index 8ae15e6c19..2d78bc54db 100644 --- a/libs/libcurl/src/curl_gethostname.h +++ b/libs/libcurl/src/curl_gethostname.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2019, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2020, 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 @@ -26,6 +26,6 @@ #define HOSTNAME_MAX 1024 /* This returns the local machine's un-qualified hostname */ -int Curl_gethostname(char *name, GETHOSTNAME_TYPE_ARG2 namelen); +int Curl_gethostname(char * const name, GETHOSTNAME_TYPE_ARG2 namelen); #endif /* HEADER_CURL_GETHOSTNAME_H */ diff --git a/libs/libcurl/src/curl_krb5.h b/libs/libcurl/src/curl_krb5.h new file mode 100644 index 0000000000..ae9b7e0d3e --- /dev/null +++ b/libs/libcurl/src/curl_krb5.h @@ -0,0 +1,51 @@ +#ifndef HEADER_CURL_KRB5_H +#define HEADER_CURL_KRB5_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2020, 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 + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +struct Curl_sec_client_mech { + const char *name; + size_t size; + int (*init)(void *); + int (*auth)(void *, struct connectdata *); + void (*end)(void *); + int (*check_prot)(void *, int); + int (*overhead)(void *, int, int); + int (*encode)(void *, const void *, int, int, void **); + int (*decode)(void *, void *, int, int, struct connectdata *); +}; + +#define AUTH_OK 0 +#define AUTH_CONTINUE 1 +#define AUTH_ERROR 2 + +#ifdef HAVE_GSSAPI +int Curl_sec_read_msg(struct connectdata *conn, char *, + enum protection_level); +void Curl_sec_end(struct connectdata *); +CURLcode Curl_sec_login(struct connectdata *); +int Curl_sec_request_prot(struct connectdata *conn, const char *level); +#else +#define Curl_sec_end(x) +#endif + +#endif /* HEADER_CURL_KRB5_H */ diff --git a/libs/libcurl/src/curl_ntlm_core.c b/libs/libcurl/src/curl_ntlm_core.c index 0eefb15879..defae772b4 100644 --- a/libs/libcurl/src/curl_ntlm_core.c +++ b/libs/libcurl/src/curl_ntlm_core.c @@ -22,7 +22,7 @@ #include "curl_setup.h" -#if defined(USE_NTLM) +#if defined(USE_CURL_NTLM_CORE) /* * NTLM details: @@ -50,8 +50,6 @@ in NTLM type-3 messages. */ -#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO) - #if defined(USE_OPENSSL) || defined(USE_WOLFSSL) #ifdef USE_WOLFSSL @@ -744,6 +742,4 @@ CURLcode Curl_ntlm_core_mk_lmv2_resp(unsigned char *ntlmv2hash, #endif /* USE_NTRESPONSES */ -#endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */ - -#endif /* USE_NTLM */ +#endif /* USE_CURL_NTLM_CORE */ diff --git a/libs/libcurl/src/curl_ntlm_core.h b/libs/libcurl/src/curl_ntlm_core.h index 7895b64709..6d391c4cb6 100644 --- a/libs/libcurl/src/curl_ntlm_core.h +++ b/libs/libcurl/src/curl_ntlm_core.h @@ -24,7 +24,7 @@ #include "curl_setup.h" -#if defined(USE_NTLM) +#if defined(USE_CURL_NTLM_CORE) /* If NSS is the first available SSL backend (see order in curl_ntlm_core.c) then it must be initialized to be used by NTLM. */ @@ -36,8 +36,6 @@ #define NTLM_NEEDS_NSS_INIT #endif -#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO) - #if defined(USE_OPENSSL) || defined(USE_WOLFSSL) #ifdef USE_WOLFSSL # include @@ -102,8 +100,6 @@ CURLcode Curl_ntlm_core_mk_lmv2_resp(unsigned char *ntlmv2hash, #endif /* USE_NTRESPONSES */ -#endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */ - -#endif /* USE_NTLM */ +#endif /* USE_CURL_NTLM_CORE */ #endif /* HEADER_CURL_NTLM_CORE_H */ diff --git a/libs/libcurl/src/curl_path.c b/libs/libcurl/src/curl_path.c index fbd98cb39b..7b3fb27ab1 100644 --- a/libs/libcurl/src/curl_path.c +++ b/libs/libcurl/src/curl_path.c @@ -168,7 +168,7 @@ CURLcode Curl_get_pathname(const char **cpp, char **path, char *homedir) *cpp = cp + i + strspn(cp + i, WHITESPACE); } else { - /* Read to end of filename - either to white space or terminator */ + /* Read to end of filename - either to whitespace or terminator */ end = strpbrk(cp, WHITESPACE); if(end == NULL) end = strchr(cp, '\0'); @@ -184,7 +184,7 @@ CURLcode Curl_get_pathname(const char **cpp, char **path, char *homedir) (*path)[pathLength] = '\0'; cp += 3; } - /* Copy path name up until first "white space" */ + /* Copy path name up until first "whitespace" */ memcpy(&(*path)[pathLength], cp, (int)(end - cp)); pathLength += (int)(end - cp); (*path)[pathLength] = '\0'; diff --git a/libs/libcurl/src/curl_printf.h b/libs/libcurl/src/curl_printf.h index 0d37b8e572..9d2de7ba8c 100644 --- a/libs/libcurl/src/curl_printf.h +++ b/libs/libcurl/src/curl_printf.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2018, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2020, 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 diff --git a/libs/libcurl/src/curl_rtmp.c b/libs/libcurl/src/curl_rtmp.c index df8f2b1d95..32f11130a0 100644 --- a/libs/libcurl/src/curl_rtmp.c +++ b/libs/libcurl/src/curl_rtmp.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2012 - 2019, Daniel Stenberg, , et al. + * Copyright (C) 2012 - 2020, Daniel Stenberg, , et al. * Copyright (C) 2010, Howard Chu, * * This software is licensed as described in the file COPYING, which @@ -79,6 +79,7 @@ const struct Curl_handler Curl_handler_rtmp = { ZERO_NULL, /* connection_check */ PORT_RTMP, /* defport */ CURLPROTO_RTMP, /* protocol */ + CURLPROTO_RTMP, /* family */ PROTOPT_NONE /* flags*/ }; @@ -100,6 +101,7 @@ const struct Curl_handler Curl_handler_rtmpt = { ZERO_NULL, /* connection_check */ PORT_RTMPT, /* defport */ CURLPROTO_RTMPT, /* protocol */ + CURLPROTO_RTMPT, /* family */ PROTOPT_NONE /* flags*/ }; @@ -121,6 +123,7 @@ const struct Curl_handler Curl_handler_rtmpe = { ZERO_NULL, /* connection_check */ PORT_RTMP, /* defport */ CURLPROTO_RTMPE, /* protocol */ + CURLPROTO_RTMPE, /* family */ PROTOPT_NONE /* flags*/ }; @@ -142,6 +145,7 @@ const struct Curl_handler Curl_handler_rtmpte = { ZERO_NULL, /* connection_check */ PORT_RTMPT, /* defport */ CURLPROTO_RTMPTE, /* protocol */ + CURLPROTO_RTMPTE, /* family */ PROTOPT_NONE /* flags*/ }; @@ -163,6 +167,7 @@ const struct Curl_handler Curl_handler_rtmps = { ZERO_NULL, /* connection_check */ PORT_RTMPS, /* defport */ CURLPROTO_RTMPS, /* protocol */ + CURLPROTO_RTMP, /* family */ PROTOPT_NONE /* flags*/ }; @@ -184,6 +189,7 @@ const struct Curl_handler Curl_handler_rtmpts = { ZERO_NULL, /* connection_check */ PORT_RTMPS, /* defport */ CURLPROTO_RTMPTS, /* protocol */ + CURLPROTO_RTMPT, /* family */ PROTOPT_NONE /* flags*/ }; diff --git a/libs/libcurl/src/curl_sec.h b/libs/libcurl/src/curl_sec.h deleted file mode 100644 index 7bdde269b1..0000000000 --- a/libs/libcurl/src/curl_sec.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef HEADER_CURL_SECURITY_H -#define HEADER_CURL_SECURITY_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2016, 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 - * are also available at https://curl.haxx.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ - -struct Curl_sec_client_mech { - const char *name; - size_t size; - int (*init)(void *); - int (*auth)(void *, struct connectdata *); - void (*end)(void *); - int (*check_prot)(void *, int); - int (*overhead)(void *, int, int); - int (*encode)(void *, const void *, int, int, void **); - int (*decode)(void *, void *, int, int, struct connectdata *); -}; - -#define AUTH_OK 0 -#define AUTH_CONTINUE 1 -#define AUTH_ERROR 2 - -#ifdef HAVE_GSSAPI -int Curl_sec_read_msg(struct connectdata *conn, char *, - enum protection_level); -void Curl_sec_end(struct connectdata *); -CURLcode Curl_sec_login(struct connectdata *); -int Curl_sec_request_prot(struct connectdata *conn, const char *level); - -extern struct Curl_sec_client_mech Curl_krb5_client_mech; -#endif - -#endif /* HEADER_CURL_SECURITY_H */ diff --git a/libs/libcurl/src/curl_setup.h b/libs/libcurl/src/curl_setup.h index 21c3f3487f..3872dbb655 100644 --- a/libs/libcurl/src/curl_setup.h +++ b/libs/libcurl/src/curl_setup.h @@ -38,8 +38,7 @@ * Define WIN32 when build target is Win32 API */ -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) && \ - !defined(__SYMBIAN32__) +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) #define WIN32 #endif @@ -88,10 +87,6 @@ # include "config-amigaos.h" #endif -#ifdef __SYMBIAN32__ -# include "config-symbian.h" -#endif - #ifdef __OS400__ # include "config-os400.h" #endif @@ -559,14 +554,6 @@ /* ---------------------------------------------------------------- */ -/* - * When using WINSOCK, TELNET protocol requires WINSOCK2 API. - */ - -#if defined(USE_WINSOCK) && (USE_WINSOCK != 2) -# define CURL_DISABLE_TELNET 1 -#endif - /* * msvc 6.0 does not have struct sockaddr_storage and * does not define IPPROTO_ESP in winsock2.h. But both @@ -637,19 +624,22 @@ int netware_init(void); /* Single point where USE_NTLM definition might be defined */ #if !defined(CURL_DISABLE_NTLM) && !defined(CURL_DISABLE_CRYPTO_AUTH) -#if defined(USE_OPENSSL) || defined(USE_WINDOWS_SSPI) || \ +#if defined(USE_OPENSSL) || defined(USE_MBEDTLS) || \ defined(USE_GNUTLS) || defined(USE_NSS) || defined(USE_SECTRANSP) || \ defined(USE_OS400CRYPTO) || defined(USE_WIN32_CRYPTO) || \ - defined(USE_MBEDTLS) || \ (defined(USE_WOLFSSL) && defined(HAVE_WOLFSSL_DES_ECB_ENCRYPT)) -#define USE_NTLM +#define USE_CURL_NTLM_CORE # if defined(USE_MBEDTLS) /* Get definition of MBEDTLS_MD4_C */ # include # endif +#endif + +#if defined(USE_CURL_NTLM_CORE) || defined(USE_WINDOWS_SSPI) +#define USE_NTLM #endif #endif @@ -702,7 +692,7 @@ int netware_init(void); defined(HAVE_WINSOCK_H) || \ defined(HAVE_WINSOCK2_H) || \ defined(HAVE_WS2TCPIP_H) -# error "Winsock and lwIP TCP/IP stack definitions shall not coexist!" +# error "WinSock and lwIP TCP/IP stack definitions shall not coexist!" # endif #endif diff --git a/libs/libcurl/src/curl_threads.c b/libs/libcurl/src/curl_threads.c index b5f10a20ec..6f3815e711 100644 --- a/libs/libcurl/src/curl_threads.c +++ b/libs/libcurl/src/curl_threads.c @@ -41,14 +41,14 @@ #if defined(USE_THREADS_POSIX) -struct curl_actual_call { +struct Curl_actual_call { unsigned int (*func)(void *); void *arg; }; static void *curl_thread_create_thunk(void *arg) { - struct curl_actual_call *ac = arg; + struct Curl_actual_call *ac = arg; unsigned int (*func)(void *) = ac->func; void *real_arg = ac->arg; @@ -62,7 +62,7 @@ static void *curl_thread_create_thunk(void *arg) curl_thread_t Curl_thread_create(unsigned int (*func) (void *), void *arg) { curl_thread_t t = malloc(sizeof(pthread_t)); - struct curl_actual_call *ac = malloc(sizeof(struct curl_actual_call)); + struct Curl_actual_call *ac = malloc(sizeof(struct Curl_actual_call)); if(!(ac && t)) goto err; diff --git a/libs/libcurl/src/dict.c b/libs/libcurl/src/dict.c index f529b48f71..8dd4a90f7f 100644 --- a/libs/libcurl/src/dict.c +++ b/libs/libcurl/src/dict.c @@ -57,6 +57,7 @@ #include "escape.h" #include "progress.h" #include "dict.h" +#include "curl_printf.h" #include "strcase.h" #include "curl_memory.h" /* The last #include file should be: */ @@ -90,7 +91,8 @@ const struct Curl_handler Curl_handler_dict = { ZERO_NULL, /* connection_check */ PORT_DICT, /* defport */ CURLPROTO_DICT, /* protocol */ - PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */ + CURLPROTO_DICT, /* family */ + PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */ }; static char *unescape_word(struct Curl_easy *data, const char *inputbuff) @@ -126,6 +128,52 @@ static char *unescape_word(struct Curl_easy *data, const char *inputbuff) return dictp; } +/* sendf() sends formatted data to the server */ +static CURLcode sendf(curl_socket_t sockfd, struct connectdata *conn, + const char *fmt, ...) +{ + struct Curl_easy *data = conn->data; + ssize_t bytes_written; + size_t write_len; + CURLcode result = CURLE_OK; + char *s; + char *sptr; + va_list ap; + va_start(ap, fmt); + s = vaprintf(fmt, ap); /* returns an allocated string */ + va_end(ap); + if(!s) + return CURLE_OUT_OF_MEMORY; /* failure */ + + bytes_written = 0; + write_len = strlen(s); + sptr = s; + + for(;;) { + /* Write the buffer to the socket */ + result = Curl_write(conn, sockfd, sptr, write_len, &bytes_written); + + if(result) + break; + + if(data->set.verbose) + Curl_debug(data, CURLINFO_DATA_OUT, sptr, (size_t)bytes_written); + + if((size_t)bytes_written != write_len) { + /* if not all was written at once, we must advance the pointer, decrease + the size left and try again! */ + write_len -= bytes_written; + sptr += bytes_written; + } + else + break; + } + + free(s); /* free the output string */ + + return result; +} + static CURLcode dict_do(struct connectdata *conn, bool *done) { char *word; @@ -183,18 +231,16 @@ static CURLcode dict_do(struct connectdata *conn, bool *done) if(!eword) return CURLE_OUT_OF_MEMORY; - result = Curl_sendf(sockfd, conn, - "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n" - "MATCH " - "%s " /* database */ - "%s " /* strategy */ - "%s\r\n" /* word */ - "QUIT\r\n", - - database, - strategy, - eword - ); + result = sendf(sockfd, conn, + "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n" + "MATCH " + "%s " /* database */ + "%s " /* strategy */ + "%s\r\n" /* word */ + "QUIT\r\n", + database, + strategy, + eword); free(eword); @@ -233,14 +279,14 @@ static CURLcode dict_do(struct connectdata *conn, bool *done) if(!eword) return CURLE_OUT_OF_MEMORY; - result = Curl_sendf(sockfd, conn, - "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n" - "DEFINE " - "%s " /* database */ - "%s\r\n" /* word */ - "QUIT\r\n", - database, - eword); + result = sendf(sockfd, conn, + "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n" + "DEFINE " + "%s " /* database */ + "%s\r\n" /* word */ + "QUIT\r\n", + database, + eword); free(eword); @@ -261,10 +307,10 @@ static CURLcode dict_do(struct connectdata *conn, bool *done) if(ppath[i] == ':') ppath[i] = ' '; } - result = Curl_sendf(sockfd, conn, - "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n" - "%s\r\n" - "QUIT\r\n", ppath); + result = sendf(sockfd, conn, + "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n" + "%s\r\n" + "QUIT\r\n", ppath); if(result) { failf(data, "Failed sending DICT request"); return result; diff --git a/libs/libcurl/src/doh.c b/libs/libcurl/src/doh.c index 8bc3428ff5..e8b0801109 100644 --- a/libs/libcurl/src/doh.c +++ b/libs/libcurl/src/doh.c @@ -57,12 +57,13 @@ static const char * const errors[]={ "Unexpected TYPE", "Unexpected CLASS", "No content", - "Bad ID" + "Bad ID", + "Name too long" }; static const char *doh_strerror(DOHcode code) { - if((code >= DOH_OK) && (code <= DOH_DNS_BAD_ID)) + if((code >= DOH_OK) && (code <= DOH_DNS_NAME_TOO_LONG)) return errors[code]; return "bad error code"; } @@ -348,6 +349,10 @@ static CURLcode dohprobe(struct Curl_easy *data, ERROR_CHECK_SETOPT(CURLOPT_SSL_CTX_FUNCTION, data->set.ssl.fsslctx); if(data->set.ssl.fsslctxp) ERROR_CHECK_SETOPT(CURLOPT_SSL_CTX_DATA, data->set.ssl.fsslctxp); + if(data->set.str[STRING_SSL_EC_CURVES]) { + ERROR_CHECK_SETOPT(CURLOPT_SSL_EC_CURVES, + data->set.str[STRING_SSL_EC_CURVES]); + } doh->set.fmultidone = Curl_doh_done; doh->set.dohfor = data; /* identify for which transfer this is done */ diff --git a/libs/libcurl/src/dynbuf.c b/libs/libcurl/src/dynbuf.c index 38d370b078..b2465b8886 100644 --- a/libs/libcurl/src/dynbuf.c +++ b/libs/libcurl/src/dynbuf.c @@ -21,12 +21,11 @@ ***************************************************************************/ #include "curl_setup.h" -#include "strdup.h" #include "dynbuf.h" - -/* The last 3 #include files should be in this order */ #include "curl_printf.h" +#ifdef BUILDING_LIBCURL #include "curl_memory.h" +#endif #include "memdebug.h" #define MIN_FIRST_ALLOC 32 @@ -94,11 +93,15 @@ static CURLcode dyn_nappend(struct dynbuf *s, } if(a != s->allc) { - s->bufr = Curl_saferealloc(s->bufr, a); - if(!s->bufr) { + /* this logic is not using Curl_saferealloc() to make the tool not have to + include that as well when it uses this code */ + void *p = realloc(s->bufr, a); + if(!p) { + Curl_safefree(s->bufr); s->leng = s->allc = 0; return CURLE_OUT_OF_MEMORY; } + s->bufr = p; s->allc = a; } @@ -143,6 +146,7 @@ CURLcode Curl_dyn_tail(struct dynbuf *s, size_t trail) else { memmove(&s->bufr[0], &s->bufr[s->leng - trail], trail); s->leng = trail; + s->bufr[s->leng] = 0; } return CURLE_OK; @@ -173,15 +177,22 @@ CURLcode Curl_dyn_add(struct dynbuf *s, const char *str) } /* - * Append a string printf()-style + * Append a string vprintf()-style */ -CURLcode Curl_dyn_addf(struct dynbuf *s, const char *fmt, ...) +CURLcode Curl_dyn_vaddf(struct dynbuf *s, const char *fmt, va_list ap) { +#ifdef BUILDING_LIBCURL + int rc; + DEBUGASSERT(s); + DEBUGASSERT(s->init == DYNINIT); + DEBUGASSERT(!s->leng || s->bufr); + rc = Curl_dyn_vprintf(s, fmt, ap); + + if(!rc) + return CURLE_OK; +#else char *str; - va_list ap; - va_start(ap, fmt); str = vaprintf(fmt, ap); /* this allocs a new string to append */ - va_end(ap); if(str) { CURLcode result = dyn_nappend(s, (unsigned char *)str, strlen(str)); @@ -190,9 +201,26 @@ CURLcode Curl_dyn_addf(struct dynbuf *s, const char *fmt, ...) } /* If we failed, we cleanup the whole buffer and return error */ Curl_dyn_free(s); +#endif return CURLE_OUT_OF_MEMORY; } +/* + * Append a string printf()-style + */ +CURLcode Curl_dyn_addf(struct dynbuf *s, const char *fmt, ...) +{ + CURLcode result; + va_list ap; + DEBUGASSERT(s); + DEBUGASSERT(s->init == DYNINIT); + DEBUGASSERT(!s->leng || s->bufr); + va_start(ap, fmt); + result = Curl_dyn_vaddf(s, fmt, ap); + va_end(ap); + return result; +} + /* * Returns a pointer to the buffer. */ diff --git a/libs/libcurl/src/dynbuf.h b/libs/libcurl/src/dynbuf.h index ecc9957553..39b8595706 100644 --- a/libs/libcurl/src/dynbuf.h +++ b/libs/libcurl/src/dynbuf.h @@ -22,6 +22,23 @@ * ***************************************************************************/ +#ifndef BUILDING_LIBCURL +/* this renames the functions so that the tool code can use the same code + without getting symbol collisions */ +#define Curl_dyn_init(a,b) curlx_dyn_init(a,b) +#define Curl_dyn_add(a,b) curlx_dyn_add(a,b) +#define Curl_dyn_addn(a,b,c) curlx_dyn_addn(a,b,c) +#define Curl_dyn_addf curlx_dyn_addf +#define Curl_dyn_vaddf curlx_dyn_vaddf +#define Curl_dyn_free(a) curlx_dyn_free(a) +#define Curl_dyn_ptr(a) curlx_dyn_ptr(a) +#define Curl_dyn_uptr(a) curlx_dyn_uptr(a) +#define Curl_dyn_len(a) curlx_dyn_len(a) +#define Curl_dyn_reset(a) curlx_dyn_reset(a) +#define Curl_dyn_tail(a,b) curlx_dyn_tail(a,b) +#define curlx_dynbuf dynbuf /* for the struct name */ +#endif + struct dynbuf { char *bufr; /* point to a null-terminated allocated buffer */ size_t leng; /* number of bytes *EXCLUDING* the zero terminator */ @@ -40,12 +57,18 @@ CURLcode Curl_dyn_add(struct dynbuf *s, const char *str) WARN_UNUSED_RESULT; CURLcode Curl_dyn_addf(struct dynbuf *s, const char *fmt, ...) WARN_UNUSED_RESULT; +CURLcode Curl_dyn_vaddf(struct dynbuf *s, const char *fmt, va_list ap) + WARN_UNUSED_RESULT; void Curl_dyn_reset(struct dynbuf *s); CURLcode Curl_dyn_tail(struct dynbuf *s, size_t trail); char *Curl_dyn_ptr(const struct dynbuf *s); unsigned char *Curl_dyn_uptr(const struct dynbuf *s); size_t Curl_dyn_len(const struct dynbuf *s); +/* returns 0 on success, -1 on error */ +/* The implementation of this function exists in mprintf.c */ +int Curl_dyn_vprintf(struct dynbuf *dyn, const char *format, va_list ap_save); + /* Dynamic buffer max sizes */ #define DYN_DOH_RESPONSE 3000 #define DYN_DOH_CNAME 256 @@ -60,4 +83,6 @@ size_t Curl_dyn_len(const struct dynbuf *s); #define DYN_PROXY_CONNECT_HEADERS 16384 #define DYN_QLOG_NAME 1024 #define DYN_H1_TRAILER 4096 +#define DYN_PINGPPONG_CMD (64*1024) +#define DYN_IMAP_CMD (64*1024) #endif diff --git a/libs/libcurl/src/easy.c b/libs/libcurl/src/easy.c index a69eb9e567..60e2befd76 100644 --- a/libs/libcurl/src/easy.c +++ b/libs/libcurl/src/easy.c @@ -78,6 +78,7 @@ #include "system_win32.h" #include "http2.h" #include "dynbuf.h" +#include "altsvc.h" /* The last 3 #include files should be in this order */ #include "curl_printf.h" @@ -105,7 +106,6 @@ static long init_flags; # pragma warning(disable:4232) /* MSVC extension, dllimport identity */ #endif -#ifndef __SYMBIAN32__ /* * If a memory-using function (like curl_getenv) is used before * curl_global_init() is called, we need to have these pointers set already. @@ -118,17 +118,6 @@ curl_calloc_callback Curl_ccalloc = (curl_calloc_callback)calloc; #if defined(WIN32) && defined(UNICODE) curl_wcsdup_callback Curl_cwcsdup = (curl_wcsdup_callback)_wcsdup; #endif -#else -/* - * Symbian OS doesn't support initialization to code in writable static data. - * Initialization will occur in the curl_global_init() call. - */ -curl_malloc_callback Curl_cmalloc; -curl_free_callback Curl_cfree; -curl_realloc_callback Curl_crealloc; -curl_strdup_callback Curl_cstrdup; -curl_calloc_callback Curl_ccalloc; -#endif #if defined(_MSC_VER) && defined(_DLL) && !defined(__POCC__) # pragma warning(default:4232) /* MSVC extension, dllimport identity */ @@ -883,6 +872,15 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data) goto fail; } +#ifdef USE_ALTSVC + if(data->asi) { + outcurl->asi = Curl_altsvc_init(); + if(!outcurl->asi) + goto fail; + if(outcurl->set.str[STRING_ALTSVC]) + (void)Curl_altsvc_load(outcurl->asi, outcurl->set.str[STRING_ALTSVC]); + } +#endif /* Clone the resolver handle, if present, for the new handle */ if(Curl_resolver_duphandle(outcurl, &outcurl->state.resolver, @@ -930,6 +928,7 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data) Curl_dyn_free(&outcurl->state.headerb); Curl_safefree(outcurl->change.url); Curl_safefree(outcurl->change.referer); + Curl_altsvc_cleanup(&outcurl->asi); Curl_freeset(outcurl); free(outcurl); } @@ -958,6 +957,7 @@ void curl_easy_reset(struct Curl_easy *data) data->progress.flags |= PGRS_HIDE; data->state.current_speed = -1; /* init to negative == impossible */ + data->state.retrycount = 0; /* reset the retry counter */ /* zero out authentication data: */ memset(&data->state.authhost, 0, sizeof(struct auth)); @@ -1067,9 +1067,10 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action) (KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) { Curl_expire(data, 0, EXPIRE_RUN_NOW); /* get this handle going again */ - /* force a recv/send check of this connection, as the data might've been - read off the socket already */ - data->conn->cselect_bits = CURL_CSELECT_IN | CURL_CSELECT_OUT; + if(!data->state.tempcount) + /* if not pausing again, force a recv/send check of this connection as + the data might've been read off the socket already */ + data->conn->cselect_bits = CURL_CSELECT_IN | CURL_CSELECT_OUT; if(data->multi) Curl_update_timer(data->multi); } diff --git a/libs/libcurl/src/easygetopt.c b/libs/libcurl/src/easygetopt.c new file mode 100644 index 0000000000..cac8378e7e --- /dev/null +++ b/libs/libcurl/src/easygetopt.c @@ -0,0 +1,96 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ | | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * ___|___/|_| ______| + * + * Copyright (C) 1998 - 2020, 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 + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include "curl_setup.h" +#include "strcase.h" +#include "easyoptions.h" + +#ifndef CURL_DISABLE_GETOPTIONS + +/* Lookups easy options at runtime */ +static struct curl_easyoption *lookup(const char *name, CURLoption id) +{ + DEBUGASSERT(name || id); + DEBUGASSERT(!Curl_easyopts_check()); + if(name || id) { + struct curl_easyoption *o = &Curl_easyopts[0]; + do { + if(name) { + if(strcasecompare(o->name, name)) + return o; + } + else { + if((o->id == id) && !(o->flags & CURLOT_FLAG_ALIAS)) + /* don't match alias options */ + return o; + } + o++; + } while(o->name); + } + return NULL; +} + +const struct curl_easyoption *curl_easy_option_by_name(const char *name) +{ + /* when name is used, the id argument is ignored */ + return lookup(name, CURLOPT_LASTENTRY); +} + +const struct curl_easyoption *curl_easy_option_by_id(CURLoption id) +{ + return lookup(NULL, id); +} + +/* Iterates over available options */ +const struct curl_easyoption * +curl_easy_option_next(const struct curl_easyoption *prev) +{ + if(prev && prev->name) { + prev++; + if(prev->name) + return prev; + } + else if(!prev) + return &Curl_easyopts[0]; + return NULL; +} + +#else +const struct curl_easyoption *curl_easy_option_by_name(const char *name) +{ + (void)name; + return NULL; +} + +const struct curl_easyoption *curl_easy_option_by_id (CURLoption id) +{ + (void)id; + return NULL; +} + +const struct curl_easyoption * +curl_easy_option_next(const struct curl_easyoption *prev) +{ + (void)prev; + return NULL; +} +#endif diff --git a/libs/libcurl/src/easyoptions.c b/libs/libcurl/src/easyoptions.c new file mode 100644 index 0000000000..0ab6a3fc6d --- /dev/null +++ b/libs/libcurl/src/easyoptions.c @@ -0,0 +1,347 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ | | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * ___|___/|_| ______| + * + * Copyright (C) 1998 - 2020, 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 + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* This source code is generated by optiontable.pl - DO NOT EDIT BY HAND */ + +#include "curl_setup.h" +#include "easyoptions.h" + +/* all easy setopt options listed in alphabetical order */ +struct curl_easyoption Curl_easyopts[] = { + {"ABSTRACT_UNIX_SOCKET", CURLOPT_ABSTRACT_UNIX_SOCKET, CURLOT_STRING, 0}, + {"ACCEPTTIMEOUT_MS", CURLOPT_ACCEPTTIMEOUT_MS, CURLOT_LONG, 0}, + {"ACCEPT_ENCODING", CURLOPT_ACCEPT_ENCODING, CURLOT_STRING, 0}, + {"ADDRESS_SCOPE", CURLOPT_ADDRESS_SCOPE, CURLOT_LONG, 0}, + {"ALTSVC", CURLOPT_ALTSVC, CURLOT_STRING, 0}, + {"ALTSVC_CTRL", CURLOPT_ALTSVC_CTRL, CURLOT_LONG, 0}, + {"APPEND", CURLOPT_APPEND, CURLOT_LONG, 0}, + {"AUTOREFERER", CURLOPT_AUTOREFERER, CURLOT_LONG, 0}, + {"BUFFERSIZE", CURLOPT_BUFFERSIZE, CURLOT_LONG, 0}, + {"CAINFO", CURLOPT_CAINFO, CURLOT_STRING, 0}, + {"CAPATH", CURLOPT_CAPATH, CURLOT_STRING, 0}, + {"CERTINFO", CURLOPT_CERTINFO, CURLOT_LONG, 0}, + {"CHUNK_BGN_FUNCTION", CURLOPT_CHUNK_BGN_FUNCTION, CURLOT_FUNCTION, 0}, + {"CHUNK_DATA", CURLOPT_CHUNK_DATA, CURLOT_CBPTR, 0}, + {"CHUNK_END_FUNCTION", CURLOPT_CHUNK_END_FUNCTION, CURLOT_FUNCTION, 0}, + {"CLOSESOCKETDATA", CURLOPT_CLOSESOCKETDATA, CURLOT_CBPTR, 0}, + {"CLOSESOCKETFUNCTION", CURLOPT_CLOSESOCKETFUNCTION, CURLOT_FUNCTION, 0}, + {"CONNECTTIMEOUT", CURLOPT_CONNECTTIMEOUT, CURLOT_LONG, 0}, + {"CONNECTTIMEOUT_MS", CURLOPT_CONNECTTIMEOUT_MS, CURLOT_LONG, 0}, + {"CONNECT_ONLY", CURLOPT_CONNECT_ONLY, CURLOT_LONG, 0}, + {"CONNECT_TO", CURLOPT_CONNECT_TO, CURLOT_SLIST, 0}, + {"CONV_FROM_NETWORK_FUNCTION", CURLOPT_CONV_FROM_NETWORK_FUNCTION, + CURLOT_FUNCTION, 0}, + {"CONV_FROM_UTF8_FUNCTION", CURLOPT_CONV_FROM_UTF8_FUNCTION, + CURLOT_FUNCTION, 0}, + {"CONV_TO_NETWORK_FUNCTION", CURLOPT_CONV_TO_NETWORK_FUNCTION, + CURLOT_FUNCTION, 0}, + {"COOKIE", CURLOPT_COOKIE, CURLOT_STRING, 0}, + {"COOKIEFILE", CURLOPT_COOKIEFILE, CURLOT_STRING, 0}, + {"COOKIEJAR", CURLOPT_COOKIEJAR, CURLOT_STRING, 0}, + {"COOKIELIST", CURLOPT_COOKIELIST, CURLOT_STRING, 0}, + {"COOKIESESSION", CURLOPT_COOKIESESSION, CURLOT_LONG, 0}, + {"COPYPOSTFIELDS", CURLOPT_COPYPOSTFIELDS, CURLOT_OBJECT, 0}, + {"CRLF", CURLOPT_CRLF, CURLOT_LONG, 0}, + {"CRLFILE", CURLOPT_CRLFILE, CURLOT_STRING, 0}, + {"CURLU", CURLOPT_CURLU, CURLOT_OBJECT, 0}, + {"CUSTOMREQUEST", CURLOPT_CUSTOMREQUEST, CURLOT_STRING, 0}, + {"DEBUGDATA", CURLOPT_DEBUGDATA, CURLOT_CBPTR, 0}, + {"DEBUGFUNCTION", CURLOPT_DEBUGFUNCTION, CURLOT_FUNCTION, 0}, + {"DEFAULT_PROTOCOL", CURLOPT_DEFAULT_PROTOCOL, CURLOT_STRING, 0}, + {"DIRLISTONLY", CURLOPT_DIRLISTONLY, CURLOT_LONG, 0}, + {"DISALLOW_USERNAME_IN_URL", CURLOPT_DISALLOW_USERNAME_IN_URL, + CURLOT_LONG, 0}, + {"DNS_CACHE_TIMEOUT", CURLOPT_DNS_CACHE_TIMEOUT, CURLOT_LONG, 0}, + {"DNS_INTERFACE", CURLOPT_DNS_INTERFACE, CURLOT_STRING, 0}, + {"DNS_LOCAL_IP4", CURLOPT_DNS_LOCAL_IP4, CURLOT_STRING, 0}, + {"DNS_LOCAL_IP6", CURLOPT_DNS_LOCAL_IP6, CURLOT_STRING, 0}, + {"DNS_SERVERS", CURLOPT_DNS_SERVERS, CURLOT_STRING, 0}, + {"DNS_SHUFFLE_ADDRESSES", CURLOPT_DNS_SHUFFLE_ADDRESSES, CURLOT_LONG, 0}, + {"DNS_USE_GLOBAL_CACHE", CURLOPT_DNS_USE_GLOBAL_CACHE, CURLOT_LONG, 0}, + {"DOH_URL", CURLOPT_DOH_URL, CURLOT_STRING, 0}, + {"EGDSOCKET", CURLOPT_EGDSOCKET, CURLOT_STRING, 0}, + {"ENCODING", CURLOPT_ACCEPT_ENCODING, CURLOT_STRING, CURLOT_FLAG_ALIAS}, + {"ERRORBUFFER", CURLOPT_ERRORBUFFER, CURLOT_OBJECT, 0}, + {"EXPECT_100_TIMEOUT_MS", CURLOPT_EXPECT_100_TIMEOUT_MS, CURLOT_LONG, 0}, + {"FAILONERROR", CURLOPT_FAILONERROR, CURLOT_LONG, 0}, + {"FILE", CURLOPT_WRITEDATA, CURLOT_CBPTR, CURLOT_FLAG_ALIAS}, + {"FILETIME", CURLOPT_FILETIME, CURLOT_LONG, 0}, + {"FNMATCH_DATA", CURLOPT_FNMATCH_DATA, CURLOT_CBPTR, 0}, + {"FNMATCH_FUNCTION", CURLOPT_FNMATCH_FUNCTION, CURLOT_FUNCTION, 0}, + {"FOLLOWLOCATION", CURLOPT_FOLLOWLOCATION, CURLOT_LONG, 0}, + {"FORBID_REUSE", CURLOPT_FORBID_REUSE, CURLOT_LONG, 0}, + {"FRESH_CONNECT", CURLOPT_FRESH_CONNECT, CURLOT_LONG, 0}, + {"FTPAPPEND", CURLOPT_APPEND, CURLOT_LONG, CURLOT_FLAG_ALIAS}, + {"FTPLISTONLY", CURLOPT_DIRLISTONLY, CURLOT_LONG, CURLOT_FLAG_ALIAS}, + {"FTPPORT", CURLOPT_FTPPORT, CURLOT_STRING, 0}, + {"FTPSSLAUTH", CURLOPT_FTPSSLAUTH, CURLOT_VALUES, 0}, + {"FTP_ACCOUNT", CURLOPT_FTP_ACCOUNT, CURLOT_STRING, 0}, + {"FTP_ALTERNATIVE_TO_USER", CURLOPT_FTP_ALTERNATIVE_TO_USER, + CURLOT_STRING, 0}, + {"FTP_CREATE_MISSING_DIRS", CURLOPT_FTP_CREATE_MISSING_DIRS, + CURLOT_LONG, 0}, + {"FTP_FILEMETHOD", CURLOPT_FTP_FILEMETHOD, CURLOT_VALUES, 0}, + {"FTP_RESPONSE_TIMEOUT", CURLOPT_FTP_RESPONSE_TIMEOUT, CURLOT_LONG, 0}, + {"FTP_SKIP_PASV_IP", CURLOPT_FTP_SKIP_PASV_IP, CURLOT_LONG, 0}, + {"FTP_SSL", CURLOPT_USE_SSL, CURLOT_VALUES, CURLOT_FLAG_ALIAS}, + {"FTP_SSL_CCC", CURLOPT_FTP_SSL_CCC, CURLOT_LONG, 0}, + {"FTP_USE_EPRT", CURLOPT_FTP_USE_EPRT, CURLOT_LONG, 0}, + {"FTP_USE_EPSV", CURLOPT_FTP_USE_EPSV, CURLOT_LONG, 0}, + {"FTP_USE_PRET", CURLOPT_FTP_USE_PRET, CURLOT_LONG, 0}, + {"GSSAPI_DELEGATION", CURLOPT_GSSAPI_DELEGATION, CURLOT_VALUES, 0}, + {"HAPPY_EYEBALLS_TIMEOUT_MS", CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS, + CURLOT_LONG, 0}, + {"HAPROXYPROTOCOL", CURLOPT_HAPROXYPROTOCOL, CURLOT_LONG, 0}, + {"HEADER", CURLOPT_HEADER, CURLOT_LONG, 0}, + {"HEADERDATA", CURLOPT_HEADERDATA, CURLOT_CBPTR, 0}, + {"HEADERFUNCTION", CURLOPT_HEADERFUNCTION, CURLOT_FUNCTION, 0}, + {"HEADEROPT", CURLOPT_HEADEROPT, CURLOT_VALUES, 0}, + {"HTTP09_ALLOWED", CURLOPT_HTTP09_ALLOWED, CURLOT_LONG, 0}, + {"HTTP200ALIASES", CURLOPT_HTTP200ALIASES, CURLOT_SLIST, 0}, + {"HTTPAUTH", CURLOPT_HTTPAUTH, CURLOT_VALUES, 0}, + {"HTTPGET", CURLOPT_HTTPGET, CURLOT_LONG, 0}, + {"HTTPHEADER", CURLOPT_HTTPHEADER, CURLOT_SLIST, 0}, + {"HTTPPOST", CURLOPT_HTTPPOST, CURLOT_OBJECT, 0}, + {"HTTPPROXYTUNNEL", CURLOPT_HTTPPROXYTUNNEL, CURLOT_LONG, 0}, + {"HTTP_CONTENT_DECODING", CURLOPT_HTTP_CONTENT_DECODING, CURLOT_LONG, 0}, + {"HTTP_TRANSFER_DECODING", CURLOPT_HTTP_TRANSFER_DECODING, CURLOT_LONG, 0}, + {"HTTP_VERSION", CURLOPT_HTTP_VERSION, CURLOT_VALUES, 0}, + {"IGNORE_CONTENT_LENGTH", CURLOPT_IGNORE_CONTENT_LENGTH, CURLOT_LONG, 0}, + {"INFILE", CURLOPT_READDATA, CURLOT_CBPTR, CURLOT_FLAG_ALIAS}, + {"INFILESIZE", CURLOPT_INFILESIZE, CURLOT_LONG, 0}, + {"INFILESIZE_LARGE", CURLOPT_INFILESIZE_LARGE, CURLOT_OFF_T, 0}, + {"INTERFACE", CURLOPT_INTERFACE, CURLOT_STRING, 0}, + {"INTERLEAVEDATA", CURLOPT_INTERLEAVEDATA, CURLOT_CBPTR, 0}, + {"INTERLEAVEFUNCTION", CURLOPT_INTERLEAVEFUNCTION, CURLOT_FUNCTION, 0}, + {"IOCTLDATA", CURLOPT_IOCTLDATA, CURLOT_CBPTR, 0}, + {"IOCTLFUNCTION", CURLOPT_IOCTLFUNCTION, CURLOT_FUNCTION, 0}, + {"IPRESOLVE", CURLOPT_IPRESOLVE, CURLOT_VALUES, 0}, + {"ISSUERCERT", CURLOPT_ISSUERCERT, CURLOT_STRING, 0}, + {"ISSUERCERT_BLOB", CURLOPT_ISSUERCERT_BLOB, CURLOT_BLOB, 0}, + {"KEEP_SENDING_ON_ERROR", CURLOPT_KEEP_SENDING_ON_ERROR, CURLOT_LONG, 0}, + {"KEYPASSWD", CURLOPT_KEYPASSWD, CURLOT_STRING, 0}, + {"KRB4LEVEL", CURLOPT_KRBLEVEL, CURLOT_STRING, CURLOT_FLAG_ALIAS}, + {"KRBLEVEL", CURLOPT_KRBLEVEL, CURLOT_STRING, 0}, + {"LOCALPORT", CURLOPT_LOCALPORT, CURLOT_LONG, 0}, + {"LOCALPORTRANGE", CURLOPT_LOCALPORTRANGE, CURLOT_LONG, 0}, + {"LOGIN_OPTIONS", CURLOPT_LOGIN_OPTIONS, CURLOT_STRING, 0}, + {"LOW_SPEED_LIMIT", CURLOPT_LOW_SPEED_LIMIT, CURLOT_LONG, 0}, + {"LOW_SPEED_TIME", CURLOPT_LOW_SPEED_TIME, CURLOT_LONG, 0}, + {"MAIL_AUTH", CURLOPT_MAIL_AUTH, CURLOT_STRING, 0}, + {"MAIL_FROM", CURLOPT_MAIL_FROM, CURLOT_STRING, 0}, + {"MAIL_RCPT", CURLOPT_MAIL_RCPT, CURLOT_SLIST, 0}, + {"MAIL_RCPT_ALLLOWFAILS", CURLOPT_MAIL_RCPT_ALLLOWFAILS, CURLOT_LONG, 0}, + {"MAXAGE_CONN", CURLOPT_MAXAGE_CONN, CURLOT_LONG, 0}, + {"MAXCONNECTS", CURLOPT_MAXCONNECTS, CURLOT_LONG, 0}, + {"MAXFILESIZE", CURLOPT_MAXFILESIZE, CURLOT_LONG, 0}, + {"MAXFILESIZE_LARGE", CURLOPT_MAXFILESIZE_LARGE, CURLOT_OFF_T, 0}, + {"MAXREDIRS", CURLOPT_MAXREDIRS, CURLOT_LONG, 0}, + {"MAX_RECV_SPEED_LARGE", CURLOPT_MAX_RECV_SPEED_LARGE, CURLOT_OFF_T, 0}, + {"MAX_SEND_SPEED_LARGE", CURLOPT_MAX_SEND_SPEED_LARGE, CURLOT_OFF_T, 0}, + {"MIMEPOST", CURLOPT_MIMEPOST, CURLOT_OBJECT, 0}, + {"NETRC", CURLOPT_NETRC, CURLOT_VALUES, 0}, + {"NETRC_FILE", CURLOPT_NETRC_FILE, CURLOT_STRING, 0}, + {"NEW_DIRECTORY_PERMS", CURLOPT_NEW_DIRECTORY_PERMS, CURLOT_LONG, 0}, + {"NEW_FILE_PERMS", CURLOPT_NEW_FILE_PERMS, CURLOT_LONG, 0}, + {"NOBODY", CURLOPT_NOBODY, CURLOT_LONG, 0}, + {"NOPROGRESS", CURLOPT_NOPROGRESS, CURLOT_LONG, 0}, + {"NOPROXY", CURLOPT_NOPROXY, CURLOT_STRING, 0}, + {"NOSIGNAL", CURLOPT_NOSIGNAL, CURLOT_LONG, 0}, + {"OPENSOCKETDATA", CURLOPT_OPENSOCKETDATA, CURLOT_CBPTR, 0}, + {"OPENSOCKETFUNCTION", CURLOPT_OPENSOCKETFUNCTION, CURLOT_FUNCTION, 0}, + {"PASSWORD", CURLOPT_PASSWORD, CURLOT_STRING, 0}, + {"PATH_AS_IS", CURLOPT_PATH_AS_IS, CURLOT_LONG, 0}, + {"PINNEDPUBLICKEY", CURLOPT_PINNEDPUBLICKEY, CURLOT_STRING, 0}, + {"PIPEWAIT", CURLOPT_PIPEWAIT, CURLOT_LONG, 0}, + {"PORT", CURLOPT_PORT, CURLOT_LONG, 0}, + {"POST", CURLOPT_POST, CURLOT_LONG, 0}, + {"POST301", CURLOPT_POSTREDIR, CURLOT_VALUES, CURLOT_FLAG_ALIAS}, + {"POSTFIELDS", CURLOPT_POSTFIELDS, CURLOT_OBJECT, 0}, + {"POSTFIELDSIZE", CURLOPT_POSTFIELDSIZE, CURLOT_LONG, 0}, + {"POSTFIELDSIZE_LARGE", CURLOPT_POSTFIELDSIZE_LARGE, CURLOT_OFF_T, 0}, + {"POSTQUOTE", CURLOPT_POSTQUOTE, CURLOT_SLIST, 0}, + {"POSTREDIR", CURLOPT_POSTREDIR, CURLOT_VALUES, 0}, + {"PREQUOTE", CURLOPT_PREQUOTE, CURLOT_SLIST, 0}, + {"PRE_PROXY", CURLOPT_PRE_PROXY, CURLOT_STRING, 0}, + {"PRIVATE", CURLOPT_PRIVATE, CURLOT_OBJECT, 0}, + {"PROGRESSDATA", CURLOPT_XFERINFODATA, CURLOT_CBPTR, CURLOT_FLAG_ALIAS}, + {"PROGRESSFUNCTION", CURLOPT_PROGRESSFUNCTION, CURLOT_FUNCTION, 0}, + {"PROTOCOLS", CURLOPT_PROTOCOLS, CURLOT_LONG, 0}, + {"PROXY", CURLOPT_PROXY, CURLOT_STRING, 0}, + {"PROXYAUTH", CURLOPT_PROXYAUTH, CURLOT_VALUES, 0}, + {"PROXYHEADER", CURLOPT_PROXYHEADER, CURLOT_SLIST, 0}, + {"PROXYPASSWORD", CURLOPT_PROXYPASSWORD, CURLOT_STRING, 0}, + {"PROXYPORT", CURLOPT_PROXYPORT, CURLOT_LONG, 0}, + {"PROXYTYPE", CURLOPT_PROXYTYPE, CURLOT_VALUES, 0}, + {"PROXYUSERNAME", CURLOPT_PROXYUSERNAME, CURLOT_STRING, 0}, + {"PROXYUSERPWD", CURLOPT_PROXYUSERPWD, CURLOT_STRING, 0}, + {"PROXY_CAINFO", CURLOPT_PROXY_CAINFO, CURLOT_STRING, 0}, + {"PROXY_CAPATH", CURLOPT_PROXY_CAPATH, CURLOT_STRING, 0}, + {"PROXY_CRLFILE", CURLOPT_PROXY_CRLFILE, CURLOT_STRING, 0}, + {"PROXY_ISSUERCERT", CURLOPT_PROXY_ISSUERCERT, CURLOT_STRING, 0}, + {"PROXY_ISSUERCERT_BLOB", CURLOPT_PROXY_ISSUERCERT_BLOB, CURLOT_BLOB, 0}, + {"PROXY_KEYPASSWD", CURLOPT_PROXY_KEYPASSWD, CURLOT_STRING, 0}, + {"PROXY_PINNEDPUBLICKEY", CURLOPT_PROXY_PINNEDPUBLICKEY, CURLOT_STRING, 0}, + {"PROXY_SERVICE_NAME", CURLOPT_PROXY_SERVICE_NAME, CURLOT_STRING, 0}, + {"PROXY_SSLCERT", CURLOPT_PROXY_SSLCERT, CURLOT_STRING, 0}, + {"PROXY_SSLCERTTYPE", CURLOPT_PROXY_SSLCERTTYPE, CURLOT_STRING, 0}, + {"PROXY_SSLCERT_BLOB", CURLOPT_PROXY_SSLCERT_BLOB, CURLOT_BLOB, 0}, + {"PROXY_SSLKEY", CURLOPT_PROXY_SSLKEY, CURLOT_STRING, 0}, + {"PROXY_SSLKEYTYPE", CURLOPT_PROXY_SSLKEYTYPE, CURLOT_STRING, 0}, + {"PROXY_SSLKEY_BLOB", CURLOPT_PROXY_SSLKEY_BLOB, CURLOT_BLOB, 0}, + {"PROXY_SSLVERSION", CURLOPT_PROXY_SSLVERSION, CURLOT_VALUES, 0}, + {"PROXY_SSL_CIPHER_LIST", CURLOPT_PROXY_SSL_CIPHER_LIST, CURLOT_STRING, 0}, + {"PROXY_SSL_OPTIONS", CURLOPT_PROXY_SSL_OPTIONS, CURLOT_LONG, 0}, + {"PROXY_SSL_VERIFYHOST", CURLOPT_PROXY_SSL_VERIFYHOST, CURLOT_LONG, 0}, + {"PROXY_SSL_VERIFYPEER", CURLOPT_PROXY_SSL_VERIFYPEER, CURLOT_LONG, 0}, + {"PROXY_TLS13_CIPHERS", CURLOPT_PROXY_TLS13_CIPHERS, CURLOT_STRING, 0}, + {"PROXY_TLSAUTH_PASSWORD", CURLOPT_PROXY_TLSAUTH_PASSWORD, + CURLOT_STRING, 0}, + {"PROXY_TLSAUTH_TYPE", CURLOPT_PROXY_TLSAUTH_TYPE, CURLOT_STRING, 0}, + {"PROXY_TLSAUTH_USERNAME", CURLOPT_PROXY_TLSAUTH_USERNAME, + CURLOT_STRING, 0}, + {"PROXY_TRANSFER_MODE", CURLOPT_PROXY_TRANSFER_MODE, CURLOT_LONG, 0}, + {"PUT", CURLOPT_PUT, CURLOT_LONG, 0}, + {"QUOTE", CURLOPT_QUOTE, CURLOT_SLIST, 0}, + {"RANDOM_FILE", CURLOPT_RANDOM_FILE, CURLOT_STRING, 0}, + {"RANGE", CURLOPT_RANGE, CURLOT_STRING, 0}, + {"READDATA", CURLOPT_READDATA, CURLOT_CBPTR, 0}, + {"READFUNCTION", CURLOPT_READFUNCTION, CURLOT_FUNCTION, 0}, + {"REDIR_PROTOCOLS", CURLOPT_REDIR_PROTOCOLS, CURLOT_LONG, 0}, + {"REFERER", CURLOPT_REFERER, CURLOT_STRING, 0}, + {"REQUEST_TARGET", CURLOPT_REQUEST_TARGET, CURLOT_STRING, 0}, + {"RESOLVE", CURLOPT_RESOLVE, CURLOT_SLIST, 0}, + {"RESOLVER_START_DATA", CURLOPT_RESOLVER_START_DATA, CURLOT_CBPTR, 0}, + {"RESOLVER_START_FUNCTION", CURLOPT_RESOLVER_START_FUNCTION, + CURLOT_FUNCTION, 0}, + {"RESUME_FROM", CURLOPT_RESUME_FROM, CURLOT_LONG, 0}, + {"RESUME_FROM_LARGE", CURLOPT_RESUME_FROM_LARGE, CURLOT_OFF_T, 0}, + {"RTSPHEADER", CURLOPT_HTTPHEADER, CURLOT_SLIST, CURLOT_FLAG_ALIAS}, + {"RTSP_CLIENT_CSEQ", CURLOPT_RTSP_CLIENT_CSEQ, CURLOT_LONG, 0}, + {"RTSP_REQUEST", CURLOPT_RTSP_REQUEST, CURLOT_VALUES, 0}, + {"RTSP_SERVER_CSEQ", CURLOPT_RTSP_SERVER_CSEQ, CURLOT_LONG, 0}, + {"RTSP_SESSION_ID", CURLOPT_RTSP_SESSION_ID, CURLOT_STRING, 0}, + {"RTSP_STREAM_URI", CURLOPT_RTSP_STREAM_URI, CURLOT_STRING, 0}, + {"RTSP_TRANSPORT", CURLOPT_RTSP_TRANSPORT, CURLOT_STRING, 0}, + {"SASL_AUTHZID", CURLOPT_SASL_AUTHZID, CURLOT_STRING, 0}, + {"SASL_IR", CURLOPT_SASL_IR, CURLOT_LONG, 0}, + {"SEEKDATA", CURLOPT_SEEKDATA, CURLOT_CBPTR, 0}, + {"SEEKFUNCTION", CURLOPT_SEEKFUNCTION, CURLOT_FUNCTION, 0}, + {"SERVER_RESPONSE_TIMEOUT", CURLOPT_FTP_RESPONSE_TIMEOUT, + CURLOT_LONG, CURLOT_FLAG_ALIAS}, + {"SERVICE_NAME", CURLOPT_SERVICE_NAME, CURLOT_STRING, 0}, + {"SHARE", CURLOPT_SHARE, CURLOT_OBJECT, 0}, + {"SOCKOPTDATA", CURLOPT_SOCKOPTDATA, CURLOT_CBPTR, 0}, + {"SOCKOPTFUNCTION", CURLOPT_SOCKOPTFUNCTION, CURLOT_FUNCTION, 0}, + {"SOCKS5_AUTH", CURLOPT_SOCKS5_AUTH, CURLOT_LONG, 0}, + {"SOCKS5_GSSAPI_NEC", CURLOPT_SOCKS5_GSSAPI_NEC, CURLOT_LONG, 0}, + {"SOCKS5_GSSAPI_SERVICE", CURLOPT_SOCKS5_GSSAPI_SERVICE, CURLOT_STRING, 0}, + {"SSH_AUTH_TYPES", CURLOPT_SSH_AUTH_TYPES, CURLOT_VALUES, 0}, + {"SSH_COMPRESSION", CURLOPT_SSH_COMPRESSION, CURLOT_LONG, 0}, + {"SSH_HOST_PUBLIC_KEY_MD5", CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, + CURLOT_STRING, 0}, + {"SSH_KEYDATA", CURLOPT_SSH_KEYDATA, CURLOT_CBPTR, 0}, + {"SSH_KEYFUNCTION", CURLOPT_SSH_KEYFUNCTION, CURLOT_FUNCTION, 0}, + {"SSH_KNOWNHOSTS", CURLOPT_SSH_KNOWNHOSTS, CURLOT_STRING, 0}, + {"SSH_PRIVATE_KEYFILE", CURLOPT_SSH_PRIVATE_KEYFILE, CURLOT_STRING, 0}, + {"SSH_PUBLIC_KEYFILE", CURLOPT_SSH_PUBLIC_KEYFILE, CURLOT_STRING, 0}, + {"SSLCERT", CURLOPT_SSLCERT, CURLOT_STRING, 0}, + {"SSLCERTPASSWD", CURLOPT_KEYPASSWD, CURLOT_STRING, CURLOT_FLAG_ALIAS}, + {"SSLCERTTYPE", CURLOPT_SSLCERTTYPE, CURLOT_STRING, 0}, + {"SSLCERT_BLOB", CURLOPT_SSLCERT_BLOB, CURLOT_BLOB, 0}, + {"SSLENGINE", CURLOPT_SSLENGINE, CURLOT_STRING, 0}, + {"SSLENGINE_DEFAULT", CURLOPT_SSLENGINE_DEFAULT, CURLOT_LONG, 0}, + {"SSLKEY", CURLOPT_SSLKEY, CURLOT_STRING, 0}, + {"SSLKEYPASSWD", CURLOPT_KEYPASSWD, CURLOT_STRING, CURLOT_FLAG_ALIAS}, + {"SSLKEYTYPE", CURLOPT_SSLKEYTYPE, CURLOT_STRING, 0}, + {"SSLKEY_BLOB", CURLOPT_SSLKEY_BLOB, CURLOT_BLOB, 0}, + {"SSLVERSION", CURLOPT_SSLVERSION, CURLOT_VALUES, 0}, + {"SSL_CIPHER_LIST", CURLOPT_SSL_CIPHER_LIST, CURLOT_STRING, 0}, + {"SSL_CTX_DATA", CURLOPT_SSL_CTX_DATA, CURLOT_CBPTR, 0}, + {"SSL_CTX_FUNCTION", CURLOPT_SSL_CTX_FUNCTION, CURLOT_FUNCTION, 0}, + {"SSL_EC_CURVES", CURLOPT_SSL_EC_CURVES, CURLOT_STRING, 0}, + {"SSL_ENABLE_ALPN", CURLOPT_SSL_ENABLE_ALPN, CURLOT_LONG, 0}, + {"SSL_ENABLE_NPN", CURLOPT_SSL_ENABLE_NPN, CURLOT_LONG, 0}, + {"SSL_FALSESTART", CURLOPT_SSL_FALSESTART, CURLOT_LONG, 0}, + {"SSL_OPTIONS", CURLOPT_SSL_OPTIONS, CURLOT_VALUES, 0}, + {"SSL_SESSIONID_CACHE", CURLOPT_SSL_SESSIONID_CACHE, CURLOT_LONG, 0}, + {"SSL_VERIFYHOST", CURLOPT_SSL_VERIFYHOST, CURLOT_LONG, 0}, + {"SSL_VERIFYPEER", CURLOPT_SSL_VERIFYPEER, CURLOT_LONG, 0}, + {"SSL_VERIFYSTATUS", CURLOPT_SSL_VERIFYSTATUS, CURLOT_LONG, 0}, + {"STDERR", CURLOPT_STDERR, CURLOT_OBJECT, 0}, + {"STREAM_DEPENDS", CURLOPT_STREAM_DEPENDS, CURLOT_OBJECT, 0}, + {"STREAM_DEPENDS_E", CURLOPT_STREAM_DEPENDS_E, CURLOT_OBJECT, 0}, + {"STREAM_WEIGHT", CURLOPT_STREAM_WEIGHT, CURLOT_LONG, 0}, + {"SUPPRESS_CONNECT_HEADERS", CURLOPT_SUPPRESS_CONNECT_HEADERS, + CURLOT_LONG, 0}, + {"TCP_FASTOPEN", CURLOPT_TCP_FASTOPEN, CURLOT_LONG, 0}, + {"TCP_KEEPALIVE", CURLOPT_TCP_KEEPALIVE, CURLOT_LONG, 0}, + {"TCP_KEEPIDLE", CURLOPT_TCP_KEEPIDLE, CURLOT_LONG, 0}, + {"TCP_KEEPINTVL", CURLOPT_TCP_KEEPINTVL, CURLOT_LONG, 0}, + {"TCP_NODELAY", CURLOPT_TCP_NODELAY, CURLOT_LONG, 0}, + {"TELNETOPTIONS", CURLOPT_TELNETOPTIONS, CURLOT_SLIST, 0}, + {"TFTP_BLKSIZE", CURLOPT_TFTP_BLKSIZE, CURLOT_LONG, 0}, + {"TFTP_NO_OPTIONS", CURLOPT_TFTP_NO_OPTIONS, CURLOT_LONG, 0}, + {"TIMECONDITION", CURLOPT_TIMECONDITION, CURLOT_VALUES, 0}, + {"TIMEOUT", CURLOPT_TIMEOUT, CURLOT_LONG, 0}, + {"TIMEOUT_MS", CURLOPT_TIMEOUT_MS, CURLOT_LONG, 0}, + {"TIMEVALUE", CURLOPT_TIMEVALUE, CURLOT_LONG, 0}, + {"TIMEVALUE_LARGE", CURLOPT_TIMEVALUE_LARGE, CURLOT_OFF_T, 0}, + {"TLS13_CIPHERS", CURLOPT_TLS13_CIPHERS, CURLOT_STRING, 0}, + {"TLSAUTH_PASSWORD", CURLOPT_TLSAUTH_PASSWORD, CURLOT_STRING, 0}, + {"TLSAUTH_TYPE", CURLOPT_TLSAUTH_TYPE, CURLOT_STRING, 0}, + {"TLSAUTH_USERNAME", CURLOPT_TLSAUTH_USERNAME, CURLOT_STRING, 0}, + {"TRAILERDATA", CURLOPT_TRAILERDATA, CURLOT_CBPTR, 0}, + {"TRAILERFUNCTION", CURLOPT_TRAILERFUNCTION, CURLOT_FUNCTION, 0}, + {"TRANSFERTEXT", CURLOPT_TRANSFERTEXT, CURLOT_LONG, 0}, + {"TRANSFER_ENCODING", CURLOPT_TRANSFER_ENCODING, CURLOT_LONG, 0}, + {"UNIX_SOCKET_PATH", CURLOPT_UNIX_SOCKET_PATH, CURLOT_STRING, 0}, + {"UNRESTRICTED_AUTH", CURLOPT_UNRESTRICTED_AUTH, CURLOT_LONG, 0}, + {"UPKEEP_INTERVAL_MS", CURLOPT_UPKEEP_INTERVAL_MS, CURLOT_LONG, 0}, + {"UPLOAD", CURLOPT_UPLOAD, CURLOT_LONG, 0}, + {"UPLOAD_BUFFERSIZE", CURLOPT_UPLOAD_BUFFERSIZE, CURLOT_LONG, 0}, + {"URL", CURLOPT_URL, CURLOT_STRING, 0}, + {"USERAGENT", CURLOPT_USERAGENT, CURLOT_STRING, 0}, + {"USERNAME", CURLOPT_USERNAME, CURLOT_STRING, 0}, + {"USERPWD", CURLOPT_USERPWD, CURLOT_STRING, 0}, + {"USE_SSL", CURLOPT_USE_SSL, CURLOT_VALUES, 0}, + {"VERBOSE", CURLOPT_VERBOSE, CURLOT_LONG, 0}, + {"WILDCARDMATCH", CURLOPT_WILDCARDMATCH, CURLOT_LONG, 0}, + {"WRITEDATA", CURLOPT_WRITEDATA, CURLOT_CBPTR, 0}, + {"WRITEFUNCTION", CURLOPT_WRITEFUNCTION, CURLOT_FUNCTION, 0}, + {"WRITEHEADER", CURLOPT_HEADERDATA, CURLOT_CBPTR, CURLOT_FLAG_ALIAS}, + {"XFERINFODATA", CURLOPT_XFERINFODATA, CURLOT_CBPTR, 0}, + {"XFERINFOFUNCTION", CURLOPT_XFERINFOFUNCTION, CURLOT_FUNCTION, 0}, + {"XOAUTH2_BEARER", CURLOPT_XOAUTH2_BEARER, CURLOT_STRING, 0}, + {NULL, CURLOPT_LASTENTRY, 0, 0} /* end of table */ +}; + +#ifdef DEBUGBUILD +/* + * Curl_easyopts_check() is a debug-only function that returns non-zero + * if this source file is not in sync with the options listed in curl/curl.h + */ +int Curl_easyopts_check(void) +{ + return (CURLOPT_LASTENTRY != (298 + 1)); +} +#endif diff --git a/libs/libcurl/src/easyoptions.h b/libs/libcurl/src/easyoptions.h new file mode 100644 index 0000000000..cd8b4100dc --- /dev/null +++ b/libs/libcurl/src/easyoptions.h @@ -0,0 +1,35 @@ +#ifndef HEADER_CURL_EASYOPTIONS_H +#define HEADER_CURL_EASYOPTIONS_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2020, 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 + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* should probably go into the public header */ + +#include + +/* generated table with all easy options */ +extern struct curl_easyoption Curl_easyopts[]; + +#ifdef DEBUGBUILD +int Curl_easyopts_check(void); +#endif +#endif diff --git a/libs/libcurl/src/file.c b/libs/libcurl/src/file.c index cd3e49c339..1872dfef0d 100644 --- a/libs/libcurl/src/file.c +++ b/libs/libcurl/src/file.c @@ -67,8 +67,7 @@ #include "curl_memory.h" #include "memdebug.h" -#if defined(WIN32) || defined(MSDOS) || defined(__EMX__) || \ - defined(__SYMBIAN32__) +#if defined(WIN32) || defined(MSDOS) || defined(__EMX__) #define DOS_FILESYSTEM 1 #endif @@ -112,6 +111,7 @@ const struct Curl_handler Curl_handler_file = { ZERO_NULL, /* connection_check */ 0, /* defport */ CURLPROTO_FILE, /* protocol */ + CURLPROTO_FILE, /* family */ PROTOPT_NONETWORK | PROTOPT_NOURLQUERY /* flags */ }; diff --git a/libs/libcurl/src/fileinfo.h b/libs/libcurl/src/fileinfo.h index f4d8f3b90e..fdbad8bf2e 100644 --- a/libs/libcurl/src/fileinfo.h +++ b/libs/libcurl/src/fileinfo.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2010 - 2018, Daniel Stenberg, , et al. + * Copyright (C) 2010 - 2020, 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 @@ -27,7 +27,7 @@ struct fileinfo { struct curl_fileinfo info; - struct curl_llist_element list; + struct Curl_llist_element list; }; struct fileinfo *Curl_fileinfo_alloc(void); diff --git a/libs/libcurl/src/ftp.c b/libs/libcurl/src/ftp.c index 9fadac5138..11031da6fb 100644 --- a/libs/libcurl/src/ftp.c +++ b/libs/libcurl/src/ftp.c @@ -59,7 +59,7 @@ #include "fileinfo.h" #include "ftplistparser.h" #include "curl_range.h" -#include "curl_sec.h" +#include "curl_krb5.h" #include "strtoofft.h" #include "strcase.h" #include "vtls/vtls.h" @@ -137,14 +137,10 @@ static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks); static CURLcode ftp_doing(struct connectdata *conn, bool *dophase_done); static CURLcode ftp_setup_connection(struct connectdata *conn); - static CURLcode init_wc_data(struct connectdata *conn); static CURLcode wc_statemach(struct connectdata *conn); - static void wc_data_dtor(void *ptr); - static CURLcode ftp_state_retr(struct connectdata *conn, curl_off_t filesize); - static CURLcode ftp_readresp(curl_socket_t sockfd, struct pingpong *pp, int *ftpcode, @@ -152,12 +148,6 @@ static CURLcode ftp_readresp(curl_socket_t sockfd, static CURLcode ftp_dophase_done(struct connectdata *conn, bool connected); -/* easy-to-use macro: */ -#define PPSENDF(x,y,z) result = Curl_pp_sendf(x,y,z); \ - if(result) \ - return result - - /* * FTP protocol handler. */ @@ -180,6 +170,7 @@ const struct Curl_handler Curl_handler_ftp = { ZERO_NULL, /* connection_check */ PORT_FTP, /* defport */ CURLPROTO_FTP, /* protocol */ + CURLPROTO_FTP, /* family */ PROTOPT_DUAL | PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD | PROTOPT_NOURLQUERY | PROTOPT_PROXY_AS_HTTP | PROTOPT_WILDCARD /* flags */ @@ -209,6 +200,7 @@ const struct Curl_handler Curl_handler_ftps = { ZERO_NULL, /* connection_check */ PORT_FTPS, /* defport */ CURLPROTO_FTPS, /* protocol */ + CURLPROTO_FTP, /* family */ PROTOPT_SSL | PROTOPT_DUAL | PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD | PROTOPT_NOURLQUERY | PROTOPT_WILDCARD /* flags */ }; @@ -775,25 +767,22 @@ static void _state(struct connectdata *conn, static CURLcode ftp_state_user(struct connectdata *conn) { - CURLcode result; - /* send USER */ - PPSENDF(&conn->proto.ftpc.pp, "USER %s", conn->user?conn->user:""); - - state(conn, FTP_USER); - conn->data->state.ftp_trying_alternative = FALSE; - - return CURLE_OK; + CURLcode result = Curl_pp_sendf(&conn->proto.ftpc.pp, "USER %s", + conn->user?conn->user:""); + if(!result) { + state(conn, FTP_USER); + conn->data->state.ftp_trying_alternative = FALSE; + } + return result; } static CURLcode ftp_state_pwd(struct connectdata *conn) { - CURLcode result; - - /* send PWD to discover our entry point */ - PPSENDF(&conn->proto.ftpc.pp, "%s", "PWD"); - state(conn, FTP_PWD); + CURLcode result = Curl_pp_sendf(&conn->proto.ftpc.pp, "%s", "PWD"); + if(!result) + state(conn, FTP_PWD); - return CURLE_OK; + return result; } /* For the FTP "protocol connect" and "doing" phases only */ @@ -881,16 +870,19 @@ static CURLcode ftp_state_cwd(struct connectdata *conn) where we ended up after login: */ ftpc->cwdcount = 0; /* we count this as the first path, then we add one for all upcoming ones in the ftp->dirs[] array */ - PPSENDF(&conn->proto.ftpc.pp, "CWD %s", ftpc->entrypath); - state(conn, FTP_CWD); + result = Curl_pp_sendf(&ftpc->pp, "CWD %s", ftpc->entrypath); + if(!result) + state(conn, FTP_CWD); } else { if(ftpc->dirdepth) { ftpc->cwdcount = 1; /* issue the first CWD, the rest is sent when the CWD responses are received... */ - PPSENDF(&conn->proto.ftpc.pp, "CWD %s", ftpc->dirs[ftpc->cwdcount -1]); - state(conn, FTP_CWD); + result = Curl_pp_sendf(&ftpc->pp, "CWD %s", + ftpc->dirs[ftpc->cwdcount -1]); + if(!result) + state(conn, FTP_CWD); } else { /* No CWD necessary */ @@ -1326,12 +1318,12 @@ static CURLcode ftp_state_use_pasv(struct connectdata *conn) modeoff = conn->bits.ftp_use_epsv?0:1; - PPSENDF(&ftpc->pp, "%s", mode[modeoff]); - - ftpc->count1 = modeoff; - state(conn, FTP_PASV); - infof(conn->data, "Connect data stream passively\n"); - + result = Curl_pp_sendf(&ftpc->pp, "%s", mode[modeoff]); + if(!result) { + ftpc->count1 = modeoff; + state(conn, FTP_PASV); + infof(conn->data, "Connect data stream passively\n"); + } return result; } @@ -1364,23 +1356,23 @@ static CURLcode ftp_state_prepare_transfer(struct connectdata *conn) if(data->set.ftp_use_pret) { /* The user has requested that we send a PRET command to prepare the server for the upcoming PASV */ - if(!conn->proto.ftpc.file) { - PPSENDF(&conn->proto.ftpc.pp, "PRET %s", - data->set.str[STRING_CUSTOMREQUEST]? - data->set.str[STRING_CUSTOMREQUEST]: - (data->set.ftp_list_only?"NLST":"LIST")); - } - else if(data->set.upload) { - PPSENDF(&conn->proto.ftpc.pp, "PRET STOR %s", conn->proto.ftpc.file); - } - else { - PPSENDF(&conn->proto.ftpc.pp, "PRET RETR %s", conn->proto.ftpc.file); - } - state(conn, FTP_PRET); + struct ftp_conn *ftpc = &conn->proto.ftpc; + if(!conn->proto.ftpc.file) + result = Curl_pp_sendf(&ftpc->pp, "PRET %s", + data->set.str[STRING_CUSTOMREQUEST]? + data->set.str[STRING_CUSTOMREQUEST]: + (data->set.ftp_list_only?"NLST":"LIST")); + else if(data->set.upload) + result = Curl_pp_sendf(&ftpc->pp, "PRET STOR %s", + conn->proto.ftpc.file); + else + result = Curl_pp_sendf(&ftpc->pp, "PRET RETR %s", + conn->proto.ftpc.file); + if(!result) + state(conn, FTP_PRET); } - else { + else result = ftp_state_use_pasv(conn); - } } return result; } @@ -1396,9 +1388,9 @@ static CURLcode ftp_state_rest(struct connectdata *conn) /* Determine if server can respond to REST command and therefore whether it supports range */ - PPSENDF(&conn->proto.ftpc.pp, "REST %d", 0); - - state(conn, FTP_REST); + result = Curl_pp_sendf(&ftpc->pp, "REST %d", 0); + if(!result) + state(conn, FTP_REST); } else result = ftp_state_prepare_transfer(conn); @@ -1416,9 +1408,9 @@ static CURLcode ftp_state_size(struct connectdata *conn) /* if a "head"-like request is being made (on a file) */ /* we know ftpc->file is a valid pointer to a file name */ - PPSENDF(&ftpc->pp, "SIZE %s", ftpc->file); - - state(conn, FTP_SIZE); + result = Curl_pp_sendf(&ftpc->pp, "SIZE %s", ftpc->file); + if(!result) + state(conn, FTP_SIZE); } else result = ftp_state_rest(conn); @@ -1485,10 +1477,8 @@ static CURLcode ftp_state_list(struct connectdata *conn) result = Curl_pp_sendf(&conn->proto.ftpc.pp, "%s", cmd); free(cmd); - if(result) - return result; - - state(conn, FTP_LIST); + if(!result) + state(conn, FTP_LIST); return result; } @@ -1549,9 +1539,10 @@ static CURLcode ftp_state_mdtm(struct connectdata *conn) /* we have requested to get the modified-time of the file, this is a white spot as the MDTM is not mentioned in RFC959 */ - PPSENDF(&ftpc->pp, "MDTM %s", ftpc->file); + result = Curl_pp_sendf(&ftpc->pp, "MDTM %s", ftpc->file); - state(conn, FTP_MDTM); + if(!result) + state(conn, FTP_MDTM); } else result = ftp_state_type(conn); @@ -1587,8 +1578,9 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn, if(data->state.resume_from < 0) { /* Got no given size to start from, figure it out */ - PPSENDF(&ftpc->pp, "SIZE %s", ftpc->file); - state(conn, FTP_STOR_SIZE); + result = Curl_pp_sendf(&ftpc->pp, "SIZE %s", ftpc->file); + if(!result) + state(conn, FTP_STOR_SIZE); return result; } @@ -1650,10 +1642,10 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn, /* we've passed, proceed as normal */ } /* resume_from */ - PPSENDF(&ftpc->pp, data->set.ftp_append?"APPE %s":"STOR %s", - ftpc->file); - - state(conn, FTP_STOR); + result = Curl_pp_sendf(&ftpc->pp, data->set.ftp_append?"APPE %s":"STOR %s", + ftpc->file); + if(!result) + state(conn, FTP_STOR); return result; } @@ -1711,7 +1703,9 @@ static CURLcode ftp_state_quote(struct connectdata *conn, else ftpc->count2 = 0; /* failure means cancel operation */ - PPSENDF(&ftpc->pp, "%s", cmd); + result = Curl_pp_sendf(&ftpc->pp, "%s", cmd); + if(result) + return result; state(conn, instate); quote = TRUE; } @@ -1740,12 +1734,14 @@ static CURLcode ftp_state_quote(struct connectdata *conn, the server terminates it, otherwise the client stops if the received byte count exceeds the reported file size. Set option CURLOPT_IGNORE_CONTENT_LENGTH to 1 to enable this behavior.*/ - PPSENDF(&ftpc->pp, "RETR %s", ftpc->file); - state(conn, FTP_RETR); + result = Curl_pp_sendf(&ftpc->pp, "RETR %s", ftpc->file); + if(!result) + state(conn, FTP_RETR); } else { - PPSENDF(&ftpc->pp, "SIZE %s", ftpc->file); - state(conn, FTP_RETR_SIZE); + result = Curl_pp_sendf(&ftpc->pp, "SIZE %s", ftpc->file); + if(!result) + state(conn, FTP_RETR_SIZE); } } } @@ -1782,10 +1778,12 @@ static CURLcode ftp_epsv_disable(struct connectdata *conn) conn->bits.ftp_use_epsv = FALSE; conn->data->state.errorbuf = FALSE; /* allow error message to get rewritten */ - PPSENDF(&conn->proto.ftpc.pp, "%s", "PASV"); - conn->proto.ftpc.count1++; - /* remain in/go to the FTP_PASV state */ - state(conn, FTP_PASV); + result = Curl_pp_sendf(&conn->proto.ftpc.pp, "%s", "PASV"); + if(!result) { + conn->proto.ftpc.count1++; + /* remain in/go to the FTP_PASV state */ + state(conn, FTP_PASV); + } return result; } @@ -1864,8 +1862,8 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn, else if((ftpc->count1 == 1) && (ftpcode == 227)) { /* positive PASV response */ - unsigned int ip[4]; - unsigned int port[2]; + unsigned int ip[4] = {0, 0, 0, 0}; + unsigned int port[2] = {0, 0}; /* * Scan for a sequence of six comma-separated numbers and use them as @@ -2092,7 +2090,7 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn, break; case 550: /* "No such file or directory" */ failf(data, "Given file does not exist"); - result = CURLE_FTP_COULDNT_RETR_FILE; + result = CURLE_REMOTE_FILE_NOT_FOUND; break; } @@ -2229,15 +2227,16 @@ static CURLcode ftp_state_retr(struct connectdata *conn, infof(data, "Instructs server to resume from offset %" CURL_FORMAT_CURL_OFF_T "\n", data->state.resume_from); - PPSENDF(&ftpc->pp, "REST %" CURL_FORMAT_CURL_OFF_T, - data->state.resume_from); - - state(conn, FTP_RETR_REST); + result = Curl_pp_sendf(&ftpc->pp, "REST %" CURL_FORMAT_CURL_OFF_T, + data->state.resume_from); + if(!result) + state(conn, FTP_RETR_REST); } else { /* no resume */ - PPSENDF(&ftpc->pp, "RETR %s", ftpc->file); - state(conn, FTP_RETR); + result = Curl_pp_sendf(&ftpc->pp, "RETR %s", ftpc->file); + if(!result) + state(conn, FTP_RETR); } return result; @@ -2272,6 +2271,10 @@ static CURLcode ftp_state_size_resp(struct connectdata *conn, (void)curlx_strtoofft(fdigit, NULL, 0, &filesize); } + else if(ftpcode == 550) { /* "No such file or directory" */ + failf(data, "The file does not exist"); + return CURLE_REMOTE_FILE_NOT_FOUND; + } if(instate == FTP_SIZE) { #ifdef CURL_FTP_HTTPSTYLE_HEAD @@ -2326,8 +2329,9 @@ static CURLcode ftp_state_rest_resp(struct connectdata *conn, result = CURLE_FTP_COULDNT_USE_REST; } else { - PPSENDF(&ftpc->pp, "RETR %s", ftpc->file); - state(conn, FTP_RETR); + result = Curl_pp_sendf(&ftpc->pp, "RETR %s", ftpc->file); + if(!result) + state(conn, FTP_RETR); } break; } @@ -2504,7 +2508,7 @@ static CURLcode ftp_state_loggedin(struct connectdata *conn) { CURLcode result = CURLE_OK; - if(conn->ssl[FIRSTSOCKET].use) { + if(conn->bits.ftp_use_control_ssl) { /* PBSZ = PROTECTION BUFFER SIZE. The 'draft-murray-auth-ftp-ssl' (draft 12, page 7) says: @@ -2519,8 +2523,9 @@ static CURLcode ftp_state_loggedin(struct connectdata *conn) parameter of '0' to indicate that no buffering is taking place and the data connection should not be encapsulated. */ - PPSENDF(&conn->proto.ftpc.pp, "PBSZ %d", 0); - state(conn, FTP_PBSZ); + result = Curl_pp_sendf(&conn->proto.ftpc.pp, "PBSZ %d", 0); + if(!result) + state(conn, FTP_PBSZ); } else { result = ftp_state_pwd(conn); @@ -2542,8 +2547,9 @@ static CURLcode ftp_state_user_resp(struct connectdata *conn, if((ftpcode == 331) && (ftpc->state == FTP_USER)) { /* 331 Password required for ... (the server requires to send the user's password too) */ - PPSENDF(&ftpc->pp, "PASS %s", conn->passwd?conn->passwd:""); - state(conn, FTP_PASS); + result = Curl_pp_sendf(&ftpc->pp, "PASS %s", conn->passwd?conn->passwd:""); + if(!result) + state(conn, FTP_PASS); } else if(ftpcode/100 == 2) { /* 230 User ... logged in. @@ -2552,8 +2558,10 @@ static CURLcode ftp_state_user_resp(struct connectdata *conn, } else if(ftpcode == 332) { if(data->set.str[STRING_FTP_ACCOUNT]) { - PPSENDF(&ftpc->pp, "ACCT %s", data->set.str[STRING_FTP_ACCOUNT]); - state(conn, FTP_ACCT); + result = Curl_pp_sendf(&ftpc->pp, "ACCT %s", + data->set.str[STRING_FTP_ACCOUNT]); + if(!result) + state(conn, FTP_ACCT); } else { failf(data, "ACCT requested but none available"); @@ -2569,11 +2577,13 @@ static CURLcode ftp_state_user_resp(struct connectdata *conn, if(conn->data->set.str[STRING_FTP_ALTERNATIVE_TO_USER] && !conn->data->state.ftp_trying_alternative) { /* Ok, USER failed. Let's try the supplied command. */ - PPSENDF(&conn->proto.ftpc.pp, "%s", - conn->data->set.str[STRING_FTP_ALTERNATIVE_TO_USER]); - conn->data->state.ftp_trying_alternative = TRUE; - state(conn, FTP_USER); - result = CURLE_OK; + result = + Curl_pp_sendf(&ftpc->pp, "%s", + conn->data->set.str[STRING_FTP_ALTERNATIVE_TO_USER]); + if(!result) { + conn->data->state.ftp_trying_alternative = TRUE; + state(conn, FTP_USER); + } } else { failf(data, "Access denied: %03d", ftpcode); @@ -2649,14 +2659,8 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) } #endif - if(data->set.use_ssl && - (!conn->ssl[FIRSTSOCKET].use -#ifndef CURL_DISABLE_PROXY - || (conn->bits.proxy_ssl_connected[FIRSTSOCKET] && - !conn->proxy_ssl[FIRSTSOCKET].use) -#endif - )) { - /* We don't have a SSL/TLS connection yet, but FTPS is + if(data->set.use_ssl && !conn->bits.ftp_use_control_ssl) { + /* We don't have a SSL/TLS control connection yet, but FTPS is requested. Try a FTPS connection now */ ftpc->count3 = 0; @@ -2675,15 +2679,12 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) (int)data->set.ftpsslauth); return CURLE_UNKNOWN_OPTION; /* we don't know what to do */ } - PPSENDF(&ftpc->pp, "AUTH %s", ftpauth[ftpc->count1]); - state(conn, FTP_AUTH); + result = Curl_pp_sendf(&ftpc->pp, "AUTH %s", ftpauth[ftpc->count1]); + if(!result) + state(conn, FTP_AUTH); } - else { + else result = ftp_state_user(conn); - if(result) - return result; - } - break; case FTP_AUTH: @@ -2701,6 +2702,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) result = Curl_ssl_connect(conn, FIRSTSOCKET); if(!result) { conn->bits.ftp_use_data_ssl = FALSE; /* clear-text data */ + conn->bits.ftp_use_control_ssl = TRUE; /* SSL on control */ result = ftp_state_user(conn); } } @@ -2718,9 +2720,6 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) /* ignore the failure and continue */ result = ftp_state_user(conn); } - - if(result) - return result; break; case FTP_USER: @@ -2733,10 +2732,11 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) break; case FTP_PBSZ: - PPSENDF(&ftpc->pp, "PROT %c", - data->set.use_ssl == CURLUSESSL_CONTROL ? 'C' : 'P'); - state(conn, FTP_PROT); - + result = + Curl_pp_sendf(&ftpc->pp, "PROT %c", + data->set.use_ssl == CURLUSESSL_CONTROL ? 'C' : 'P'); + if(!result) + state(conn, FTP_PROT); break; case FTP_PROT: @@ -2753,14 +2753,12 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) if(data->set.ftp_ccc) { /* CCC - Clear Command Channel */ - PPSENDF(&ftpc->pp, "%s", "CCC"); - state(conn, FTP_CCC); + result = Curl_pp_sendf(&ftpc->pp, "%s", "CCC"); + if(!result) + state(conn, FTP_CCC); } - else { + else result = ftp_state_pwd(conn); - if(result) - return result; - } break; case FTP_CCC: @@ -2768,16 +2766,12 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) /* First shut down the SSL layer (note: this call will block) */ result = Curl_ssl_shutdown(conn, FIRSTSOCKET); - if(result) { + if(result) failf(conn->data, "Failed to clear the command channel (CCC)"); - return result; - } } - - /* Then continue as normal */ - result = ftp_state_pwd(conn); - if(result) - return result; + if(!result) + /* Then continue as normal */ + result = ftp_state_pwd(conn); break; case FTP_PWD: @@ -2843,7 +2837,6 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) systems. */ if(!ftpc->server_os && dir[0] != '/') { - result = Curl_pp_sendf(&ftpc->pp, "%s", "SYST"); if(result) { free(dir); @@ -2939,12 +2932,10 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) if((ftpcode >= 400) && !ftpc->count2) { /* failure response code, and not allowed to fail */ failf(conn->data, "QUOT command failed with %03d", ftpcode); - return CURLE_QUOTE_ERROR; + result = CURLE_QUOTE_ERROR; } - result = ftp_state_quote(conn, FALSE, ftpc->state); - if(result) - return result; - + else + result = ftp_state_quote(conn, FALSE, ftpc->state); break; case FTP_CWD: @@ -2954,29 +2945,28 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) ftpc->cwdcount && !ftpc->count2) { /* try making it */ ftpc->count2++; /* counter to prevent CWD-MKD loops */ - PPSENDF(&ftpc->pp, "MKD %s", ftpc->dirs[ftpc->cwdcount - 1]); - state(conn, FTP_MKD); + result = Curl_pp_sendf(&ftpc->pp, "MKD %s", + ftpc->dirs[ftpc->cwdcount - 1]); + if(!result) + state(conn, FTP_MKD); } else { /* return failure */ failf(data, "Server denied you to change to the given directory"); ftpc->cwdfail = TRUE; /* don't remember this path as we failed to enter it */ - return CURLE_REMOTE_ACCESS_DENIED; + result = CURLE_REMOTE_ACCESS_DENIED; } } else { /* success */ ftpc->count2 = 0; - if(++ftpc->cwdcount <= ftpc->dirdepth) { + if(++ftpc->cwdcount <= ftpc->dirdepth) /* send next CWD */ - PPSENDF(&ftpc->pp, "CWD %s", ftpc->dirs[ftpc->cwdcount - 1]); - } - else { + result = Curl_pp_sendf(&ftpc->pp, "CWD %s", + ftpc->dirs[ftpc->cwdcount - 1]); + else result = ftp_state_mdtm(conn); - if(result) - return result; - } } break; @@ -2984,11 +2974,14 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) if((ftpcode/100 != 2) && !ftpc->count3--) { /* failure to MKD the dir */ failf(data, "Failed to MKD dir: %03d", ftpcode); - return CURLE_REMOTE_ACCESS_DENIED; + result = CURLE_REMOTE_ACCESS_DENIED; + } + else { + state(conn, FTP_CWD); + /* send CWD */ + result = Curl_pp_sendf(&ftpc->pp, "CWD %s", + ftpc->dirs[ftpc->cwdcount - 1]); } - state(conn, FTP_CWD); - /* send CWD */ - PPSENDF(&ftpc->pp, "CWD %s", ftpc->dirs[ftpc->cwdcount - 1]); break; case FTP_MDTM: @@ -3091,7 +3084,7 @@ static CURLcode ftp_block_statemach(struct connectdata *conn) * */ static CURLcode ftp_connect(struct connectdata *conn, - bool *done) /* see description above */ + bool *done) /* see description above */ { CURLcode result; struct ftp_conn *ftpc = &conn->proto.ftpc; @@ -3112,8 +3105,10 @@ static CURLcode ftp_connect(struct connectdata *conn, result = Curl_ssl_connect(conn, FIRSTSOCKET); if(result) return result; + conn->bits.ftp_use_control_ssl = TRUE; } + Curl_pp_setup(pp); /* once per transfer */ Curl_pp_init(pp); /* init the generic pingpong data */ /* When we connect, we start in the state where we await the 220 @@ -3297,9 +3292,18 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status, if(!ftpc->dont_check) { /* 226 Transfer complete, 250 Requested file action okay, completed. */ - if((ftpcode != 226) && (ftpcode != 250)) { + switch(ftpcode) { + case 226: + case 250: + break; + case 552: + failf(data, "Exceeded storage allocation"); + result = CURLE_REMOTE_DISK_FULL; + break; + default: failf(data, "server did not report OK, got %d", ftpcode); result = CURLE_PARTIAL_FILE; + break; } } } @@ -3368,17 +3372,17 @@ static CURLcode ftp_sendquote(struct connectdata *conn, struct curl_slist *quote) { struct curl_slist *item; - ssize_t nread; - int ftpcode; - CURLcode result; struct ftp_conn *ftpc = &conn->proto.ftpc; struct pingpong *pp = &ftpc->pp; item = quote; while(item) { if(item->data) { + ssize_t nread; char *cmd = item->data; bool acceptfail = FALSE; + CURLcode result; + int ftpcode = 0; /* if a command starts with an asterisk, which a legal FTP command never can, the command will be allowed to fail without it causing any @@ -3390,11 +3394,11 @@ CURLcode ftp_sendquote(struct connectdata *conn, struct curl_slist *quote) acceptfail = TRUE; } - PPSENDF(&conn->proto.ftpc.pp, "%s", cmd); - - pp->response = Curl_now(); /* timeout relative now */ - - result = Curl_GetFTPResponse(&nread, conn, &ftpcode); + result = Curl_pp_sendf(&ftpc->pp, "%s", cmd); + if(!result) { + pp->response = Curl_now(); /* timeout relative now */ + result = Curl_GetFTPResponse(&nread, conn, &ftpcode); + } if(result) return result; @@ -3442,12 +3446,14 @@ static CURLcode ftp_nb_type(struct connectdata *conn, return ftp_state_type_resp(conn, 200, newstate); } - PPSENDF(&ftpc->pp, "TYPE %c", want); - state(conn, newstate); + result = Curl_pp_sendf(&ftpc->pp, "TYPE %c", want); + if(!result) { + state(conn, newstate); - /* keep track of our current transfer type */ - ftpc->transfertype = want; - return CURLE_OK; + /* keep track of our current transfer type */ + ftpc->transfertype = want; + } + return result; } /*************************************************************************** @@ -3947,64 +3953,6 @@ static CURLcode ftp_do(struct connectdata *conn, bool *done) return result; } - -CURLcode Curl_ftpsend(struct connectdata *conn, const char *cmd) -{ - ssize_t bytes_written; -#define SBUF_SIZE 1024 - char s[SBUF_SIZE]; - size_t write_len; - char *sptr = s; - CURLcode result = CURLE_OK; -#ifdef HAVE_GSSAPI - enum protection_level data_sec = conn->data_prot; -#endif - - if(!cmd) - return CURLE_BAD_FUNCTION_ARGUMENT; - - write_len = strlen(cmd); - if(!write_len || write_len > (sizeof(s) -3)) - return CURLE_BAD_FUNCTION_ARGUMENT; - - memcpy(&s, cmd, write_len); - strcpy(&s[write_len], "\r\n"); /* append a trailing CRLF */ - write_len += 2; - bytes_written = 0; - - result = Curl_convert_to_network(conn->data, s, write_len); - /* Curl_convert_to_network calls failf if unsuccessful */ - if(result) - return result; - - for(;;) { -#ifdef HAVE_GSSAPI - conn->data_prot = PROT_CMD; -#endif - result = Curl_write(conn, conn->sock[FIRSTSOCKET], sptr, write_len, - &bytes_written); -#ifdef HAVE_GSSAPI - DEBUGASSERT(data_sec > PROT_NONE && data_sec < PROT_LAST); - conn->data_prot = data_sec; -#endif - - if(result) - break; - - if(conn->data->set.verbose) - Curl_debug(conn->data, CURLINFO_HEADER_OUT, sptr, (size_t)bytes_written); - - if(bytes_written != (ssize_t)write_len) { - write_len -= bytes_written; - sptr += bytes_written; - } - else - break; - } - - return result; -} - /*********************************************************************** * * ftp_quit() @@ -4068,22 +4016,14 @@ static CURLcode ftp_disconnect(struct connectdata *conn, bool dead_connection) if(data->state.most_recent_ftp_entrypath == ftpc->entrypath) { data->state.most_recent_ftp_entrypath = NULL; } - free(ftpc->entrypath); - ftpc->entrypath = NULL; + Curl_safefree(ftpc->entrypath); } freedirs(ftpc); - free(ftpc->prevpath); - ftpc->prevpath = NULL; - free(ftpc->server_os); - ftpc->server_os = NULL; - + Curl_safefree(ftpc->prevpath); + Curl_safefree(ftpc->server_os); Curl_pp_disconnect(pp); - -#ifdef HAVE_GSSAPI Curl_sec_end(conn); -#endif - return CURLE_OK; } diff --git a/libs/libcurl/src/ftp.h b/libs/libcurl/src/ftp.h index 06421c6a40..dbbdeb7cc9 100644 --- a/libs/libcurl/src/ftp.h +++ b/libs/libcurl/src/ftp.h @@ -31,7 +31,6 @@ extern const struct Curl_handler Curl_handler_ftp; extern const struct Curl_handler Curl_handler_ftps; #endif -CURLcode Curl_ftpsend(struct connectdata *, const char *cmd); CURLcode Curl_GetFTPResponse(ssize_t *nread, struct connectdata *conn, int *ftpcode); #endif /* CURL_DISABLE_FTP */ diff --git a/libs/libcurl/src/ftplistparser.c b/libs/libcurl/src/ftplistparser.c index f399a4c272..c7b84a9ffd 100644 --- a/libs/libcurl/src/ftplistparser.c +++ b/libs/libcurl/src/ftplistparser.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2019, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2020, 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 @@ -274,7 +274,7 @@ static CURLcode ftp_pl_insert_finfo(struct connectdata *conn, curl_fnmatch_callback compare; struct WildcardData *wc = &conn->data->wildcard; struct ftp_wc *ftpwc = wc->protdata; - struct curl_llist *llist = &wc->filelist; + struct Curl_llist *llist = &wc->filelist; struct ftp_parselist_data *parser = ftpwc->parser; bool add = TRUE; struct curl_fileinfo *finfo = &infop->info; @@ -418,8 +418,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb, finfo->b_data[parser->item_length - 1] = 0; if(strncmp("total ", finfo->b_data, 6) == 0) { char *endptr = finfo->b_data + 6; - /* here we can deal with directory size, pass the leading white - spaces and then the digits */ + /* here we can deal with directory size, pass the leading + whitespace and then the digits */ while(ISSPACE(*endptr)) endptr++; while(ISDIGIT(*endptr)) diff --git a/libs/libcurl/src/getinfo.c b/libs/libcurl/src/getinfo.c index 82691dcc71..49e79e476f 100644 --- a/libs/libcurl/src/getinfo.c +++ b/libs/libcurl/src/getinfo.c @@ -269,6 +269,9 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info, /* Return the local port of the most recent (primary) connection */ *param_longp = data->info.conn_local_port; break; + case CURLINFO_PROXY_ERROR: + *param_longp = (long)data->info.pxcode; + break; case CURLINFO_CONDITION_UNMET: if(data->info.httpcode == 304) *param_longp = 1L; diff --git a/libs/libcurl/src/gopher.c b/libs/libcurl/src/gopher.c index b4811b2894..ce7413133f 100644 --- a/libs/libcurl/src/gopher.c +++ b/libs/libcurl/src/gopher.c @@ -71,6 +71,7 @@ const struct Curl_handler Curl_handler_gopher = { ZERO_NULL, /* connection_check */ PORT_GOPHER, /* defport */ CURLPROTO_GOPHER, /* protocol */ + CURLPROTO_GOPHER, /* family */ PROTOPT_NONE /* flags */ }; @@ -170,9 +171,7 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done) free(sel_org); if(!result) - /* We can use Curl_sendf to send the terminal \r\n relatively safely and - save allocing another string/doing another _write loop. */ - result = Curl_sendf(sockfd, conn, "\r\n"); + result = Curl_write(conn, sockfd, "\r\n", 2, &amount); if(result) { failf(data, "Failed sending Gopher request"); return result; diff --git a/libs/libcurl/src/hash.c b/libs/libcurl/src/hash.c index 421d68f769..8c1f6cd0a6 100644 --- a/libs/libcurl/src/hash.c +++ b/libs/libcurl/src/hash.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2018, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2020, 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,8 +34,8 @@ static void hash_element_dtor(void *user, void *element) { - struct curl_hash *h = (struct curl_hash *) user; - struct curl_hash_element *e = (struct curl_hash_element *) element; + struct Curl_hash *h = (struct Curl_hash *) user; + struct Curl_hash_element *e = (struct Curl_hash_element *) element; if(e->ptr) { h->dtor(e->ptr); @@ -54,11 +54,11 @@ hash_element_dtor(void *user, void *element) * @unittest: 1603 */ int -Curl_hash_init(struct curl_hash *h, +Curl_hash_init(struct Curl_hash *h, int slots, hash_function hfunc, comp_function comparator, - curl_hash_dtor dtor) + Curl_hash_dtor dtor) { if(!slots || !hfunc || !comparator ||!dtor) { return 1; /* failure */ @@ -70,22 +70,22 @@ Curl_hash_init(struct curl_hash *h, h->size = 0; h->slots = slots; - h->table = malloc(slots * sizeof(struct curl_llist)); + h->table = malloc(slots * sizeof(struct Curl_llist)); if(h->table) { int i; for(i = 0; i < slots; ++i) - Curl_llist_init(&h->table[i], (curl_llist_dtor) hash_element_dtor); + Curl_llist_init(&h->table[i], (Curl_llist_dtor) hash_element_dtor); return 0; /* fine */ } h->slots = 0; return 1; /* failure */ } -static struct curl_hash_element * +static struct Curl_hash_element * mk_hash_element(const void *key, size_t key_len, const void *p) { /* allocate the struct plus memory after it to store the key */ - struct curl_hash_element *he = malloc(sizeof(struct curl_hash_element) + + struct Curl_hash_element *he = malloc(sizeof(struct Curl_hash_element) + key_len); if(he) { /* copy the key */ @@ -106,14 +106,14 @@ mk_hash_element(const void *key, size_t key_len, const void *p) * @unittest: 1603 */ void * -Curl_hash_add(struct curl_hash *h, void *key, size_t key_len, void *p) +Curl_hash_add(struct Curl_hash *h, void *key, size_t key_len, void *p) { - struct curl_hash_element *he; - struct curl_llist_element *le; - struct curl_llist *l = FETCH_LIST(h, key, key_len); + struct Curl_hash_element *he; + struct Curl_llist_element *le; + struct Curl_llist *l = FETCH_LIST(h, key, key_len); for(le = l->head; le; le = le->next) { - he = (struct curl_hash_element *) le->ptr; + he = (struct Curl_hash_element *) le->ptr; if(h->comp_func(he->key, he->key_len, key, key_len)) { Curl_llist_remove(l, le, (void *)h); --h->size; @@ -136,13 +136,13 @@ Curl_hash_add(struct curl_hash *h, void *key, size_t key_len, void *p) * * @unittest: 1603 */ -int Curl_hash_delete(struct curl_hash *h, void *key, size_t key_len) +int Curl_hash_delete(struct Curl_hash *h, void *key, size_t key_len) { - struct curl_llist_element *le; - struct curl_llist *l = FETCH_LIST(h, key, key_len); + struct Curl_llist_element *le; + struct Curl_llist *l = FETCH_LIST(h, key, key_len); for(le = l->head; le; le = le->next) { - struct curl_hash_element *he = le->ptr; + struct Curl_hash_element *he = le->ptr; if(h->comp_func(he->key, he->key_len, key, key_len)) { Curl_llist_remove(l, le, (void *) h); --h->size; @@ -157,15 +157,15 @@ int Curl_hash_delete(struct curl_hash *h, void *key, size_t key_len) * @unittest: 1603 */ void * -Curl_hash_pick(struct curl_hash *h, void *key, size_t key_len) +Curl_hash_pick(struct Curl_hash *h, void *key, size_t key_len) { - struct curl_llist_element *le; - struct curl_llist *l; + struct Curl_llist_element *le; + struct Curl_llist *l; if(h) { l = FETCH_LIST(h, key, key_len); for(le = l->head; le; le = le->next) { - struct curl_hash_element *he = le->ptr; + struct Curl_hash_element *he = le->ptr; if(h->comp_func(he->key, he->key_len, key, key_len)) { return he->ptr; } @@ -177,17 +177,17 @@ Curl_hash_pick(struct curl_hash *h, void *key, size_t key_len) #if defined(DEBUGBUILD) && defined(AGGRESIVE_TEST) void -Curl_hash_apply(curl_hash *h, void *user, +Curl_hash_apply(Curl_hash *h, void *user, void (*cb)(void *user, void *ptr)) { - struct curl_llist_element *le; + struct Curl_llist_element *le; int i; for(i = 0; i < h->slots; ++i) { for(le = (h->table[i])->head; le; le = le->next) { - curl_hash_element *el = le->ptr; + Curl_hash_element *el = le->ptr; cb(user, el->ptr); } } @@ -202,7 +202,7 @@ Curl_hash_apply(curl_hash *h, void *user, * @unittest: 1603 */ void -Curl_hash_destroy(struct curl_hash *h) +Curl_hash_destroy(struct Curl_hash *h) { int i; @@ -220,19 +220,19 @@ Curl_hash_destroy(struct curl_hash *h) * @unittest: 1602 */ void -Curl_hash_clean(struct curl_hash *h) +Curl_hash_clean(struct Curl_hash *h) { Curl_hash_clean_with_criterium(h, NULL, NULL); } /* Cleans all entries that pass the comp function criteria. */ void -Curl_hash_clean_with_criterium(struct curl_hash *h, void *user, +Curl_hash_clean_with_criterium(struct Curl_hash *h, void *user, int (*comp)(void *, void *)) { - struct curl_llist_element *le; - struct curl_llist_element *lnext; - struct curl_llist *list; + struct Curl_llist_element *le; + struct Curl_llist_element *lnext; + struct Curl_llist *list; int i; if(!h) @@ -242,7 +242,7 @@ Curl_hash_clean_with_criterium(struct curl_hash *h, void *user, list = &h->table[i]; le = list->head; /* get first list entry */ while(le) { - struct curl_hash_element *he = le->ptr; + struct Curl_hash_element *he = le->ptr; lnext = le->next; /* ask the callback function if we shall remove this entry or not */ if(comp == NULL || comp(user, he->ptr)) { @@ -277,18 +277,18 @@ size_t Curl_str_key_compare(void *k1, size_t key1_len, return 0; } -void Curl_hash_start_iterate(struct curl_hash *hash, - struct curl_hash_iterator *iter) +void Curl_hash_start_iterate(struct Curl_hash *hash, + struct Curl_hash_iterator *iter) { iter->hash = hash; iter->slot_index = 0; iter->current_element = NULL; } -struct curl_hash_element * -Curl_hash_next_element(struct curl_hash_iterator *iter) +struct Curl_hash_element * +Curl_hash_next_element(struct Curl_hash_iterator *iter) { - struct curl_hash *h = iter->hash; + struct Curl_hash *h = iter->hash; /* Get the next element in the current list, if any */ if(iter->current_element) @@ -307,7 +307,7 @@ Curl_hash_next_element(struct curl_hash_iterator *iter) } if(iter->current_element) { - struct curl_hash_element *he = iter->current_element->ptr; + struct Curl_hash_element *he = iter->current_element->ptr; return he; } iter->current_element = NULL; @@ -315,11 +315,11 @@ Curl_hash_next_element(struct curl_hash_iterator *iter) } #if 0 /* useful function for debugging hashes and their contents */ -void Curl_hash_print(struct curl_hash *h, +void Curl_hash_print(struct Curl_hash *h, void (*func)(void *)) { - struct curl_hash_iterator iter; - struct curl_hash_element *he; + struct Curl_hash_iterator iter; + struct Curl_hash_element *he; int last_index = -1; if(!h) diff --git a/libs/libcurl/src/hash.h b/libs/libcurl/src/hash.h index 558d0f47ca..eb5104b85b 100644 --- a/libs/libcurl/src/hash.h +++ b/libs/libcurl/src/hash.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2019, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2020, 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 @@ -41,59 +41,59 @@ typedef size_t (*comp_function) (void *key1, void *key2, size_t key2_len); -typedef void (*curl_hash_dtor)(void *); +typedef void (*Curl_hash_dtor)(void *); -struct curl_hash { - struct curl_llist *table; +struct Curl_hash { + struct Curl_llist *table; /* Hash function to be used for this hash table */ hash_function hash_func; /* Comparator function to compare keys */ comp_function comp_func; - curl_hash_dtor dtor; + Curl_hash_dtor dtor; int slots; size_t size; }; -struct curl_hash_element { - struct curl_llist_element list; +struct Curl_hash_element { + struct Curl_llist_element list; void *ptr; size_t key_len; char key[1]; /* allocated memory following the struct */ }; -struct curl_hash_iterator { - struct curl_hash *hash; +struct Curl_hash_iterator { + struct Curl_hash *hash; int slot_index; - struct curl_llist_element *current_element; + struct Curl_llist_element *current_element; }; -int Curl_hash_init(struct curl_hash *h, +int Curl_hash_init(struct Curl_hash *h, int slots, hash_function hfunc, comp_function comparator, - curl_hash_dtor dtor); + Curl_hash_dtor dtor); -void *Curl_hash_add(struct curl_hash *h, void *key, size_t key_len, void *p); -int Curl_hash_delete(struct curl_hash *h, void *key, size_t key_len); -void *Curl_hash_pick(struct curl_hash *, void *key, size_t key_len); -void Curl_hash_apply(struct curl_hash *h, void *user, +void *Curl_hash_add(struct Curl_hash *h, void *key, size_t key_len, void *p); +int Curl_hash_delete(struct Curl_hash *h, void *key, size_t key_len); +void *Curl_hash_pick(struct Curl_hash *, void *key, size_t key_len); +void Curl_hash_apply(struct Curl_hash *h, void *user, void (*cb)(void *user, void *ptr)); #define Curl_hash_count(h) ((h)->size) -void Curl_hash_destroy(struct curl_hash *h); -void Curl_hash_clean(struct curl_hash *h); -void Curl_hash_clean_with_criterium(struct curl_hash *h, void *user, +void Curl_hash_destroy(struct Curl_hash *h); +void Curl_hash_clean(struct Curl_hash *h); +void Curl_hash_clean_with_criterium(struct Curl_hash *h, void *user, int (*comp)(void *, void *)); size_t Curl_hash_str(void *key, size_t key_length, size_t slots_num); size_t Curl_str_key_compare(void *k1, size_t key1_len, void *k2, size_t key2_len); -void Curl_hash_start_iterate(struct curl_hash *hash, - struct curl_hash_iterator *iter); -struct curl_hash_element * -Curl_hash_next_element(struct curl_hash_iterator *iter); +void Curl_hash_start_iterate(struct Curl_hash *hash, + struct Curl_hash_iterator *iter); +struct Curl_hash_element * +Curl_hash_next_element(struct Curl_hash_iterator *iter); -void Curl_hash_print(struct curl_hash *h, +void Curl_hash_print(struct Curl_hash *h, void (*func)(void *)); diff --git a/libs/libcurl/src/hostip.c b/libs/libcurl/src/hostip.c index dd5916e338..57c8bd3d84 100644 --- a/libs/libcurl/src/hostip.c +++ b/libs/libcurl/src/hostip.c @@ -206,7 +206,7 @@ hostcache_timestamp_remove(void *datap, void *hc) * Prune the DNS cache. This assumes that a lock has already been taken. */ static void -hostcache_prune(struct curl_hash *hostcache, long cache_timeout, time_t now) +hostcache_prune(struct Curl_hash *hostcache, long cache_timeout, time_t now) { struct hostcache_prune_data user; @@ -843,7 +843,7 @@ static void freednsentry(void *freethis) /* * Curl_mk_dnscache() inits a new DNS cache and returns success/failure. */ -int Curl_mk_dnscache(struct curl_hash *hash) +int Curl_mk_dnscache(struct Curl_hash *hash) { return Curl_hash_init(hash, 7, Curl_hash_str, Curl_str_key_compare, freednsentry); @@ -857,7 +857,7 @@ int Curl_mk_dnscache(struct curl_hash *hash) */ void Curl_hostcache_clean(struct Curl_easy *data, - struct curl_hash *hash) + struct Curl_hash *hash) { if(data && data->share) Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE); diff --git a/libs/libcurl/src/hostip.h b/libs/libcurl/src/hostip.h index 374b06c855..fb782d5638 100644 --- a/libs/libcurl/src/hostip.h +++ b/libs/libcurl/src/hostip.h @@ -59,9 +59,9 @@ struct connectdata; * Global DNS cache is general badness. Do not use. This will be removed in * a future version. Use the share interface instead! * - * Returns a struct curl_hash pointer on success, NULL on failure. + * Returns a struct Curl_hash pointer on success, NULL on failure. */ -struct curl_hash *Curl_global_host_cache_init(void); +struct Curl_hash *Curl_global_host_cache_init(void); struct Curl_dns_entry { struct Curl_addrinfo *addr; @@ -128,7 +128,7 @@ void Curl_resolv_unlock(struct Curl_easy *data, struct Curl_dns_entry *dns); /* init a new dns cache and return success */ -int Curl_mk_dnscache(struct curl_hash *hash); +int Curl_mk_dnscache(struct Curl_hash *hash); /* prune old entries from the DNS cache */ void Curl_hostcache_prune(struct Curl_easy *data); @@ -234,7 +234,7 @@ CURLcode Curl_set_dns_local_ip6(struct Curl_easy *data, /* * Clean off entries from the cache */ -void Curl_hostcache_clean(struct Curl_easy *data, struct curl_hash *hash); +void Curl_hostcache_clean(struct Curl_easy *data, struct Curl_hash *hash); /* * Populate the cache with specified entries from CURLOPT_RESOLVE. diff --git a/libs/libcurl/src/http.c b/libs/libcurl/src/http.c index 8fcdd436d7..e0be17d9ba 100644 --- a/libs/libcurl/src/http.c +++ b/libs/libcurl/src/http.c @@ -125,6 +125,7 @@ const struct Curl_handler Curl_handler_http = { ZERO_NULL, /* connection_check */ PORT_HTTP, /* defport */ CURLPROTO_HTTP, /* protocol */ + CURLPROTO_HTTP, /* family */ PROTOPT_CREDSPERREQUEST | /* flags */ PROTOPT_USERPWDCTRL }; @@ -151,6 +152,7 @@ const struct Curl_handler Curl_handler_https = { ZERO_NULL, /* connection_check */ PORT_HTTPS, /* defport */ CURLPROTO_HTTPS, /* protocol */ + CURLPROTO_HTTP, /* family */ PROTOPT_SSL | PROTOPT_CREDSPERREQUEST | PROTOPT_ALPN_NPN | /* flags */ PROTOPT_USERPWDCTRL }; @@ -1353,7 +1355,7 @@ Curl_compareheader(const char *headerline, /* line to check */ /* pass the header */ start = &headerline[hlen]; - /* pass all white spaces */ + /* pass all whitespace */ while(*start && ISSPACE(*start)) start++; diff --git a/libs/libcurl/src/http2.c b/libs/libcurl/src/http2.c index d316da8b6a..925d9828b2 100644 --- a/libs/libcurl/src/http2.c +++ b/libs/libcurl/src/http2.c @@ -300,6 +300,7 @@ static const struct Curl_handler Curl_handler_http2 = { http2_conncheck, /* connection_check */ PORT_HTTP, /* defport */ CURLPROTO_HTTP, /* protocol */ + CURLPROTO_HTTP, /* family */ PROTOPT_STREAM /* flags */ }; @@ -321,6 +322,7 @@ static const struct Curl_handler Curl_handler_http2_ssl = { http2_conncheck, /* connection_check */ PORT_HTTP, /* defport */ CURLPROTO_HTTPS, /* protocol */ + CURLPROTO_HTTP, /* family */ PROTOPT_SSL | PROTOPT_STREAM /* flags */ }; @@ -1207,13 +1209,6 @@ void Curl_http2_done(struct Curl_easy *data, bool premature) } http->stream_id = 0; } - - if(0 == nghttp2_session_check_request_allowed(httpc->h2)) { - /* No more requests are allowed in the current session, so the connection - may not be reused. This is set when a GOAWAY frame has been received or - when the limit of stream identifiers has been reached. */ - connclose(data->conn, "http/2: No new requests allowed"); - } } /* @@ -1288,7 +1283,7 @@ CURLcode Curl_http2_request_upgrade(struct dynbuf *req, binlen = nghttp2_pack_settings_payload(binsettings, H2_BINSETTINGS_LEN, httpc->local_settings, httpc->local_settings_num); - if(!binlen) { + if(binlen <= 0) { failf(conn->data, "nghttp2 unexpectedly failed on pack_settings_payload"); Curl_dyn_free(req); return CURLE_FAILED_INIT; @@ -1371,6 +1366,14 @@ static int h2_process_pending_input(struct connectdata *conn, return -1; } + if(nghttp2_session_check_request_allowed(httpc->h2) == 0) { + /* No more requests are allowed in the current session, so + the connection may not be reused. This is set when a + GOAWAY frame has been received or when the limit of stream + identifiers has been reached. */ + connclose(conn, "http/2: No new requests allowed"); + } + if(should_close_session(httpc)) { H2BUGF(infof(data, "h2_process_pending_input: nothing to do in this session\n")); @@ -1383,7 +1386,6 @@ static int h2_process_pending_input(struct connectdata *conn, } return -1; } - return 0; } @@ -1564,8 +1566,6 @@ static int h2_session_send(struct Curl_easy *data, static ssize_t http2_recv(struct connectdata *conn, int sockindex, char *mem, size_t len, CURLcode *err) { - CURLcode result = CURLE_OK; - ssize_t rv; ssize_t nread; struct http_conn *httpc = &conn->proto.httpc; struct Curl_easy *data = conn->data; @@ -1632,8 +1632,7 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex, /* We have paused nghttp2, but we have no pause data (see on_data_chunk_recv). */ httpc->pause_stream_id = 0; - if(h2_process_pending_input(conn, httpc, &result) != 0) { - *err = result; + if(h2_process_pending_input(conn, httpc, err) != 0) { return -1; } } @@ -1661,8 +1660,7 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex, frames, then we have to call it again with 0-length data. Without this, on_stream_close callback will not be called, and stream could be hanged. */ - if(h2_process_pending_input(conn, httpc, &result) != 0) { - *err = result; + if(h2_process_pending_input(conn, httpc, err) != 0) { return -1; } } @@ -1688,7 +1686,6 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex, return -1; } else { - char *inbuf; /* remember where to store incoming data for this stream and how big the buffer is */ stream->mem = mem; @@ -1697,16 +1694,15 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex, if(httpc->inbuflen == 0) { nread = ((Curl_recv *)httpc->recv_underlying)( - conn, FIRSTSOCKET, httpc->inbuf, H2_BUFSIZE, &result); + conn, FIRSTSOCKET, httpc->inbuf, H2_BUFSIZE, err); if(nread == -1) { - if(result != CURLE_AGAIN) + if(*err != CURLE_AGAIN) failf(data, "Failed receiving HTTP2 data"); else if(stream->closed) /* received when the stream was already closed! */ return http2_handle_stream_close(conn, data, stream, err); - *err = result; return -1; } @@ -1719,47 +1715,18 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex, H2BUGF(infof(data, "nread=%zd\n", nread)); httpc->inbuflen = nread; - inbuf = httpc->inbuf; + + DEBUGASSERT(httpc->nread_inbuf == 0); } else { nread = httpc->inbuflen - httpc->nread_inbuf; - inbuf = httpc->inbuf + httpc->nread_inbuf; - + (void)nread; /* silence warning, used in debug */ H2BUGF(infof(data, "Use data left in connection buffer, nread=%zd\n", nread)); } - rv = nghttp2_session_mem_recv(httpc->h2, (const uint8_t *)inbuf, nread); - if(nghttp2_is_fatal((int)rv)) { - failf(data, "nghttp2_session_mem_recv() returned %zd:%s\n", - rv, nghttp2_strerror((int)rv)); - *err = CURLE_RECV_ERROR; - return -1; - } - H2BUGF(infof(data, "nghttp2_session_mem_recv() returns %zd\n", rv)); - if(nread == rv) { - H2BUGF(infof(data, "All data in connection buffer processed\n")); - httpc->inbuflen = 0; - httpc->nread_inbuf = 0; - } - else { - httpc->nread_inbuf += rv; - H2BUGF(infof(data, "%zu bytes left in connection buffer\n", - httpc->inbuflen - httpc->nread_inbuf)); - } - /* Always send pending frames in nghttp2 session, because - nghttp2_session_mem_recv() may queue new frame */ - rv = h2_session_send(data, httpc->h2); - if(rv != 0) { - *err = CURLE_SEND_ERROR; - return -1; - } - - if(should_close_session(httpc)) { - H2BUGF(infof(data, "http2_recv: nothing to do in this session\n")); - *err = CURLE_HTTP2; + if(h2_process_pending_input(conn, httpc, err) != 0) return -1; - } } if(stream->memlen) { ssize_t retlen = stream->memlen; @@ -2112,7 +2079,7 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex, h2_pri_spec(conn->data, &pri_spec); H2BUGF(infof(conn->data, "http2_send request allowed %d (easy handle %p)\n", - nghttp2_session_check_request_allowed(h2), (void *)conn->data)); + nghttp2_session_check_request_allowed(h2), (void *)conn->data)); switch(conn->data->state.httpreq) { case HTTPREQ_POST: @@ -2138,7 +2105,9 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex, Curl_safefree(nva); if(stream_id < 0) { - H2BUGF(infof(conn->data, "http2_send() send error\n")); + H2BUGF(infof(conn->data, + "http2_send() nghttp2_submit_request error (%s)%d\n", + nghttp2_strerror(stream_id), stream_id)); *err = CURLE_SEND_ERROR; return -1; } @@ -2148,10 +2117,13 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex, stream->stream_id = stream_id; /* this does not call h2_session_send() since there can not have been any - * priority upodate since the nghttp2_submit_request() call above */ + * priority update since the nghttp2_submit_request() call above */ rv = nghttp2_session_send(h2); - if(rv != 0) { + H2BUGF(infof(conn->data, + "http2_send() nghttp2_session_send error (%s)%d\n", + nghttp2_strerror(rv), rv)); + *err = CURLE_SEND_ERROR; return -1; } @@ -2236,7 +2208,6 @@ CURLcode Curl_http2_switched(struct connectdata *conn, CURLcode result; struct http_conn *httpc = &conn->proto.httpc; int rv; - ssize_t nproc; struct Curl_easy *data = conn->data; struct HTTP *stream = conn->data->req.protop; @@ -2310,41 +2281,13 @@ CURLcode Curl_http2_switched(struct connectdata *conn, if(nread) memcpy(httpc->inbuf, mem, nread); - httpc->inbuflen = nread; - - nproc = nghttp2_session_mem_recv(httpc->h2, (const uint8_t *)httpc->inbuf, - httpc->inbuflen); - - if(nghttp2_is_fatal((int)nproc)) { - failf(data, "nghttp2_session_mem_recv() failed: %s(%d)", - nghttp2_strerror((int)nproc), (int)nproc); - return CURLE_HTTP2; - } - - H2BUGF(infof(data, "nghttp2_session_mem_recv() returns %zd\n", nproc)); - - if((ssize_t)nread == nproc) { - httpc->inbuflen = 0; - httpc->nread_inbuf = 0; - } - else { - httpc->nread_inbuf += nproc; - } - /* Try to send some frames since we may read SETTINGS already. */ - rv = h2_session_send(data, httpc->h2); + httpc->inbuflen = nread; - if(rv != 0) { - failf(data, "nghttp2_session_send() failed: %s(%d)", - nghttp2_strerror(rv), rv); - return CURLE_HTTP2; - } + DEBUGASSERT(httpc->nread_inbuf == 0); - if(should_close_session(httpc)) { - H2BUGF(infof(data, - "nghttp2_session_send(): nothing to do in this session\n")); + if(-1 == h2_process_pending_input(conn, httpc, &result)) return CURLE_HTTP2; - } return CURLE_OK; } diff --git a/libs/libcurl/src/http_proxy.c b/libs/libcurl/src/http_proxy.c index f188cbfc60..7c34d20648 100644 --- a/libs/libcurl/src/http_proxy.c +++ b/libs/libcurl/src/http_proxy.c @@ -425,7 +425,6 @@ static CURLcode CONNECT(struct connectdata *conn, } data->info.header_size += (long)perline; - data->req.headerbytecount += (long)perline; /* Newlines are CRLF, so the CR is ignored as the line isn't really terminated until the LF comes. Treat a following CR diff --git a/libs/libcurl/src/imap.c b/libs/libcurl/src/imap.c index cad0e5908d..46367be103 100644 --- a/libs/libcurl/src/imap.c +++ b/libs/libcurl/src/imap.c @@ -132,6 +132,7 @@ const struct Curl_handler Curl_handler_imap = { ZERO_NULL, /* connection_check */ PORT_IMAP, /* defport */ CURLPROTO_IMAP, /* protocol */ + CURLPROTO_IMAP, /* family */ PROTOPT_CLOSEACTION| /* flags */ PROTOPT_URLOPTIONS }; @@ -159,6 +160,7 @@ const struct Curl_handler Curl_handler_imaps = { ZERO_NULL, /* connection_check */ PORT_IMAPS, /* defport */ CURLPROTO_IMAPS, /* protocol */ + CURLPROTO_IMAP, /* family */ PROTOPT_CLOSEACTION | PROTOPT_SSL | /* flags */ PROTOPT_URLOPTIONS }; @@ -1176,6 +1178,9 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode, else { /* IMAP download */ data->req.maxdownload = size; + /* force a recv/send check of this connection, as the data might've been + read off the socket already */ + data->conn->cselect_bits = CURL_CSELECT_IN; Curl_setup_transfer(data, FIRSTSOCKET, size, FALSE, -1); } } @@ -1424,7 +1429,9 @@ static CURLcode imap_connect(struct connectdata *conn, bool *done) imapc->preftype = IMAP_TYPE_ANY; Curl_sasl_init(&imapc->sasl, &saslimap); + Curl_dyn_init(&imapc->dyn, DYN_IMAP_CMD); /* Initialise the pingpong layer */ + Curl_pp_setup(pp); Curl_pp_init(pp); /* Parse the URL options */ @@ -1626,6 +1633,7 @@ static CURLcode imap_disconnect(struct connectdata *conn, bool dead_connection) /* Disconnect from the server */ Curl_pp_disconnect(&imapc->pp); + Curl_dyn_free(&imapc->dyn); /* Cleanup the SASL module */ Curl_sasl_cleanup(conn, imapc->sasl.authused); @@ -1727,30 +1735,25 @@ static CURLcode imap_sendf(struct connectdata *conn, const char *fmt, ...) { CURLcode result = CURLE_OK; struct imap_conn *imapc = &conn->proto.imapc; - char *taggedfmt; - va_list ap; DEBUGASSERT(fmt); - /* Calculate the next command ID wrapping at 3 digits */ - imapc->cmdid = (imapc->cmdid + 1) % 1000; - /* Calculate the tag based on the connection ID and command ID */ msnprintf(imapc->resptag, sizeof(imapc->resptag), "%c%03d", - 'A' + curlx_sltosi(conn->connection_id % 26), imapc->cmdid); - - /* Prefix the format with the tag */ - taggedfmt = aprintf("%s %s", imapc->resptag, fmt); - if(!taggedfmt) - return CURLE_OUT_OF_MEMORY; + 'A' + curlx_sltosi(conn->connection_id % 26), + (++imapc->cmdid)%1000); - /* Send the data with the tag */ - va_start(ap, fmt); - result = Curl_pp_vsendf(&imapc->pp, taggedfmt, ap); - va_end(ap); - - free(taggedfmt); + /* start with a blank buffer */ + Curl_dyn_reset(&imapc->dyn); + /* append tag + space + fmt */ + result = Curl_dyn_addf(&imapc->dyn, "%s %s", imapc->resptag, fmt); + if(!result) { + va_list ap; + va_start(ap, fmt); + result = Curl_pp_vsendf(&imapc->pp, Curl_dyn_ptr(&imapc->dyn), ap); + va_end(ap); + } return result; } diff --git a/libs/libcurl/src/imap.h b/libs/libcurl/src/imap.h index 4786f56241..8f373d2843 100644 --- a/libs/libcurl/src/imap.h +++ b/libs/libcurl/src/imap.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2009 - 2019, Daniel Stenberg, , et al. + * Copyright (C) 2009 - 2020, 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 @@ -75,13 +75,14 @@ struct imap_conn { bool preauth; /* Is this connection PREAUTH? */ struct SASL sasl; /* SASL-related parameters */ unsigned int preftype; /* Preferred authentication type */ - int cmdid; /* Last used command ID */ + unsigned int cmdid; /* Last used command ID */ char resptag[5]; /* Response tag to wait for */ bool tls_supported; /* StartTLS capability supported by server */ bool login_disabled; /* LOGIN command disabled by server */ bool ir_supported; /* Initial response supported by server */ char *mailbox; /* The last selected mailbox */ char *mailbox_uidvalidity; /* UIDVALIDITY parsed from select response */ + struct dynbuf dyn; /* for the IMAP commands */ }; extern const struct Curl_handler Curl_handler_imap; diff --git a/libs/libcurl/src/inet_pton.c b/libs/libcurl/src/inet_pton.c index 9c87a05620..4923cae245 100644 --- a/libs/libcurl/src/inet_pton.c +++ b/libs/libcurl/src/inet_pton.c @@ -1,6 +1,6 @@ /* This is from the BIND 4.9.4 release, modified to compile by itself */ -/* Copyright (c) 1996 - 2019 by Internet Software Consortium. +/* Copyright (c) 1996 - 2020 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -112,7 +112,7 @@ inet_pton4(const char *src, unsigned char *dst) if(val > 255) return (0); *tp = (unsigned char)val; - if(! saw_digit) { + if(!saw_digit) { if(++octets > 4) return (0); saw_digit = 1; diff --git a/libs/libcurl/src/krb5.c b/libs/libcurl/src/krb5.c index f50287aec6..ad6daeaa9e 100644 --- a/libs/libcurl/src/krb5.c +++ b/libs/libcurl/src/krb5.c @@ -2,7 +2,7 @@ * * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). - * Copyright (c) 2004 - 2019 Daniel Stenberg + * Copyright (c) 2004 - 2020 Daniel Stenberg * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -45,14 +45,74 @@ #include "ftp.h" #include "curl_gssapi.h" #include "sendf.h" -#include "curl_sec.h" +#include "curl_krb5.h" #include "warnless.h" +#include "non-ascii.h" +#include "strcase.h" +#include "strdup.h" /* The last 3 #include files should be in this order */ #include "curl_printf.h" #include "curl_memory.h" #include "memdebug.h" +static CURLcode ftpsend(struct connectdata *conn, const char *cmd) +{ + ssize_t bytes_written; +#define SBUF_SIZE 1024 + char s[SBUF_SIZE]; + size_t write_len; + char *sptr = s; + CURLcode result = CURLE_OK; +#ifdef HAVE_GSSAPI + enum protection_level data_sec = conn->data_prot; +#endif + + if(!cmd) + return CURLE_BAD_FUNCTION_ARGUMENT; + + write_len = strlen(cmd); + if(!write_len || write_len > (sizeof(s) -3)) + return CURLE_BAD_FUNCTION_ARGUMENT; + + memcpy(&s, cmd, write_len); + strcpy(&s[write_len], "\r\n"); /* append a trailing CRLF */ + write_len += 2; + bytes_written = 0; + + result = Curl_convert_to_network(conn->data, s, write_len); + /* Curl_convert_to_network calls failf if unsuccessful */ + if(result) + return result; + + for(;;) { +#ifdef HAVE_GSSAPI + conn->data_prot = PROT_CMD; +#endif + result = Curl_write(conn, conn->sock[FIRSTSOCKET], sptr, write_len, + &bytes_written); +#ifdef HAVE_GSSAPI + DEBUGASSERT(data_sec > PROT_NONE && data_sec < PROT_LAST); + conn->data_prot = data_sec; +#endif + + if(result) + break; + + if(conn->data->set.verbose) + Curl_debug(conn->data, CURLINFO_HEADER_OUT, sptr, (size_t)bytes_written); + + if(bytes_written != (ssize_t)write_len) { + write_len -= bytes_written; + sptr += bytes_written; + } + else + break; + } + + return result; +} + static int krb5_init(void *app_data) { @@ -183,7 +243,7 @@ krb5_auth(void *app_data, struct connectdata *conn) for(;;) { /* this really shouldn't be repeated here, but can't help it */ if(service == srv_host) { - result = Curl_ftpsend(conn, "AUTH GSSAPI"); + result = ftpsend(conn, "AUTH GSSAPI"); if(result) return -2; @@ -260,7 +320,7 @@ krb5_auth(void *app_data, struct connectdata *conn) cmd = aprintf("ADAT %s", p); if(cmd) - result = Curl_ftpsend(conn, cmd); + result = ftpsend(conn, cmd); else result = CURLE_OUT_OF_MEMORY; @@ -326,16 +386,524 @@ static void krb5_end(void *app_data) } } -struct Curl_sec_client_mech Curl_krb5_client_mech = { - "GSSAPI", - sizeof(gss_ctx_id_t), - krb5_init, - krb5_auth, - krb5_end, - krb5_check_prot, - krb5_overhead, - krb5_encode, - krb5_decode +static struct Curl_sec_client_mech Curl_krb5_client_mech = { + "GSSAPI", + sizeof(gss_ctx_id_t), + krb5_init, + krb5_auth, + krb5_end, + krb5_check_prot, + krb5_overhead, + krb5_encode, + krb5_decode +}; + +static const struct { + enum protection_level level; + const char *name; +} level_names[] = { + { PROT_CLEAR, "clear" }, + { PROT_SAFE, "safe" }, + { PROT_CONFIDENTIAL, "confidential" }, + { PROT_PRIVATE, "private" } }; +static enum protection_level +name_to_level(const char *name) +{ + int i; + for(i = 0; i < (int)sizeof(level_names)/(int)sizeof(level_names[0]); i++) + if(checkprefix(name, level_names[i].name)) + return level_names[i].level; + return PROT_NONE; +} + +/* Convert a protocol |level| to its char representation. + We take an int to catch programming mistakes. */ +static char level_to_char(int level) +{ + switch(level) { + case PROT_CLEAR: + return 'C'; + case PROT_SAFE: + return 'S'; + case PROT_CONFIDENTIAL: + return 'E'; + case PROT_PRIVATE: + return 'P'; + case PROT_CMD: + /* Fall through */ + default: + /* Those 2 cases should not be reached! */ + break; + } + DEBUGASSERT(0); + /* Default to the most secure alternative. */ + return 'P'; +} + +/* Send an FTP command defined by |message| and the optional arguments. The + function returns the ftp_code. If an error occurs, -1 is returned. */ +static int ftp_send_command(struct connectdata *conn, const char *message, ...) +{ + int ftp_code; + ssize_t nread = 0; + va_list args; + char print_buffer[50]; + + va_start(args, message); + mvsnprintf(print_buffer, sizeof(print_buffer), message, args); + va_end(args); + + if(ftpsend(conn, print_buffer)) { + ftp_code = -1; + } + else { + if(Curl_GetFTPResponse(&nread, conn, &ftp_code)) + ftp_code = -1; + } + + (void)nread; /* Unused */ + return ftp_code; +} + +/* Read |len| from the socket |fd| and store it in |to|. Return a CURLcode + saying whether an error occurred or CURLE_OK if |len| was read. */ +static CURLcode +socket_read(curl_socket_t fd, void *to, size_t len) +{ + char *to_p = to; + CURLcode result; + ssize_t nread = 0; + + while(len > 0) { + result = Curl_read_plain(fd, to_p, len, &nread); + if(!result) { + len -= nread; + to_p += nread; + } + else { + if(result == CURLE_AGAIN) + continue; + return result; + } + } + return CURLE_OK; +} + + +/* Write |len| bytes from the buffer |to| to the socket |fd|. Return a + CURLcode saying whether an error occurred or CURLE_OK if |len| was + written. */ +static CURLcode +socket_write(struct connectdata *conn, curl_socket_t fd, const void *to, + size_t len) +{ + const char *to_p = to; + CURLcode result; + ssize_t written; + + while(len > 0) { + result = Curl_write_plain(conn, fd, to_p, len, &written); + if(!result) { + len -= written; + to_p += written; + } + else { + if(result == CURLE_AGAIN) + continue; + return result; + } + } + return CURLE_OK; +} + +static CURLcode read_data(struct connectdata *conn, + curl_socket_t fd, + struct krb5buffer *buf) +{ + int len; + CURLcode result; + + result = socket_read(fd, &len, sizeof(len)); + if(result) + return result; + + if(len) { + /* only realloc if there was a length */ + len = ntohl(len); + buf->data = Curl_saferealloc(buf->data, len); + } + if(!len || !buf->data) + return CURLE_OUT_OF_MEMORY; + + result = socket_read(fd, buf->data, len); + if(result) + return result; + buf->size = conn->mech->decode(conn->app_data, buf->data, len, + conn->data_prot, conn); + buf->index = 0; + return CURLE_OK; +} + +static size_t +buffer_read(struct krb5buffer *buf, void *data, size_t len) +{ + if(buf->size - buf->index < len) + len = buf->size - buf->index; + memcpy(data, (char *)buf->data + buf->index, len); + buf->index += len; + return len; +} + +/* Matches Curl_recv signature */ +static ssize_t sec_recv(struct connectdata *conn, int sockindex, + char *buffer, size_t len, CURLcode *err) +{ + size_t bytes_read; + size_t total_read = 0; + curl_socket_t fd = conn->sock[sockindex]; + + *err = CURLE_OK; + + /* Handle clear text response. */ + if(conn->sec_complete == 0 || conn->data_prot == PROT_CLEAR) + return sread(fd, buffer, len); + + if(conn->in_buffer.eof_flag) { + conn->in_buffer.eof_flag = 0; + return 0; + } + + bytes_read = buffer_read(&conn->in_buffer, buffer, len); + len -= bytes_read; + total_read += bytes_read; + buffer += bytes_read; + + while(len > 0) { + if(read_data(conn, fd, &conn->in_buffer)) + return -1; + if(conn->in_buffer.size == 0) { + if(bytes_read > 0) + conn->in_buffer.eof_flag = 1; + return bytes_read; + } + bytes_read = buffer_read(&conn->in_buffer, buffer, len); + len -= bytes_read; + total_read += bytes_read; + buffer += bytes_read; + } + return total_read; +} + +/* Send |length| bytes from |from| to the |fd| socket taking care of encoding + and negotiating with the server. |from| can be NULL. */ +static void do_sec_send(struct connectdata *conn, curl_socket_t fd, + const char *from, int length) +{ + int bytes, htonl_bytes; /* 32-bit integers for htonl */ + char *buffer = NULL; + char *cmd_buffer; + size_t cmd_size = 0; + CURLcode error; + enum protection_level prot_level = conn->data_prot; + bool iscmd = (prot_level == PROT_CMD)?TRUE:FALSE; + + DEBUGASSERT(prot_level > PROT_NONE && prot_level < PROT_LAST); + + if(iscmd) { + if(!strncmp(from, "PASS ", 5) || !strncmp(from, "ACCT ", 5)) + prot_level = PROT_PRIVATE; + else + prot_level = conn->command_prot; + } + bytes = conn->mech->encode(conn->app_data, from, length, prot_level, + (void **)&buffer); + if(!buffer || bytes <= 0) + return; /* error */ + + if(iscmd) { + error = Curl_base64_encode(conn->data, buffer, curlx_sitouz(bytes), + &cmd_buffer, &cmd_size); + if(error) { + free(buffer); + return; /* error */ + } + if(cmd_size > 0) { + static const char *enc = "ENC "; + static const char *mic = "MIC "; + if(prot_level == PROT_PRIVATE) + socket_write(conn, fd, enc, 4); + else + socket_write(conn, fd, mic, 4); + + socket_write(conn, fd, cmd_buffer, cmd_size); + socket_write(conn, fd, "\r\n", 2); + infof(conn->data, "Send: %s%s\n", prot_level == PROT_PRIVATE?enc:mic, + cmd_buffer); + free(cmd_buffer); + } + } + else { + htonl_bytes = htonl(bytes); + socket_write(conn, fd, &htonl_bytes, sizeof(htonl_bytes)); + socket_write(conn, fd, buffer, curlx_sitouz(bytes)); + } + free(buffer); +} + +static ssize_t sec_write(struct connectdata *conn, curl_socket_t fd, + const char *buffer, size_t length) +{ + ssize_t tx = 0, len = conn->buffer_size; + + len -= conn->mech->overhead(conn->app_data, conn->data_prot, + curlx_sztosi(len)); + if(len <= 0) + len = length; + while(length) { + if(length < (size_t)len) + len = length; + + do_sec_send(conn, fd, buffer, curlx_sztosi(len)); + length -= len; + buffer += len; + tx += len; + } + return tx; +} + +/* Matches Curl_send signature */ +static ssize_t sec_send(struct connectdata *conn, int sockindex, + const void *buffer, size_t len, CURLcode *err) +{ + curl_socket_t fd = conn->sock[sockindex]; + *err = CURLE_OK; + return sec_write(conn, fd, buffer, len); +} + +int Curl_sec_read_msg(struct connectdata *conn, char *buffer, + enum protection_level level) +{ + /* decoded_len should be size_t or ssize_t but conn->mech->decode returns an + int */ + int decoded_len; + char *buf; + int ret_code = 0; + size_t decoded_sz = 0; + CURLcode error; + + if(!conn->mech) + /* not inititalized, return error */ + return -1; + + DEBUGASSERT(level > PROT_NONE && level < PROT_LAST); + + error = Curl_base64_decode(buffer + 4, (unsigned char **)&buf, &decoded_sz); + if(error || decoded_sz == 0) + return -1; + + if(decoded_sz > (size_t)INT_MAX) { + free(buf); + return -1; + } + decoded_len = curlx_uztosi(decoded_sz); + + decoded_len = conn->mech->decode(conn->app_data, buf, decoded_len, + level, conn); + if(decoded_len <= 0) { + free(buf); + return -1; + } + + if(conn->data->set.verbose) { + buf[decoded_len] = '\n'; + Curl_debug(conn->data, CURLINFO_HEADER_IN, buf, decoded_len + 1); + } + + buf[decoded_len] = '\0'; + if(decoded_len <= 3) + /* suspiciously short */ + return 0; + + if(buf[3] != '-') + /* safe to ignore return code */ + (void)sscanf(buf, "%d", &ret_code); + + if(buf[decoded_len - 1] == '\n') + buf[decoded_len - 1] = '\0'; + strcpy(buffer, buf); + free(buf); + return ret_code; +} + +static int sec_set_protection_level(struct connectdata *conn) +{ + int code; + enum protection_level level = conn->request_data_prot; + + DEBUGASSERT(level > PROT_NONE && level < PROT_LAST); + + if(!conn->sec_complete) { + infof(conn->data, "Trying to change the protection level after the" + " completion of the data exchange.\n"); + return -1; + } + + /* Bail out if we try to set up the same level */ + if(conn->data_prot == level) + return 0; + + if(level) { + char *pbsz; + static unsigned int buffer_size = 1 << 20; /* 1048576 */ + + code = ftp_send_command(conn, "PBSZ %u", buffer_size); + if(code < 0) + return -1; + + if(code/100 != 2) { + failf(conn->data, "Failed to set the protection's buffer size."); + return -1; + } + conn->buffer_size = buffer_size; + + pbsz = strstr(conn->data->state.buffer, "PBSZ="); + if(pbsz) { + /* ignore return code, use default value if it fails */ + (void)sscanf(pbsz, "PBSZ=%u", &buffer_size); + if(buffer_size < conn->buffer_size) + conn->buffer_size = buffer_size; + } + } + + /* Now try to negiociate the protection level. */ + code = ftp_send_command(conn, "PROT %c", level_to_char(level)); + + if(code < 0) + return -1; + + if(code/100 != 2) { + failf(conn->data, "Failed to set the protection level."); + return -1; + } + + conn->data_prot = level; + if(level == PROT_PRIVATE) + conn->command_prot = level; + + return 0; +} + +int +Curl_sec_request_prot(struct connectdata *conn, const char *level) +{ + enum protection_level l = name_to_level(level); + if(l == PROT_NONE) + return -1; + DEBUGASSERT(l > PROT_NONE && l < PROT_LAST); + conn->request_data_prot = l; + return 0; +} + +static CURLcode choose_mech(struct connectdata *conn) +{ + int ret; + struct Curl_easy *data = conn->data; + void *tmp_allocation; + const struct Curl_sec_client_mech *mech = &Curl_krb5_client_mech; + + tmp_allocation = realloc(conn->app_data, mech->size); + if(tmp_allocation == NULL) { + failf(data, "Failed realloc of size %zu", mech->size); + mech = NULL; + return CURLE_OUT_OF_MEMORY; + } + conn->app_data = tmp_allocation; + + if(mech->init) { + ret = mech->init(conn->app_data); + if(ret) { + infof(data, "Failed initialization for %s. Skipping it.\n", + mech->name); + return CURLE_FAILED_INIT; + } + } + + infof(data, "Trying mechanism %s...\n", mech->name); + ret = ftp_send_command(conn, "AUTH %s", mech->name); + if(ret < 0) + return CURLE_COULDNT_CONNECT; + + if(ret/100 != 3) { + switch(ret) { + case 504: + infof(data, "Mechanism %s is not supported by the server (server " + "returned ftp code: 504).\n", mech->name); + break; + case 534: + infof(data, "Mechanism %s was rejected by the server (server returned " + "ftp code: 534).\n", mech->name); + break; + default: + if(ret/100 == 5) { + infof(data, "server does not support the security extensions\n"); + return CURLE_USE_SSL_FAILED; + } + break; + } + return CURLE_LOGIN_DENIED; + } + + /* Authenticate */ + ret = mech->auth(conn->app_data, conn); + + if(ret != AUTH_CONTINUE) { + if(ret != AUTH_OK) { + /* Mechanism has dumped the error to stderr, don't error here. */ + return CURLE_USE_SSL_FAILED; + } + DEBUGASSERT(ret == AUTH_OK); + + conn->mech = mech; + conn->sec_complete = 1; + conn->recv[FIRSTSOCKET] = sec_recv; + conn->send[FIRSTSOCKET] = sec_send; + conn->recv[SECONDARYSOCKET] = sec_recv; + conn->send[SECONDARYSOCKET] = sec_send; + conn->command_prot = PROT_SAFE; + /* Set the requested protection level */ + /* BLOCKING */ + (void)sec_set_protection_level(conn); + } + + return CURLE_OK; +} + +CURLcode +Curl_sec_login(struct connectdata *conn) +{ + return choose_mech(conn); +} + + +void +Curl_sec_end(struct connectdata *conn) +{ + if(conn->mech != NULL && conn->mech->end) + conn->mech->end(conn->app_data); + free(conn->app_data); + conn->app_data = NULL; + if(conn->in_buffer.data) { + free(conn->in_buffer.data); + conn->in_buffer.data = NULL; + conn->in_buffer.size = 0; + conn->in_buffer.index = 0; + conn->in_buffer.eof_flag = 0; + } + conn->sec_complete = 0; + conn->data_prot = PROT_CLEAR; + conn->mech = NULL; +} + #endif /* HAVE_GSSAPI && !CURL_DISABLE_FTP */ diff --git a/libs/libcurl/src/ldap.c b/libs/libcurl/src/ldap.c index 512def659c..8d1ee6445c 100644 --- a/libs/libcurl/src/ldap.c +++ b/libs/libcurl/src/ldap.c @@ -150,6 +150,7 @@ const struct Curl_handler Curl_handler_ldap = { ZERO_NULL, /* connection_check */ PORT_LDAP, /* defport */ CURLPROTO_LDAP, /* protocol */ + CURLPROTO_LDAP, /* family */ PROTOPT_NONE /* flags */ }; @@ -176,6 +177,7 @@ const struct Curl_handler Curl_handler_ldaps = { ZERO_NULL, /* connection_check */ PORT_LDAPS, /* defport */ CURLPROTO_LDAPS, /* protocol */ + CURLPROTO_LDAP, /* family */ PROTOPT_SSL /* flags */ }; #endif @@ -257,6 +259,13 @@ static int ldap_win_bind(struct connectdata *conn, LDAP *server, } #endif /* #if defined(USE_WIN32_LDAP) */ +#if defined(USE_WIN32_LDAP) +#define FREE_ON_WINLDAP(x) curlx_unicodefree(x) +#else +#define FREE_ON_WINLDAP(x) +#endif + + static CURLcode Curl_ldap(struct connectdata *conn, bool *done) { CURLcode result = CURLE_OK; @@ -463,9 +472,6 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) } #ifdef USE_WIN32_LDAP ldap_set_option(server, LDAP_OPT_PROTOCOL_VERSION, &ldap_proto); -#endif - -#ifdef USE_WIN32_LDAP rc = ldap_win_bind(conn, server, user, passwd); #else rc = ldap_simple_bind_s(server, user, passwd); @@ -507,7 +513,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) #if defined(USE_WIN32_LDAP) TCHAR *attribute; #else - char *attribute; /*! suspicious that this isn't 'const' */ + char *attribute; #endif int i; @@ -532,30 +538,22 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"DN: ", 4); if(result) { -#if defined(USE_WIN32_LDAP) - curlx_unicodefree(name); -#endif + FREE_ON_WINLDAP(name); ldap_memfree(dn); - goto quit; } result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *) name, name_len); if(result) { -#if defined(USE_WIN32_LDAP) - curlx_unicodefree(name); -#endif + FREE_ON_WINLDAP(name); ldap_memfree(dn); - goto quit; } result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1); if(result) { -#if defined(USE_WIN32_LDAP) - curlx_unicodefree(name); -#endif + FREE_ON_WINLDAP(name); ldap_memfree(dn); goto quit; @@ -563,9 +561,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) dlsize += name_len + 5; -#if defined(USE_WIN32_LDAP) - curlx_unicodefree(name); -#endif + FREE_ON_WINLDAP(name); ldap_memfree(dn); } @@ -596,9 +592,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\t", 1); if(result) { ldap_value_free_len(vals); -#if defined(USE_WIN32_LDAP) - curlx_unicodefree(attr); -#endif + FREE_ON_WINLDAP(attr); ldap_memfree(attribute); if(ber) ber_free(ber, 0); @@ -610,9 +604,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) (char *) attr, attr_len); if(result) { ldap_value_free_len(vals); -#if defined(USE_WIN32_LDAP) - curlx_unicodefree(attr); -#endif + FREE_ON_WINLDAP(attr); ldap_memfree(attribute); if(ber) ber_free(ber, 0); @@ -623,9 +615,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)": ", 2); if(result) { ldap_value_free_len(vals); -#if defined(USE_WIN32_LDAP) - curlx_unicodefree(attr); -#endif + FREE_ON_WINLDAP(attr); ldap_memfree(attribute); if(ber) ber_free(ber, 0); @@ -645,9 +635,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) &val_b64_sz); if(result) { ldap_value_free_len(vals); -#if defined(USE_WIN32_LDAP) - curlx_unicodefree(attr); -#endif + FREE_ON_WINLDAP(attr); ldap_memfree(attribute); if(ber) ber_free(ber, 0); @@ -661,9 +649,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) free(val_b64); if(result) { ldap_value_free_len(vals); -#if defined(USE_WIN32_LDAP) - curlx_unicodefree(attr); -#endif + FREE_ON_WINLDAP(attr); ldap_memfree(attribute); if(ber) ber_free(ber, 0); @@ -679,9 +665,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) vals[i]->bv_len); if(result) { ldap_value_free_len(vals); -#if defined(USE_WIN32_LDAP) - curlx_unicodefree(attr); -#endif + FREE_ON_WINLDAP(attr); ldap_memfree(attribute); if(ber) ber_free(ber, 0); @@ -695,9 +679,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1); if(result) { ldap_value_free_len(vals); -#if defined(USE_WIN32_LDAP) - curlx_unicodefree(attr); -#endif + FREE_ON_WINLDAP(attr); ldap_memfree(attribute); if(ber) ber_free(ber, 0); @@ -713,9 +695,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done) } /* Free the attribute as we are done with it */ -#if defined(USE_WIN32_LDAP) - curlx_unicodefree(attr); -#endif + FREE_ON_WINLDAP(attr); ldap_memfree(attribute); result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1); @@ -745,9 +725,7 @@ quit: ldapssl_client_deinit(); #endif /* HAVE_LDAP_SSL && CURL_HAS_NOVELL_LDAPSDK */ -#if defined(USE_WIN32_LDAP) - curlx_unicodefree(host); -#endif + FREE_ON_WINLDAP(host); /* no data to transfer */ Curl_setup_transfer(data, -1, -1, FALSE, -1); diff --git a/libs/libcurl/src/libcurl.plist b/libs/libcurl/src/libcurl.plist index 1b3d178c38..eab1efe31c 100644 --- a/libs/libcurl/src/libcurl.plist +++ b/libs/libcurl/src/libcurl.plist @@ -15,7 +15,7 @@ se.haxx.curl.libcurl CFBundleVersion - 7.72.0 + 7.73.0 CFBundleName libcurl @@ -27,9 +27,9 @@ ???? CFBundleShortVersionString - libcurl 7.72.0 + libcurl 7.73.0 CFBundleGetInfoString - libcurl.plist 7.72.0 + libcurl.plist 7.73.0 diff --git a/libs/libcurl/src/llist.c b/libs/libcurl/src/llist.c index e7c6f51dc7..0a2baa08ec 100644 --- a/libs/libcurl/src/llist.c +++ b/libs/libcurl/src/llist.c @@ -34,7 +34,7 @@ * @unittest: 1300 */ void -Curl_llist_init(struct curl_llist *l, curl_llist_dtor dtor) +Curl_llist_init(struct Curl_llist *l, Curl_llist_dtor dtor) { l->size = 0; l->dtor = dtor; @@ -54,9 +54,9 @@ Curl_llist_init(struct curl_llist *l, curl_llist_dtor dtor) * @unittest: 1300 */ void -Curl_llist_insert_next(struct curl_llist *list, struct curl_llist_element *e, +Curl_llist_insert_next(struct Curl_llist *list, struct Curl_llist_element *e, const void *p, - struct curl_llist_element *ne) + struct Curl_llist_element *ne) { ne->ptr = (void *) p; if(list->size == 0) { @@ -90,7 +90,7 @@ Curl_llist_insert_next(struct curl_llist *list, struct curl_llist_element *e, * @unittest: 1300 */ void -Curl_llist_remove(struct curl_llist *list, struct curl_llist_element *e, +Curl_llist_remove(struct Curl_llist *list, struct Curl_llist_element *e, void *user) { void *ptr; @@ -131,7 +131,7 @@ Curl_llist_remove(struct curl_llist *list, struct curl_llist_element *e, } void -Curl_llist_destroy(struct curl_llist *list, void *user) +Curl_llist_destroy(struct Curl_llist *list, void *user) { if(list) { while(list->size > 0) @@ -140,7 +140,7 @@ Curl_llist_destroy(struct curl_llist *list, void *user) } size_t -Curl_llist_count(struct curl_llist *list) +Curl_llist_count(struct Curl_llist *list) { return list->size; } diff --git a/libs/libcurl/src/llist.h b/libs/libcurl/src/llist.h index 0178c42598..91cfda1bcd 100644 --- a/libs/libcurl/src/llist.h +++ b/libs/libcurl/src/llist.h @@ -25,26 +25,26 @@ #include "curl_setup.h" #include -typedef void (*curl_llist_dtor)(void *, void *); +typedef void (*Curl_llist_dtor)(void *, void *); -struct curl_llist_element { +struct Curl_llist_element { void *ptr; - struct curl_llist_element *prev; - struct curl_llist_element *next; + struct Curl_llist_element *prev; + struct Curl_llist_element *next; }; -struct curl_llist { - struct curl_llist_element *head; - struct curl_llist_element *tail; - curl_llist_dtor dtor; +struct Curl_llist { + struct Curl_llist_element *head; + struct Curl_llist_element *tail; + Curl_llist_dtor dtor; size_t size; }; -void Curl_llist_init(struct curl_llist *, curl_llist_dtor); -void Curl_llist_insert_next(struct curl_llist *, struct curl_llist_element *, - const void *, struct curl_llist_element *node); -void Curl_llist_remove(struct curl_llist *, struct curl_llist_element *, +void Curl_llist_init(struct Curl_llist *, Curl_llist_dtor); +void Curl_llist_insert_next(struct Curl_llist *, struct Curl_llist_element *, + const void *, struct Curl_llist_element *node); +void Curl_llist_remove(struct Curl_llist *, struct Curl_llist_element *, void *); -size_t Curl_llist_count(struct curl_llist *); -void Curl_llist_destroy(struct curl_llist *, void *); +size_t Curl_llist_count(struct Curl_llist *); +void Curl_llist_destroy(struct Curl_llist *, void *); #endif /* HEADER_CURL_LLIST_H */ diff --git a/libs/libcurl/src/memdebug.c b/libs/libcurl/src/memdebug.c index da75c9f5db..6c56084742 100644 --- a/libs/libcurl/src/memdebug.c +++ b/libs/libcurl/src/memdebug.c @@ -35,52 +35,6 @@ #include "curl_memory.h" #include "memdebug.h" -/* - * Until 2011-08-17 libcurl's Memory Tracking feature also performed - * automatic malloc and free filling operations using 0xA5 and 0x13 - * values. Our own preinitialization of dynamically allocated memory - * might be useful when not using third party memory debuggers, but - * on the other hand this would fool memory debuggers into thinking - * that all dynamically allocated memory is properly initialized. - * - * As a default setting, libcurl's Memory Tracking feature no longer - * performs preinitialization of dynamically allocated memory on its - * own. If you know what you are doing, and really want to retain old - * behavior, you can achieve this compiling with preprocessor symbols - * CURL_MT_MALLOC_FILL and CURL_MT_FREE_FILL defined with appropriate - * values. - */ - -#ifdef CURL_MT_MALLOC_FILL -# if (CURL_MT_MALLOC_FILL < 0) || (CURL_MT_MALLOC_FILL > 0xff) -# error "invalid CURL_MT_MALLOC_FILL or out of range" -# endif -#endif - -#ifdef CURL_MT_FREE_FILL -# if (CURL_MT_FREE_FILL < 0) || (CURL_MT_FREE_FILL > 0xff) -# error "invalid CURL_MT_FREE_FILL or out of range" -# endif -#endif - -#if defined(CURL_MT_MALLOC_FILL) && defined(CURL_MT_FREE_FILL) -# if (CURL_MT_MALLOC_FILL == CURL_MT_FREE_FILL) -# error "CURL_MT_MALLOC_FILL same as CURL_MT_FREE_FILL" -# endif -#endif - -#ifdef CURL_MT_MALLOC_FILL -# define mt_malloc_fill(buf,len) memset((buf), CURL_MT_MALLOC_FILL, (len)) -#else -# define mt_malloc_fill(buf,len) Curl_nop_stmt -#endif - -#ifdef CURL_MT_FREE_FILL -# define mt_free_fill(buf,len) memset((buf), CURL_MT_FREE_FILL, (len)) -#else -# define mt_free_fill(buf,len) Curl_nop_stmt -#endif - struct memdebug { size_t size; union { @@ -173,8 +127,6 @@ void *curl_dbg_malloc(size_t wantedsize, int line, const char *source) mem = (Curl_cmalloc)(size); if(mem) { - /* fill memory with junk */ - mt_malloc_fill(mem->mem, wantedsize); mem->size = wantedsize; } @@ -321,9 +273,6 @@ void curl_dbg_free(void *ptr, int line, const char *source) # pragma warning(pop) #endif - /* destroy */ - mt_free_fill(mem->mem, mem->size); - /* free for real */ (Curl_cfree)(mem); } diff --git a/libs/libcurl/src/mprintf.c b/libs/libcurl/src/mprintf.c index 80735be51b..6aceadc96f 100644 --- a/libs/libcurl/src/mprintf.c +++ b/libs/libcurl/src/mprintf.c @@ -99,12 +99,12 @@ static const char lower_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz"; /* Upper-case digits. */ static const char upper_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -#define OUTCHAR(x) \ - do{ \ +#define OUTCHAR(x) \ + do { \ if(stream((unsigned char)(x), (FILE *)data) != -1) \ - done++; \ - else \ - return done; /* return immediately on failure */ \ + done++; \ + else \ + return done; /* return immediately on failure */ \ } while(0) /* Data type to read from the arglist */ @@ -169,7 +169,7 @@ struct nsprintf { }; struct asprintf { - struct dynbuf b; + struct dynbuf *b; bool fail; /* if an alloc has failed and thus the output is not the complete data */ }; @@ -878,7 +878,7 @@ static int dprintf_formatf( OUTCHAR(' '); for(point = strnil; *point != '\0'; ++point) OUTCHAR(*point); - if(! (p->flags & FLAGS_LEFT)) + if(!(p->flags & FLAGS_LEFT)) while(width-- > 0) OUTCHAR(' '); } @@ -1042,50 +1042,61 @@ static int alloc_addbyter(int output, FILE *data) struct asprintf *infop = (struct asprintf *)data; unsigned char outc = (unsigned char)output; - if(Curl_dyn_addn(&infop->b, &outc, 1)) { + if(Curl_dyn_addn(infop->b, &outc, 1)) { infop->fail = 1; return -1; /* fail */ } return outc; /* fputc() returns like this on success */ } -char *curl_maprintf(const char *format, ...) +extern int Curl_dyn_vprintf(struct dynbuf *dyn, + const char *format, va_list ap_save); + +/* appends the formatted string, returns 0 on success, 1 on error */ +int Curl_dyn_vprintf(struct dynbuf *dyn, const char *format, va_list ap_save) { - va_list ap_save; /* argument pointer */ int retcode; struct asprintf info; - Curl_dyn_init(&info.b, DYN_APRINTF); + info.b = dyn; info.fail = 0; - va_start(ap_save, format); retcode = dprintf_formatf(&info, alloc_addbyter, format, ap_save); - va_end(ap_save); if((-1 == retcode) || info.fail) { - Curl_dyn_free(&info.b); - return NULL; + Curl_dyn_free(info.b); + return 1; } - if(Curl_dyn_len(&info.b)) - return Curl_dyn_ptr(&info.b); - return strdup(""); + return 0; } char *curl_mvaprintf(const char *format, va_list ap_save) { int retcode; struct asprintf info; - Curl_dyn_init(&info.b, DYN_APRINTF); + struct dynbuf dyn; + info.b = &dyn; + Curl_dyn_init(info.b, DYN_APRINTF); info.fail = 0; retcode = dprintf_formatf(&info, alloc_addbyter, format, ap_save); if((-1 == retcode) || info.fail) { - Curl_dyn_free(&info.b); + Curl_dyn_free(info.b); return NULL; } - if(Curl_dyn_len(&info.b)) - return Curl_dyn_ptr(&info.b); + if(Curl_dyn_len(info.b)) + return Curl_dyn_ptr(info.b); return strdup(""); } +char *curl_maprintf(const char *format, ...) +{ + va_list ap_save; + char *s; + va_start(ap_save, format); + s = curl_mvaprintf(format, ap_save); + va_end(ap_save); + return s; +} + static int storebuffer(int output, FILE *data) { char **buffer = (char **)data; diff --git a/libs/libcurl/src/mqtt.c b/libs/libcurl/src/mqtt.c index f6f4416140..c0e9a2b754 100644 --- a/libs/libcurl/src/mqtt.c +++ b/libs/libcurl/src/mqtt.c @@ -23,7 +23,7 @@ #include "curl_setup.h" -#ifdef CURL_ENABLE_MQTT +#ifndef CURL_DISABLE_MQTT #include "urldata.h" #include @@ -86,6 +86,7 @@ const struct Curl_handler Curl_handler_mqtt = { ZERO_NULL, /* connection_check */ PORT_MQTT, /* defport */ CURLPROTO_MQTT, /* protocol */ + CURLPROTO_MQTT, /* family */ PROTOPT_NONE /* flags */ }; @@ -142,7 +143,7 @@ static CURLcode mqtt_connect(struct connectdata *conn) const size_t client_id_offset = 14; const size_t packetlen = client_id_offset + MQTT_CLIENTID_LEN; char client_id[MQTT_CLIENTID_LEN + 1] = "curl"; - const size_t curl_len = strlen("curl"); + const size_t clen = strlen("curl"); char packet[32] = { MQTT_MSG_CONNECT, /* packet type */ 0x00, /* remaining length */ @@ -156,8 +157,8 @@ static CURLcode mqtt_connect(struct connectdata *conn) packet[1] = (packetlen - 2) & 0x7f; packet[client_id_offset - 1] = MQTT_CLIENTID_LEN; - result = Curl_rand_hex(conn->data, (unsigned char *)&client_id[curl_len], - MQTT_CLIENTID_LEN - curl_len + 1); + result = Curl_rand_hex(conn->data, (unsigned char *)&client_id[clen], + MQTT_CLIENTID_LEN - clen + 1); memcpy(&packet[client_id_offset], client_id, MQTT_CLIENTID_LEN); infof(conn->data, "Using client id '%s'\n", client_id); if(!result) @@ -625,4 +626,4 @@ static CURLcode mqtt_doing(struct connectdata *conn, bool *done) return result; } -#endif /* CURL_ENABLE_MQTT */ +#endif /* CURL_DISABLE_MQTT */ diff --git a/libs/libcurl/src/mqtt.h b/libs/libcurl/src/mqtt.h index 37463d58ad..37c0441358 100644 --- a/libs/libcurl/src/mqtt.h +++ b/libs/libcurl/src/mqtt.h @@ -22,7 +22,7 @@ * ***************************************************************************/ -#ifdef CURL_ENABLE_MQTT +#ifndef CURL_DISABLE_MQTT extern const struct Curl_handler Curl_handler_mqtt; #endif diff --git a/libs/libcurl/src/multi.c b/libs/libcurl/src/multi.c index 3c7fb85ed8..4cc7c5ae61 100644 --- a/libs/libcurl/src/multi.c +++ b/libs/libcurl/src/multi.c @@ -190,7 +190,7 @@ static void mstate(struct Curl_easy *data, CURLMstate state */ struct Curl_sh_entry { - struct curl_hash transfers; /* hash of transfers using this socket */ + struct Curl_hash transfers; /* hash of transfers using this socket */ unsigned int action; /* what combined action READ/WRITE this socket waits for */ void *socketp; /* settable by users with curl_multi_assign() */ @@ -204,7 +204,7 @@ struct Curl_sh_entry { #define SH_WRITE 2 /* look up a given socket in the socket hash, skip invalid sockets */ -static struct Curl_sh_entry *sh_getentry(struct curl_hash *sh, +static struct Curl_sh_entry *sh_getentry(struct Curl_hash *sh, curl_socket_t s) { if(s != CURL_SOCKET_BAD) { @@ -238,7 +238,7 @@ static void trhash_dtor(void *nada) /* make sure this socket is present in the hash for this handle */ -static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh, +static struct Curl_sh_entry *sh_addentry(struct Curl_hash *sh, curl_socket_t s) { struct Curl_sh_entry *there = sh_getentry(sh, s); @@ -273,7 +273,7 @@ static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh, /* delete the given socket + handle from the hash */ static void sh_delentry(struct Curl_sh_entry *entry, - struct curl_hash *sh, curl_socket_t s) + struct Curl_hash *sh, curl_socket_t s) { Curl_hash_destroy(&entry->transfers); @@ -325,7 +325,7 @@ static size_t hash_fd(void *key, size_t key_length, size_t slots_num) * per call." * */ -static int sh_init(struct curl_hash *hash, int hashsize) +static int sh_init(struct Curl_hash *hash, int hashsize) { return Curl_hash_init(hash, hashsize, hash_fd, fd_key_compare, sh_freeentry); @@ -374,6 +374,11 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */ multi->max_concurrent_streams = 100; multi->ipv6_works = Curl_ipv6works(NULL); +#ifdef USE_WINSOCK + multi->wsa_event = WSACreateEvent(); + if(multi->wsa_event == WSA_INVALID_EVENT) + goto error; +#else #ifdef ENABLE_WAKEUP if(Curl_socketpair(AF_UNIX, SOCK_STREAM, 0, multi->wakeup_pair) < 0) { multi->wakeup_pair[0] = CURL_SOCKET_BAD; @@ -386,6 +391,7 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */ multi->wakeup_pair[0] = CURL_SOCKET_BAD; multi->wakeup_pair[1] = CURL_SOCKET_BAD; } +#endif #endif return multi; @@ -716,7 +722,7 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi, struct Curl_easy *easy = data; bool premature; bool easy_owns_conn; - struct curl_llist_element *e; + struct Curl_llist_element *e; /* First, make some basic checks that the CURLM handle is a good handle */ if(!GOOD_MULTI_HANDLE(multi)) @@ -1081,11 +1087,17 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi, unsigned int i; unsigned int nfds = 0; unsigned int curlfds; - bool ufds_malloc = FALSE; long timeout_internal; int retcode = 0; +#ifndef USE_WINSOCK struct pollfd a_few_on_stack[NUM_POLLS_ON_STACK]; struct pollfd *ufds = &a_few_on_stack[0]; + bool ufds_malloc = FALSE; +#else + struct pollfd pre_poll; + WSANETWORKEVENTS wsa_events; + DEBUGASSERT(multi->wsa_event != WSA_INVALID_EVENT); +#endif if(!GOOD_MULTI_HANDLE(multi)) return CURLM_BAD_HANDLE; @@ -1131,11 +1143,16 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi, nfds += extra_nfds; /* add the externally provided ones */ #ifdef ENABLE_WAKEUP +#ifdef USE_WINSOCK + if(use_wakeup) { +#else if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) { +#endif ++nfds; } #endif +#ifndef USE_WINSOCK if(nfds > NUM_POLLS_ON_STACK) { /* 'nfds' is a 32 bit value and 'struct pollfd' is typically 8 bytes big, so at 2^29 sockets this value might wrap. When a process gets @@ -1146,7 +1163,9 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi, return CURLM_OUT_OF_MEMORY; ufds_malloc = TRUE; } + nfds = 0; +#endif /* only do the second loop if we found descriptors in the first stage run above */ @@ -1157,24 +1176,42 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi, while(data) { bitmap = multi_getsock(data, sockbunch); - for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) { + for(i = 0; i < MAX_SOCKSPEREASYHANDLE; i++) { curl_socket_t s = CURL_SOCKET_BAD; - +#ifdef USE_WINSOCK + long mask = 0; +#endif if(bitmap & GETSOCK_READSOCK(i)) { +#ifdef USE_WINSOCK + if(timeout_ms && SOCKET_READABLE(sockbunch[i], 0) > 0) + timeout_ms = 0; + mask |= FD_READ|FD_ACCEPT|FD_CLOSE; +#else ufds[nfds].fd = sockbunch[i]; ufds[nfds].events = POLLIN; ++nfds; +#endif s = sockbunch[i]; } if(bitmap & GETSOCK_WRITESOCK(i)) { +#ifdef USE_WINSOCK + if(timeout_ms && SOCKET_WRITABLE(sockbunch[i], 0) > 0) + timeout_ms = 0; + mask |= FD_WRITE|FD_CONNECT|FD_CLOSE; +#else ufds[nfds].fd = sockbunch[i]; ufds[nfds].events = POLLOUT; ++nfds; +#endif s = sockbunch[i]; } if(s == CURL_SOCKET_BAD) { break; } +#ifdef USE_WINSOCK + if(WSAEventSelect(s, multi->wsa_event, mask) != 0) + return CURLM_INTERNAL_ERROR; +#endif } data = data->next; /* check next handle */ @@ -1183,6 +1220,37 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi, /* Add external file descriptions from poll-like struct curl_waitfd */ for(i = 0; i < extra_nfds; i++) { +#ifdef USE_WINSOCK + long mask = 0; + extra_fds[i].revents = 0; + pre_poll.fd = extra_fds[i].fd; + pre_poll.events = 0; + pre_poll.revents = 0; + if(extra_fds[i].events & CURL_WAIT_POLLIN) { + mask |= FD_READ|FD_ACCEPT|FD_CLOSE; + pre_poll.events |= POLLIN; + } + if(extra_fds[i].events & CURL_WAIT_POLLPRI) { + mask |= FD_OOB; + pre_poll.events |= POLLPRI; + } + if(extra_fds[i].events & CURL_WAIT_POLLOUT) { + mask |= FD_WRITE|FD_CONNECT|FD_CLOSE; + pre_poll.events |= POLLOUT; + } + if(Curl_poll(&pre_poll, 1, 0) > 0) { + if(pre_poll.revents & POLLIN) + extra_fds[i].revents |= CURL_WAIT_POLLIN; + if(pre_poll.revents & POLLPRI) + extra_fds[i].revents |= CURL_WAIT_POLLPRI; + if(pre_poll.revents & POLLOUT) + extra_fds[i].revents |= CURL_WAIT_POLLOUT; + if(extra_fds[i].revents) + timeout_ms = 0; + } + if(WSAEventSelect(extra_fds[i].fd, multi->wsa_event, mask) != 0) + return CURLM_INTERNAL_ERROR; +#else ufds[nfds].fd = extra_fds[i].fd; ufds[nfds].events = 0; if(extra_fds[i].events & CURL_WAIT_POLLIN) @@ -1192,28 +1260,57 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi, if(extra_fds[i].events & CURL_WAIT_POLLOUT) ufds[nfds].events |= POLLOUT; ++nfds; +#endif } #ifdef ENABLE_WAKEUP +#ifndef USE_WINSOCK if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) { ufds[nfds].fd = multi->wakeup_pair[0]; ufds[nfds].events = POLLIN; ++nfds; } +#endif #endif if(nfds) { - int pollrc; /* wait... */ - pollrc = Curl_poll(ufds, nfds, timeout_ms); +#ifdef USE_WINSOCK + WSAWaitForMultipleEvents(1, &multi->wsa_event, FALSE, timeout_ms, FALSE); +#else + int pollrc = Curl_poll(ufds, nfds, timeout_ms); +#endif +#ifdef USE_WINSOCK + /* With Winsock, we have to run this unconditionally to call + WSAEventSelect(fd, event, 0) on all the sockets */ + { + retcode = 0; +#else if(pollrc > 0) { retcode = pollrc; +#endif /* copy revents results from the poll to the curl_multi_wait poll struct, the bit values of the actual underlying poll() implementation may not be the same as the ones in the public libcurl API! */ for(i = 0; i < extra_nfds; i++) { unsigned short mask = 0; +#ifdef USE_WINSOCK + wsa_events.lNetworkEvents = 0; + mask = extra_fds[i].revents; + if(WSAEnumNetworkEvents(extra_fds[i].fd, multi->wsa_event, + &wsa_events) == 0) { + if(wsa_events.lNetworkEvents & (FD_READ|FD_ACCEPT|FD_CLOSE)) + mask |= CURL_WAIT_POLLIN; + if(wsa_events.lNetworkEvents & (FD_WRITE|FD_CONNECT|FD_CLOSE)) + mask |= CURL_WAIT_POLLOUT; + if(wsa_events.lNetworkEvents & FD_OOB) + mask |= CURL_WAIT_POLLPRI; + if(ret && wsa_events.lNetworkEvents != 0) + retcode++; + } + WSAEventSelect(extra_fds[i].fd, multi->wsa_event, 0); +#else unsigned r = ufds[curlfds + i].revents; if(r & POLLIN) @@ -1222,10 +1319,46 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi, mask |= CURL_WAIT_POLLOUT; if(r & POLLPRI) mask |= CURL_WAIT_POLLPRI; - +#endif extra_fds[i].revents = mask; } +#ifdef USE_WINSOCK + /* Count up all our own sockets that had activity, + and remove them from the event. */ + if(curlfds) { + data = multi->easyp; + while(data) { + bitmap = multi_getsock(data, sockbunch); + + for(i = 0; i < MAX_SOCKSPEREASYHANDLE; i++) { + if(bitmap & (GETSOCK_READSOCK(i) | GETSOCK_WRITESOCK(i))) { + wsa_events.lNetworkEvents = 0; + if(WSAEnumNetworkEvents(sockbunch[i], multi->wsa_event, + &wsa_events) == 0) { + if(ret && wsa_events.lNetworkEvents != 0) + retcode++; + } + if(ret && !timeout_ms && wsa_events.lNetworkEvents == 0) { + if((bitmap & GETSOCK_READSOCK(i)) && + SOCKET_READABLE(sockbunch[i], 0) > 0) + retcode++; + else if((bitmap & GETSOCK_WRITESOCK(i)) && + SOCKET_WRITABLE(sockbunch[i], 0) > 0) + retcode++; + } + WSAEventSelect(sockbunch[i], multi->wsa_event, 0); + } + else + break; + } + + data = data->next; + } + } + + WSAResetEvent(multi->wsa_event); +#else #ifdef ENABLE_WAKEUP if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) { if(ufds[curlfds + extra_nfds].revents & POLLIN) { @@ -1238,10 +1371,8 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi, when there is no more data, breaking the loop. */ nread = sread(multi->wakeup_pair[0], buf, sizeof(buf)); if(nread <= 0) { -#ifndef USE_WINSOCK if(nread < 0 && EINTR == SOCKERRNO) continue; -#endif break; } } @@ -1249,12 +1380,15 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi, retcode--; } } +#endif #endif } } +#ifndef USE_WINSOCK if(ufds_malloc) free(ufds); +#endif if(ret) *ret = retcode; if(!extrawait || nfds) @@ -1309,6 +1443,10 @@ CURLMcode curl_multi_wakeup(struct Curl_multi *multi) return CURLM_BAD_HANDLE; #ifdef ENABLE_WAKEUP +#ifdef USE_WINSOCK + if(WSASetEvent(multi->wsa_event)) + return CURLM_OK; +#else /* the wakeup_pair variable is only written during init and cleanup, making it safe to access from another thread after the init part and before cleanup */ @@ -1341,6 +1479,7 @@ CURLMcode curl_multi_wakeup(struct Curl_multi *multi) return CURLM_OK; } } +#endif #endif return CURLM_WAKEUP_FAILURE; } @@ -1562,7 +1701,7 @@ CURLcode Curl_preconnect(struct Curl_easy *data) static CURLMcode multi_runsingle(struct Curl_multi *multi, - struct curltime now, + struct curltime *nowp, struct Curl_easy *data) { struct Curl_message *msg = NULL; @@ -1603,7 +1742,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, (data->mstate < CURLM_STATE_COMPLETED)) { /* we need to wait for the connect state as only then is the start time stored, but we must not check already completed handles */ - timeout_ms = Curl_timeleft(data, &now, + timeout_ms = Curl_timeleft(data, nowp, (data->mstate <= CURLM_STATE_DO)? TRUE:FALSE); @@ -1612,25 +1751,25 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, if(data->mstate == CURLM_STATE_WAITRESOLVE) failf(data, "Resolving timed out after %" CURL_FORMAT_TIMEDIFF_T " milliseconds", - Curl_timediff(now, data->progress.t_startsingle)); + Curl_timediff(*nowp, data->progress.t_startsingle)); else if(data->mstate == CURLM_STATE_WAITCONNECT) failf(data, "Connection timed out after %" CURL_FORMAT_TIMEDIFF_T " milliseconds", - Curl_timediff(now, data->progress.t_startsingle)); + Curl_timediff(*nowp, data->progress.t_startsingle)); else { struct SingleRequest *k = &data->req; if(k->size != -1) { failf(data, "Operation timed out after %" CURL_FORMAT_TIMEDIFF_T " milliseconds with %" CURL_FORMAT_CURL_OFF_T " out of %" CURL_FORMAT_CURL_OFF_T " bytes received", - Curl_timediff(now, data->progress.t_startsingle), + Curl_timediff(*nowp, data->progress.t_startsingle), k->bytecount, k->size); } else { failf(data, "Operation timed out after %" CURL_FORMAT_TIMEDIFF_T " milliseconds with %" CURL_FORMAT_CURL_OFF_T " bytes received", - Curl_timediff(now, data->progress.t_startsingle), + Curl_timediff(*nowp, data->progress.t_startsingle), k->bytecount); } } @@ -1655,7 +1794,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, if(!result) { /* after init, go CONNECT */ multistate(data, CURLM_STATE_CONNECT); - Curl_pgrsTime(data, TIMER_STARTOP); + *nowp = Curl_pgrsTime(data, TIMER_STARTOP); rc = CURLM_CALL_MULTI_PERFORM; } break; @@ -1672,7 +1811,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, if(result) break; - Curl_pgrsTime(data, TIMER_STARTSINGLE); + *nowp = Curl_pgrsTime(data, TIMER_STARTSINGLE); if(data->set.timeout) Curl_expire(data, data->set.timeout, EXPIRE_TIMEOUT); @@ -2080,7 +2219,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, if(Curl_pgrsUpdate(data->conn)) result = CURLE_ABORTED_BY_CALLBACK; else - result = Curl_speedcheck(data, now); + result = Curl_speedcheck(data, *nowp); if(!result) { send_timeout_ms = 0; @@ -2090,7 +2229,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, data->progress.ul_limit_size, data->set.max_send_speed, data->progress.ul_limit_start, - now); + *nowp); recv_timeout_ms = 0; if(data->set.max_recv_speed > 0) @@ -2099,11 +2238,11 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, data->progress.dl_limit_size, data->set.max_recv_speed, data->progress.dl_limit_start, - now); + *nowp); if(!send_timeout_ms && !recv_timeout_ms) { multistate(data, CURLM_STATE_PERFORM); - Curl_ratelimit(data, now); + Curl_ratelimit(data, *nowp); } else if(send_timeout_ms >= recv_timeout_ms) Curl_expire(data, send_timeout_ms, EXPIRE_TOOFAST); @@ -2125,7 +2264,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, data->progress.ul_limit_size, data->set.max_send_speed, data->progress.ul_limit_start, - now); + *nowp); /* check if over recv speed */ recv_timeout_ms = 0; @@ -2134,10 +2273,10 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, data->progress.dl_limit_size, data->set.max_recv_speed, data->progress.dl_limit_start, - now); + *nowp); if(send_timeout_ms || recv_timeout_ms) { - Curl_ratelimit(data, now); + Curl_ratelimit(data, *nowp); multistate(data, CURLM_STATE_TOOFAST); if(send_timeout_ms >= recv_timeout_ms) Curl_expire(data, send_timeout_ms, EXPIRE_TOOFAST); @@ -2417,7 +2556,7 @@ CURLMcode curl_multi_perform(struct Curl_multi *multi, int *running_handles) SIGPIPE_VARIABLE(pipe_st); sigpipe_ignore(data, &pipe_st); - result = multi_runsingle(multi, now, data); + result = multi_runsingle(multi, &now, data); sigpipe_restore(&pipe_st); if(result) @@ -2500,9 +2639,13 @@ CURLMcode curl_multi_cleanup(struct Curl_multi *multi) Curl_hash_destroy(&multi->hostcache); Curl_psl_destroy(&multi->psl); +#ifdef USE_WINSOCK + WSACloseEvent(multi->wsa_event); +#else #ifdef ENABLE_WAKEUP sclose(multi->wakeup_pair[0]); sclose(multi->wakeup_pair[1]); +#endif #endif free(multi); @@ -2531,7 +2674,7 @@ CURLMsg *curl_multi_info_read(struct Curl_multi *multi, int *msgs_in_queue) !multi->in_callback && Curl_llist_count(&multi->msglist)) { /* there is one or more messages in the list */ - struct curl_llist_element *e; + struct Curl_llist_element *e; /* extract the head of the list to return */ e = multi->msglist.head; @@ -2761,15 +2904,15 @@ static CURLMcode add_next_timeout(struct curltime now, struct Curl_easy *d) { struct curltime *tv = &d->state.expiretime; - struct curl_llist *list = &d->state.timeoutlist; - struct curl_llist_element *e; + struct Curl_llist *list = &d->state.timeoutlist; + struct Curl_llist_element *e; struct time_node *node = NULL; /* move over the timeout list for this specific handle and remove all timeouts that are now passed tense and store the next pending timeout in *tv */ for(e = list->head; e;) { - struct curl_llist_element *n = e->next; + struct Curl_llist_element *n = e->next; timediff_t diff; node = (struct time_node *)e->ptr; diff = Curl_timediff(node->time, now); @@ -2839,8 +2982,8 @@ static CURLMcode multi_socket(struct Curl_multi *multi, and just move on. */ ; else { - struct curl_hash_iterator iter; - struct curl_hash_element *he; + struct Curl_hash_iterator iter; + struct Curl_hash_element *he; /* the socket can be shared by many transfers, iterate */ Curl_hash_start_iterate(&entry->transfers, &iter); @@ -2887,7 +3030,7 @@ static CURLMcode multi_socket(struct Curl_multi *multi, SIGPIPE_VARIABLE(pipe_st); sigpipe_ignore(data, &pipe_st); - result = multi_runsingle(multi, now, data); + result = multi_runsingle(multi, &now, data); sigpipe_restore(&pipe_st); if(CURLM_OK >= result) { @@ -3123,8 +3266,8 @@ void Curl_update_timer(struct Curl_multi *multi) static void multi_deltimeout(struct Curl_easy *data, expire_id eid) { - struct curl_llist_element *e; - struct curl_llist *timeoutlist = &data->state.timeoutlist; + struct Curl_llist_element *e; + struct Curl_llist *timeoutlist = &data->state.timeoutlist; /* find and remove the specific node from the list */ for(e = timeoutlist->head; e; e = e->next) { struct time_node *n = (struct time_node *)e->ptr; @@ -3147,11 +3290,11 @@ multi_addtimeout(struct Curl_easy *data, struct curltime *stamp, expire_id eid) { - struct curl_llist_element *e; + struct Curl_llist_element *e; struct time_node *node; - struct curl_llist_element *prev = NULL; + struct Curl_llist_element *prev = NULL; size_t n; - struct curl_llist *timeoutlist = &data->state.timeoutlist; + struct Curl_llist *timeoutlist = &data->state.timeoutlist; node = &data->state.expires[eid]; @@ -3278,7 +3421,7 @@ void Curl_expire_clear(struct Curl_easy *data) if(nowp->tv_sec || nowp->tv_usec) { /* Since this is an cleared time, we must remove the previous entry from the splay tree */ - struct curl_llist *list = &data->state.timeoutlist; + struct Curl_llist *list = &data->state.timeoutlist; int rc; rc = Curl_splayremovebyaddr(multi->timetree, @@ -3349,7 +3492,7 @@ void Curl_multiuse_state(struct connectdata *conn, static void process_pending_handles(struct Curl_multi *multi) { - struct curl_llist_element *e = multi->pending.head; + struct Curl_llist_element *e = multi->pending.head; if(e) { struct Curl_easy *data = e->ptr; diff --git a/libs/libcurl/src/multihandle.h b/libs/libcurl/src/multihandle.h index 9d73df0812..c70a1ce09a 100644 --- a/libs/libcurl/src/multihandle.h +++ b/libs/libcurl/src/multihandle.h @@ -27,7 +27,7 @@ #include "socketpair.h" struct Curl_message { - struct curl_llist_element list; + struct Curl_llist_element list; /* the 'CURLMsg' is the part that is visible to the external user */ struct CURLMsg extmsg; }; @@ -67,11 +67,11 @@ typedef enum { #define CURLPIPE_ANY (CURLPIPE_MULTIPLEX) -#if defined(USE_SOCKETPAIR) && !defined(USE_BLOCKING_SOCKETS) +#if defined(USE_SOCKETPAIR) && !defined(USE_BLOCKING_SOCKETS) && \ + !defined(CURL_DISABLE_SOCKETPAIR) #define ENABLE_WAKEUP #endif - /* value for MAXIMUM CONCURRENT STREAMS upper limit */ #define INITIAL_MAX_CONCURRENT_STREAMS ((1U << 31) - 1) @@ -89,9 +89,9 @@ struct Curl_multi { int num_alive; /* amount of easy handles that are added but have not yet reached COMPLETE state */ - struct curl_llist msglist; /* a list of messages from completed transfers */ + struct Curl_llist msglist; /* a list of messages from completed transfers */ - struct curl_llist pending; /* Curl_easys that are in the + struct Curl_llist pending; /* Curl_easys that are in the CURLM_STATE_CONNECT_PEND state */ /* callback function and user data pointer for the *socket() API */ @@ -103,7 +103,7 @@ struct Curl_multi { void *push_userp; /* Hostname cache */ - struct curl_hash hostcache; + struct Curl_hash hostcache; #ifdef USE_LIBPSL /* PSL cache. */ @@ -117,7 +117,7 @@ struct Curl_multi { /* 'sockhash' is the lookup hash for socket descriptor => easy handles (note the pluralis form, there can be more than one easy handle waiting on the same actual socket) */ - struct curl_hash sockhash; + struct Curl_hash sockhash; /* Shared connection cache (bundles)*/ struct conncache conn_cache; @@ -138,9 +138,13 @@ struct Curl_multi { previous callback */ unsigned int max_concurrent_streams; +#ifdef USE_WINSOCK + WSAEVENT wsa_event; /* winsock event used for waits */ +#else #ifdef ENABLE_WAKEUP curl_socket_t wakeup_pair[2]; /* socketpair() used for wakeup 0 is used for read, 1 is used for write */ +#endif #endif /* multiplexing wanted */ bool multiplexing; diff --git a/libs/libcurl/src/openldap.c b/libs/libcurl/src/openldap.c index 782d6a08e7..2aff4f6037 100644 --- a/libs/libcurl/src/openldap.c +++ b/libs/libcurl/src/openldap.c @@ -107,6 +107,7 @@ const struct Curl_handler Curl_handler_ldap = { ZERO_NULL, /* connection_check */ PORT_LDAP, /* defport */ CURLPROTO_LDAP, /* protocol */ + CURLPROTO_LDAP, /* family */ PROTOPT_NONE /* flags */ }; @@ -132,7 +133,8 @@ const struct Curl_handler Curl_handler_ldaps = { ZERO_NULL, /* readwrite */ ZERO_NULL, /* connection_check */ PORT_LDAPS, /* defport */ - CURLPROTO_LDAP, /* protocol */ + CURLPROTO_LDAPS, /* protocol */ + CURLPROTO_LDAP, /* family */ PROTOPT_SSL /* flags */ }; #endif diff --git a/libs/libcurl/src/parsedate.c b/libs/libcurl/src/parsedate.c index 4c7a40c4c5..dd6150b44e 100644 --- a/libs/libcurl/src/parsedate.c +++ b/libs/libcurl/src/parsedate.c @@ -275,48 +275,21 @@ enum assume { DATE_TIME }; -/* this is a clone of 'struct tm' but with all fields we don't need or use - cut out */ -struct my_tm { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; /* full year */ -}; - -/* struct tm to time since epoch in GMT time zone. - * This is similar to the standard mktime function but for GMT only, and - * doesn't suffer from the various bugs and portability problems that - * some systems' implementations have. - * - * Returns 0 on success, otherwise non-zero. +/* + * time2epoch: time stamp to seconds since epoch in GMT time zone. Similar to + * mktime but for GMT only. */ -static void my_timegm(struct my_tm *tm, time_t *t) +static time_t time2epoch(int sec, int min, int hour, + int mday, int mon, int year) { static const int month_days_cumulative [12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; - int month, year, leap_days; - - year = tm->tm_year; - month = tm->tm_mon; - if(month < 0) { - year += (11 - month) / 12; - month = 11 - (11 - month) % 12; - } - else if(month >= 12) { - year -= month / 12; - month = month % 12; - } - - leap_days = year - (tm->tm_mon <= 1); + int leap_days = year - (mon <= 1); leap_days = ((leap_days / 4) - (leap_days / 100) + (leap_days / 400) - (1969 / 4) + (1969 / 100) - (1969 / 400)); - - *t = ((((time_t) (year - 1970) * 365 - + leap_days + month_days_cumulative[month] + tm->tm_mday - 1) * 24 - + tm->tm_hour) * 60 + tm->tm_min) * 60 + tm->tm_sec; + return ((((time_t) (year - 1970) * 365 + + leap_days + month_days_cumulative[mon] + mday - 1) * 24 + + hour) * 60 + min) * 60 + sec; } /* @@ -341,7 +314,6 @@ static int parsedate(const char *date, time_t *output) int secnum = -1; int yearnum = -1; int tzoff = -1; - struct my_tm tm; enum assume dignext = DATE_MDAY; const char *indate = date; /* save the original pointer */ int part = 0; /* max 6 parts */ @@ -533,18 +505,11 @@ static int parsedate(const char *date, time_t *output) (hournum > 23) || (minnum > 59) || (secnum > 60)) return PARSEDATE_FAIL; /* clearly an illegal date */ - tm.tm_sec = secnum; - tm.tm_min = minnum; - tm.tm_hour = hournum; - tm.tm_mday = mdaynum; - tm.tm_mon = monnum; - tm.tm_year = yearnum; - - /* my_timegm() returns a time_t. time_t is often 32 bits, sometimes even on + /* time2epoch() returns a time_t. time_t is often 32 bits, sometimes even on architectures that feature 64 bit 'long' but ultimately time_t is the correct data type to use. */ - my_timegm(&tm, &t); + t = time2epoch(secnum, minnum, hournum, mdaynum, monnum, yearnum); /* Add the time zone diff between local time zone and GMT. */ if(tzoff == -1) diff --git a/libs/libcurl/src/pingpong.c b/libs/libcurl/src/pingpong.c index 3143315219..5a06674ad1 100644 --- a/libs/libcurl/src/pingpong.c +++ b/libs/libcurl/src/pingpong.c @@ -146,7 +146,11 @@ void Curl_pp_init(struct pingpong *pp) pp->response = Curl_now(); /* start response time-out now! */ } - +/* setup for the coming transfer */ +void Curl_pp_setup(struct pingpong *pp) +{ + Curl_dyn_init(&pp->sendbuf, DYN_PINGPPONG_CMD); +} /*********************************************************************** * @@ -162,9 +166,8 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp, const char *fmt, va_list args) { - ssize_t bytes_written; + ssize_t bytes_written = 0; size_t write_len; - char *fmt_crlf; char *s; CURLcode result; struct connectdata *conn = pp->conn; @@ -181,48 +184,42 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp, if(!conn) /* can't send without a connection! */ return CURLE_SEND_ERROR; - data = conn->data; - fmt_crlf = aprintf("%s\r\n", fmt); /* append a trailing CRLF */ - if(!fmt_crlf) - return CURLE_OUT_OF_MEMORY; - - s = vaprintf(fmt_crlf, args); /* trailing CRLF appended */ - free(fmt_crlf); - if(!s) - return CURLE_OUT_OF_MEMORY; + Curl_dyn_reset(&pp->sendbuf); + result = Curl_dyn_vaddf(&pp->sendbuf, fmt, args); + if(result) + return result; - bytes_written = 0; - write_len = strlen(s); + /* append CRLF */ + result = Curl_dyn_addn(&pp->sendbuf, "\r\n", 2); + if(result) + return result; + write_len = Curl_dyn_len(&pp->sendbuf); + s = Curl_dyn_ptr(&pp->sendbuf); Curl_pp_init(pp); result = Curl_convert_to_network(data, s, write_len); /* Curl_convert_to_network calls failf if unsuccessful */ - if(result) { - free(s); + if(result) return result; - } #ifdef HAVE_GSSAPI conn->data_prot = PROT_CMD; #endif result = Curl_write(conn, conn->sock[FIRSTSOCKET], s, write_len, - &bytes_written); + &bytes_written); + if(result) + return result; #ifdef HAVE_GSSAPI data_sec = conn->data_prot; DEBUGASSERT(data_sec > PROT_NONE && data_sec < PROT_LAST); conn->data_prot = data_sec; #endif - if(result) { - free(s); - return result; - } - - if(conn->data->set.verbose) - Curl_debug(conn->data, CURLINFO_HEADER_OUT, s, (size_t)bytes_written); + if(data->set.verbose) + Curl_debug(data, CURLINFO_HEADER_OUT, s, (size_t)bytes_written); if(bytes_written != (ssize_t)write_len) { /* the whole chunk was not sent, keep it around and adjust sizes */ @@ -231,7 +228,6 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp, pp->sendleft = write_len - bytes_written; } else { - free(s); pp->sendthis = NULL; pp->sendleft = pp->sendsize = 0; pp->response = Curl_now(); @@ -493,7 +489,6 @@ CURLcode Curl_pp_flushsend(struct pingpong *pp) pp->sendleft -= written; } else { - free(pp->sendthis); pp->sendthis = NULL; pp->sendleft = pp->sendsize = 0; pp->response = Curl_now(); @@ -503,15 +498,15 @@ CURLcode Curl_pp_flushsend(struct pingpong *pp) CURLcode Curl_pp_disconnect(struct pingpong *pp) { - free(pp->cache); - pp->cache = NULL; + Curl_dyn_free(&pp->sendbuf); + Curl_safefree(pp->cache); return CURLE_OK; } bool Curl_pp_moredata(struct pingpong *pp) { return (!pp->sendleft && pp->cache && pp->nread_resp < pp->cache_size) ? - TRUE : FALSE; + TRUE : FALSE; } #endif diff --git a/libs/libcurl/src/pingpong.h b/libs/libcurl/src/pingpong.h index e874799d44..855815afd5 100644 --- a/libs/libcurl/src/pingpong.h +++ b/libs/libcurl/src/pingpong.h @@ -64,6 +64,7 @@ struct pingpong { milliseconds we await for a server response. */ struct connectdata *conn; /* points to the connectdata struct that this belongs to */ + struct dynbuf sendbuf; /* Function pointers the protocols MUST implement and provide for the pingpong layer to function */ @@ -86,6 +87,9 @@ CURLcode Curl_pp_statemach(struct pingpong *pp, bool block, /* initialize stuff to prepare for reading a fresh new response */ void Curl_pp_init(struct pingpong *pp); +/* setup for the transfer */ +void Curl_pp_setup(struct pingpong *pp); + /* Returns timeout in ms. 0 or negative number means the timeout has already triggered */ timediff_t Curl_pp_state_timeout(struct pingpong *pp, bool disconnecting); diff --git a/libs/libcurl/src/pop3.c b/libs/libcurl/src/pop3.c index 9ff5c78fd0..5a73545823 100644 --- a/libs/libcurl/src/pop3.c +++ b/libs/libcurl/src/pop3.c @@ -128,6 +128,7 @@ const struct Curl_handler Curl_handler_pop3 = { ZERO_NULL, /* connection_check */ PORT_POP3, /* defport */ CURLPROTO_POP3, /* protocol */ + CURLPROTO_POP3, /* family */ PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY | /* flags */ PROTOPT_URLOPTIONS }; @@ -155,6 +156,7 @@ const struct Curl_handler Curl_handler_pop3s = { ZERO_NULL, /* connection_check */ PORT_POP3S, /* defport */ CURLPROTO_POP3S, /* protocol */ + CURLPROTO_POP3, /* family */ PROTOPT_CLOSEACTION | PROTOPT_SSL | PROTOPT_NOURLQUERY | PROTOPT_URLOPTIONS /* flags */ }; @@ -1091,6 +1093,7 @@ static CURLcode pop3_connect(struct connectdata *conn, bool *done) Curl_sasl_init(&pop3c->sasl, &saslpop3); /* Initialise the pingpong layer */ + Curl_pp_setup(pp); Curl_pp_init(pp); /* Parse the URL options */ diff --git a/libs/libcurl/src/progress.c b/libs/libcurl/src/progress.c index 8951384481..eced74c9f9 100644 --- a/libs/libcurl/src/progress.c +++ b/libs/libcurl/src/progress.c @@ -164,9 +164,13 @@ void Curl_pgrsResetTransferSizes(struct Curl_easy *data) } /* + * + * Curl_pgrsTime(). Store the current time at the given label. This fetches a + * fresh "now" and returns it. + * * @unittest: 1399 */ -void Curl_pgrsTime(struct Curl_easy *data, timerid timer) +struct curltime Curl_pgrsTime(struct Curl_easy *data, timerid timer) { struct curltime now = Curl_now(); timediff_t *delta = NULL; @@ -209,7 +213,7 @@ void Curl_pgrsTime(struct Curl_easy *data, timerid timer) * changing the t_starttransfer time. */ if(data->progress.is_t_startransfer_set) { - return; + return now; } else { data->progress.is_t_startransfer_set = true; @@ -228,6 +232,7 @@ void Curl_pgrsTime(struct Curl_easy *data, timerid timer) us = 1; /* make sure at least one microsecond passed */ *delta += us; } + return now; } void Curl_pgrsStartNow(struct Curl_easy *data) diff --git a/libs/libcurl/src/progress.h b/libs/libcurl/src/progress.h index 3515ac6d5c..c19d966d31 100644 --- a/libs/libcurl/src/progress.h +++ b/libs/libcurl/src/progress.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2018, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2020, 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 @@ -49,7 +49,7 @@ void Curl_pgrsSetUploadCounter(struct Curl_easy *data, curl_off_t size); void Curl_ratelimit(struct Curl_easy *data, struct curltime now); int Curl_pgrsUpdate(struct connectdata *); void Curl_pgrsResetTransferSizes(struct Curl_easy *data); -void Curl_pgrsTime(struct Curl_easy *data, timerid timer); +struct curltime Curl_pgrsTime(struct Curl_easy *data, timerid timer); timediff_t Curl_pgrsLimitWaitTime(curl_off_t cursize, curl_off_t startsize, curl_off_t limit, diff --git a/libs/libcurl/src/rtsp.c b/libs/libcurl/src/rtsp.c index dbd7dc6a6d..46c3c4f8f4 100644 --- a/libs/libcurl/src/rtsp.c +++ b/libs/libcurl/src/rtsp.c @@ -106,6 +106,7 @@ const struct Curl_handler Curl_handler_rtsp = { rtsp_conncheck, /* connection_check */ PORT_RTSP, /* defport */ CURLPROTO_RTSP, /* protocol */ + CURLPROTO_RTSP, /* family */ PROTOPT_NONE /* flags */ }; diff --git a/libs/libcurl/src/security.c b/libs/libcurl/src/security.c deleted file mode 100644 index fbfa707413..0000000000 --- a/libs/libcurl/src/security.c +++ /dev/null @@ -1,579 +0,0 @@ -/* This source code was modified by Martin Hedenfalk for - * use in Curl. His latest changes were done 2000-09-18. - * - * It has since been patched and modified a lot by Daniel Stenberg - * to make it better applied to curl conditions, and to make - * it not use globals, pollute name space and more. This source code awaits a - * rewrite to work around the paragraph 2 in the BSD licenses as explained - * below. - * - * Copyright (c) 1998, 1999, 2017 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * - * Copyright (C) 2001 - 2019, Daniel Stenberg, , et al. - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. */ - -#include "curl_setup.h" - -#ifndef CURL_DISABLE_FTP -#ifdef HAVE_GSSAPI - -#ifdef HAVE_NETDB_H -#include -#endif - -#include - -#include "urldata.h" -#include "curl_base64.h" -#include "curl_memory.h" -#include "curl_sec.h" -#include "ftp.h" -#include "sendf.h" -#include "strcase.h" -#include "warnless.h" -#include "strdup.h" -/* The last 3 #include files should be in this order */ -#include "curl_printf.h" -#include "curl_memory.h" -#include "memdebug.h" - -static const struct { - enum protection_level level; - const char *name; -} level_names[] = { - { PROT_CLEAR, "clear" }, - { PROT_SAFE, "safe" }, - { PROT_CONFIDENTIAL, "confidential" }, - { PROT_PRIVATE, "private" } -}; - -static enum protection_level -name_to_level(const char *name) -{ - int i; - for(i = 0; i < (int)sizeof(level_names)/(int)sizeof(level_names[0]); i++) - if(checkprefix(name, level_names[i].name)) - return level_names[i].level; - return PROT_NONE; -} - -/* Convert a protocol |level| to its char representation. - We take an int to catch programming mistakes. */ -static char level_to_char(int level) -{ - switch(level) { - case PROT_CLEAR: - return 'C'; - case PROT_SAFE: - return 'S'; - case PROT_CONFIDENTIAL: - return 'E'; - case PROT_PRIVATE: - return 'P'; - case PROT_CMD: - /* Fall through */ - default: - /* Those 2 cases should not be reached! */ - break; - } - DEBUGASSERT(0); - /* Default to the most secure alternative. */ - return 'P'; -} - -/* Send an FTP command defined by |message| and the optional arguments. The - function returns the ftp_code. If an error occurs, -1 is returned. */ -static int ftp_send_command(struct connectdata *conn, const char *message, ...) -{ - int ftp_code; - ssize_t nread = 0; - va_list args; - char print_buffer[50]; - - va_start(args, message); - mvsnprintf(print_buffer, sizeof(print_buffer), message, args); - va_end(args); - - if(Curl_ftpsend(conn, print_buffer)) { - ftp_code = -1; - } - else { - if(Curl_GetFTPResponse(&nread, conn, &ftp_code)) - ftp_code = -1; - } - - (void)nread; /* Unused */ - return ftp_code; -} - -/* Read |len| from the socket |fd| and store it in |to|. Return a CURLcode - saying whether an error occurred or CURLE_OK if |len| was read. */ -static CURLcode -socket_read(curl_socket_t fd, void *to, size_t len) -{ - char *to_p = to; - CURLcode result; - ssize_t nread = 0; - - while(len > 0) { - result = Curl_read_plain(fd, to_p, len, &nread); - if(!result) { - len -= nread; - to_p += nread; - } - else { - if(result == CURLE_AGAIN) - continue; - return result; - } - } - return CURLE_OK; -} - - -/* Write |len| bytes from the buffer |to| to the socket |fd|. Return a - CURLcode saying whether an error occurred or CURLE_OK if |len| was - written. */ -static CURLcode -socket_write(struct connectdata *conn, curl_socket_t fd, const void *to, - size_t len) -{ - const char *to_p = to; - CURLcode result; - ssize_t written; - - while(len > 0) { - result = Curl_write_plain(conn, fd, to_p, len, &written); - if(!result) { - len -= written; - to_p += written; - } - else { - if(result == CURLE_AGAIN) - continue; - return result; - } - } - return CURLE_OK; -} - -static CURLcode read_data(struct connectdata *conn, - curl_socket_t fd, - struct krb5buffer *buf) -{ - int len; - CURLcode result; - - result = socket_read(fd, &len, sizeof(len)); - if(result) - return result; - - if(len) { - /* only realloc if there was a length */ - len = ntohl(len); - buf->data = Curl_saferealloc(buf->data, len); - } - if(!len || !buf->data) - return CURLE_OUT_OF_MEMORY; - - result = socket_read(fd, buf->data, len); - if(result) - return result; - buf->size = conn->mech->decode(conn->app_data, buf->data, len, - conn->data_prot, conn); - buf->index = 0; - return CURLE_OK; -} - -static size_t -buffer_read(struct krb5buffer *buf, void *data, size_t len) -{ - if(buf->size - buf->index < len) - len = buf->size - buf->index; - memcpy(data, (char *)buf->data + buf->index, len); - buf->index += len; - return len; -} - -/* Matches Curl_recv signature */ -static ssize_t sec_recv(struct connectdata *conn, int sockindex, - char *buffer, size_t len, CURLcode *err) -{ - size_t bytes_read; - size_t total_read = 0; - curl_socket_t fd = conn->sock[sockindex]; - - *err = CURLE_OK; - - /* Handle clear text response. */ - if(conn->sec_complete == 0 || conn->data_prot == PROT_CLEAR) - return sread(fd, buffer, len); - - if(conn->in_buffer.eof_flag) { - conn->in_buffer.eof_flag = 0; - return 0; - } - - bytes_read = buffer_read(&conn->in_buffer, buffer, len); - len -= bytes_read; - total_read += bytes_read; - buffer += bytes_read; - - while(len > 0) { - if(read_data(conn, fd, &conn->in_buffer)) - return -1; - if(conn->in_buffer.size == 0) { - if(bytes_read > 0) - conn->in_buffer.eof_flag = 1; - return bytes_read; - } - bytes_read = buffer_read(&conn->in_buffer, buffer, len); - len -= bytes_read; - total_read += bytes_read; - buffer += bytes_read; - } - return total_read; -} - -/* Send |length| bytes from |from| to the |fd| socket taking care of encoding - and negotiating with the server. |from| can be NULL. */ -static void do_sec_send(struct connectdata *conn, curl_socket_t fd, - const char *from, int length) -{ - int bytes, htonl_bytes; /* 32-bit integers for htonl */ - char *buffer = NULL; - char *cmd_buffer; - size_t cmd_size = 0; - CURLcode error; - enum protection_level prot_level = conn->data_prot; - bool iscmd = (prot_level == PROT_CMD)?TRUE:FALSE; - - DEBUGASSERT(prot_level > PROT_NONE && prot_level < PROT_LAST); - - if(iscmd) { - if(!strncmp(from, "PASS ", 5) || !strncmp(from, "ACCT ", 5)) - prot_level = PROT_PRIVATE; - else - prot_level = conn->command_prot; - } - bytes = conn->mech->encode(conn->app_data, from, length, prot_level, - (void **)&buffer); - if(!buffer || bytes <= 0) - return; /* error */ - - if(iscmd) { - error = Curl_base64_encode(conn->data, buffer, curlx_sitouz(bytes), - &cmd_buffer, &cmd_size); - if(error) { - free(buffer); - return; /* error */ - } - if(cmd_size > 0) { - static const char *enc = "ENC "; - static const char *mic = "MIC "; - if(prot_level == PROT_PRIVATE) - socket_write(conn, fd, enc, 4); - else - socket_write(conn, fd, mic, 4); - - socket_write(conn, fd, cmd_buffer, cmd_size); - socket_write(conn, fd, "\r\n", 2); - infof(conn->data, "Send: %s%s\n", prot_level == PROT_PRIVATE?enc:mic, - cmd_buffer); - free(cmd_buffer); - } - } - else { - htonl_bytes = htonl(bytes); - socket_write(conn, fd, &htonl_bytes, sizeof(htonl_bytes)); - socket_write(conn, fd, buffer, curlx_sitouz(bytes)); - } - free(buffer); -} - -static ssize_t sec_write(struct connectdata *conn, curl_socket_t fd, - const char *buffer, size_t length) -{ - ssize_t tx = 0, len = conn->buffer_size; - - len -= conn->mech->overhead(conn->app_data, conn->data_prot, - curlx_sztosi(len)); - if(len <= 0) - len = length; - while(length) { - if(length < (size_t)len) - len = length; - - do_sec_send(conn, fd, buffer, curlx_sztosi(len)); - length -= len; - buffer += len; - tx += len; - } - return tx; -} - -/* Matches Curl_send signature */ -static ssize_t sec_send(struct connectdata *conn, int sockindex, - const void *buffer, size_t len, CURLcode *err) -{ - curl_socket_t fd = conn->sock[sockindex]; - *err = CURLE_OK; - return sec_write(conn, fd, buffer, len); -} - -int Curl_sec_read_msg(struct connectdata *conn, char *buffer, - enum protection_level level) -{ - /* decoded_len should be size_t or ssize_t but conn->mech->decode returns an - int */ - int decoded_len; - char *buf; - int ret_code = 0; - size_t decoded_sz = 0; - CURLcode error; - - if(!conn->mech) - /* not inititalized, return error */ - return -1; - - DEBUGASSERT(level > PROT_NONE && level < PROT_LAST); - - error = Curl_base64_decode(buffer + 4, (unsigned char **)&buf, &decoded_sz); - if(error || decoded_sz == 0) - return -1; - - if(decoded_sz > (size_t)INT_MAX) { - free(buf); - return -1; - } - decoded_len = curlx_uztosi(decoded_sz); - - decoded_len = conn->mech->decode(conn->app_data, buf, decoded_len, - level, conn); - if(decoded_len <= 0) { - free(buf); - return -1; - } - - if(conn->data->set.verbose) { - buf[decoded_len] = '\n'; - Curl_debug(conn->data, CURLINFO_HEADER_IN, buf, decoded_len + 1); - } - - buf[decoded_len] = '\0'; - if(decoded_len <= 3) - /* suspiciously short */ - return 0; - - if(buf[3] != '-') - /* safe to ignore return code */ - (void)sscanf(buf, "%d", &ret_code); - - if(buf[decoded_len - 1] == '\n') - buf[decoded_len - 1] = '\0'; - strcpy(buffer, buf); - free(buf); - return ret_code; -} - -static int sec_set_protection_level(struct connectdata *conn) -{ - int code; - enum protection_level level = conn->request_data_prot; - - DEBUGASSERT(level > PROT_NONE && level < PROT_LAST); - - if(!conn->sec_complete) { - infof(conn->data, "Trying to change the protection level after the" - " completion of the data exchange.\n"); - return -1; - } - - /* Bail out if we try to set up the same level */ - if(conn->data_prot == level) - return 0; - - if(level) { - char *pbsz; - static unsigned int buffer_size = 1 << 20; /* 1048576 */ - - code = ftp_send_command(conn, "PBSZ %u", buffer_size); - if(code < 0) - return -1; - - if(code/100 != 2) { - failf(conn->data, "Failed to set the protection's buffer size."); - return -1; - } - conn->buffer_size = buffer_size; - - pbsz = strstr(conn->data->state.buffer, "PBSZ="); - if(pbsz) { - /* ignore return code, use default value if it fails */ - (void)sscanf(pbsz, "PBSZ=%u", &buffer_size); - if(buffer_size < conn->buffer_size) - conn->buffer_size = buffer_size; - } - } - - /* Now try to negiociate the protection level. */ - code = ftp_send_command(conn, "PROT %c", level_to_char(level)); - - if(code < 0) - return -1; - - if(code/100 != 2) { - failf(conn->data, "Failed to set the protection level."); - return -1; - } - - conn->data_prot = level; - if(level == PROT_PRIVATE) - conn->command_prot = level; - - return 0; -} - -int -Curl_sec_request_prot(struct connectdata *conn, const char *level) -{ - enum protection_level l = name_to_level(level); - if(l == PROT_NONE) - return -1; - DEBUGASSERT(l > PROT_NONE && l < PROT_LAST); - conn->request_data_prot = l; - return 0; -} - -static CURLcode choose_mech(struct connectdata *conn) -{ - int ret; - struct Curl_easy *data = conn->data; - void *tmp_allocation; - const struct Curl_sec_client_mech *mech = &Curl_krb5_client_mech; - - tmp_allocation = realloc(conn->app_data, mech->size); - if(tmp_allocation == NULL) { - failf(data, "Failed realloc of size %zu", mech->size); - mech = NULL; - return CURLE_OUT_OF_MEMORY; - } - conn->app_data = tmp_allocation; - - if(mech->init) { - ret = mech->init(conn->app_data); - if(ret) { - infof(data, "Failed initialization for %s. Skipping it.\n", - mech->name); - return CURLE_FAILED_INIT; - } - } - - infof(data, "Trying mechanism %s...\n", mech->name); - ret = ftp_send_command(conn, "AUTH %s", mech->name); - if(ret < 0) - return CURLE_COULDNT_CONNECT; - - if(ret/100 != 3) { - switch(ret) { - case 504: - infof(data, "Mechanism %s is not supported by the server (server " - "returned ftp code: 504).\n", mech->name); - break; - case 534: - infof(data, "Mechanism %s was rejected by the server (server returned " - "ftp code: 534).\n", mech->name); - break; - default: - if(ret/100 == 5) { - infof(data, "server does not support the security extensions\n"); - return CURLE_USE_SSL_FAILED; - } - break; - } - return CURLE_LOGIN_DENIED; - } - - /* Authenticate */ - ret = mech->auth(conn->app_data, conn); - - if(ret != AUTH_CONTINUE) { - if(ret != AUTH_OK) { - /* Mechanism has dumped the error to stderr, don't error here. */ - return -1; - } - DEBUGASSERT(ret == AUTH_OK); - - conn->mech = mech; - conn->sec_complete = 1; - conn->recv[FIRSTSOCKET] = sec_recv; - conn->send[FIRSTSOCKET] = sec_send; - conn->recv[SECONDARYSOCKET] = sec_recv; - conn->send[SECONDARYSOCKET] = sec_send; - conn->command_prot = PROT_SAFE; - /* Set the requested protection level */ - /* BLOCKING */ - (void)sec_set_protection_level(conn); - } - - return CURLE_OK; -} - -CURLcode -Curl_sec_login(struct connectdata *conn) -{ - return choose_mech(conn); -} - - -void -Curl_sec_end(struct connectdata *conn) -{ - if(conn->mech != NULL && conn->mech->end) - conn->mech->end(conn->app_data); - free(conn->app_data); - conn->app_data = NULL; - if(conn->in_buffer.data) { - free(conn->in_buffer.data); - conn->in_buffer.data = NULL; - conn->in_buffer.size = 0; - conn->in_buffer.index = 0; - conn->in_buffer.eof_flag = 0; - } - conn->sec_complete = 0; - conn->data_prot = PROT_CLEAR; - conn->mech = NULL; -} - -#endif /* HAVE_GSSAPI */ - -#endif /* CURL_DISABLE_FTP */ diff --git a/libs/libcurl/src/select.c b/libs/libcurl/src/select.c index abb124ae8f..917133b72b 100644 --- a/libs/libcurl/src/select.c +++ b/libs/libcurl/src/select.c @@ -149,15 +149,14 @@ int Curl_select(curl_socket_t maxfd, /* highest socket number */ { struct timeval pending_tv; struct timeval *ptimeout; - int r; #ifdef USE_WINSOCK /* WinSock select() can't handle zero events. See the comment below. */ if((!fds_read || fds_read->fd_count == 0) && (!fds_write || fds_write->fd_count == 0) && (!fds_err || fds_err->fd_count == 0)) { - r = Curl_wait_ms(timeout_ms); - return r; + /* no sockets, just wait */ + return Curl_wait_ms(timeout_ms); } #endif @@ -209,17 +208,16 @@ int Curl_select(curl_socket_t maxfd, /* highest socket number */ descriptor set must contain at least one handle to a socket. It is unclear why WinSock doesn't just handle this for us instead of - calling this an error. + calling this an error. Luckily, with WinSock, we can _also_ ask how + many bits are set on an fd_set. So, let's just check it beforehand. */ - r = select((int)maxfd + 1, - fds_read && fds_read->fd_count ? fds_read : NULL, - fds_write && fds_write->fd_count ? fds_write : NULL, - fds_err && fds_err->fd_count ? fds_err : NULL, ptimeout); + return select((int)maxfd + 1, + fds_read && fds_read->fd_count ? fds_read : NULL, + fds_write && fds_write->fd_count ? fds_write : NULL, + fds_err && fds_err->fd_count ? fds_err : NULL, ptimeout); #else - r = select((int)maxfd + 1, fds_read, fds_write, fds_err, ptimeout); + return select((int)maxfd + 1, fds_read, fds_write, fds_err, ptimeout); #endif - - return r; } /* @@ -247,23 +245,14 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */ curl_socket_t writefd, /* socket to write to */ timediff_t timeout_ms) /* milliseconds to wait */ { -#ifdef HAVE_POLL_FINE struct pollfd pfd[3]; int num; -#else - fd_set fds_read; - fd_set fds_write; - fd_set fds_err; - curl_socket_t maxfd; -#endif int r; - int ret; if((readfd0 == CURL_SOCKET_BAD) && (readfd1 == CURL_SOCKET_BAD) && (writefd == CURL_SOCKET_BAD)) { /* no sockets, just wait */ - r = Curl_wait_ms(timeout_ms); - return r; + return Curl_wait_ms(timeout_ms); } /* Avoid initial timestamp, avoid Curl_now() call, when elapsed @@ -271,8 +260,6 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */ when function is called with a zero timeout or a negative timeout value indicating a blocking call should be performed. */ -#ifdef HAVE_POLL_FINE - num = 0; if(readfd0 != CURL_SOCKET_BAD) { pfd[num].fd = readfd0; @@ -288,7 +275,7 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */ } if(writefd != CURL_SOCKET_BAD) { pfd[num].fd = writefd; - pfd[num].events = POLLWRNORM|POLLOUT; + pfd[num].events = POLLWRNORM|POLLOUT|POLLPRI; pfd[num].revents = 0; num++; } @@ -297,101 +284,30 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */ if(r <= 0) return r; - ret = 0; + r = 0; num = 0; if(readfd0 != CURL_SOCKET_BAD) { if(pfd[num].revents & (POLLRDNORM|POLLIN|POLLERR|POLLHUP)) - ret |= CURL_CSELECT_IN; + r |= CURL_CSELECT_IN; if(pfd[num].revents & (POLLRDBAND|POLLPRI|POLLNVAL)) - ret |= CURL_CSELECT_ERR; + r |= CURL_CSELECT_ERR; num++; } if(readfd1 != CURL_SOCKET_BAD) { if(pfd[num].revents & (POLLRDNORM|POLLIN|POLLERR|POLLHUP)) - ret |= CURL_CSELECT_IN2; + r |= CURL_CSELECT_IN2; if(pfd[num].revents & (POLLRDBAND|POLLPRI|POLLNVAL)) - ret |= CURL_CSELECT_ERR; + r |= CURL_CSELECT_ERR; num++; } if(writefd != CURL_SOCKET_BAD) { if(pfd[num].revents & (POLLWRNORM|POLLOUT)) - ret |= CURL_CSELECT_OUT; - if(pfd[num].revents & (POLLERR|POLLHUP|POLLNVAL)) - ret |= CURL_CSELECT_ERR; - } - - return ret; - -#else /* HAVE_POLL_FINE */ - - FD_ZERO(&fds_err); - maxfd = (curl_socket_t)-1; - - FD_ZERO(&fds_read); - if(readfd0 != CURL_SOCKET_BAD) { - VERIFY_SOCK(readfd0); - FD_SET(readfd0, &fds_read); - FD_SET(readfd0, &fds_err); - maxfd = readfd0; - } - if(readfd1 != CURL_SOCKET_BAD) { - VERIFY_SOCK(readfd1); - FD_SET(readfd1, &fds_read); - FD_SET(readfd1, &fds_err); - if(readfd1 > maxfd) - maxfd = readfd1; - } - - FD_ZERO(&fds_write); - if(writefd != CURL_SOCKET_BAD) { - VERIFY_SOCK(writefd); - FD_SET(writefd, &fds_write); - FD_SET(writefd, &fds_err); - if(writefd > maxfd) - maxfd = writefd; - } - - /* We know that we have at least one bit set in at least two fd_sets in - this case, but we may have no bits set in either fds_read or fd_write, - so check for that and handle it. Luckily, with WinSock, we can _also_ - ask how many bits are set on an fd_set. - - Note also that WinSock ignores the first argument, so we don't worry - about the fact that maxfd is computed incorrectly with WinSock (since - curl_socket_t is unsigned in such cases and thus -1 is the largest - value). - */ - r = Curl_select(maxfd, &fds_read, &fds_write, &fds_err, timeout_ms); - - if(r < 0) - return -1; - if(r == 0) - return 0; - - ret = 0; - if(readfd0 != CURL_SOCKET_BAD) { - if(FD_ISSET(readfd0, &fds_read)) - ret |= CURL_CSELECT_IN; - if(FD_ISSET(readfd0, &fds_err)) - ret |= CURL_CSELECT_ERR; - } - if(readfd1 != CURL_SOCKET_BAD) { - if(FD_ISSET(readfd1, &fds_read)) - ret |= CURL_CSELECT_IN2; - if(FD_ISSET(readfd1, &fds_err)) - ret |= CURL_CSELECT_ERR; - } - if(writefd != CURL_SOCKET_BAD) { - if(FD_ISSET(writefd, &fds_write)) - ret |= CURL_CSELECT_OUT; - if(FD_ISSET(writefd, &fds_err)) - ret |= CURL_CSELECT_ERR; + r |= CURL_CSELECT_OUT; + if(pfd[num].revents & (POLLERR|POLLHUP|POLLPRI|POLLNVAL)) + r |= CURL_CSELECT_ERR; } - return ret; - -#endif /* HAVE_POLL_FINE */ - + return r; } /* @@ -431,8 +347,7 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, timediff_t timeout_ms) } if(fds_none) { /* no sockets, just wait */ - r = Curl_wait_ms(timeout_ms); - return r; + return Curl_wait_ms(timeout_ms); } /* Avoid initial timestamp, avoid Curl_now() call, when elapsed @@ -454,11 +369,8 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, timediff_t timeout_ms) else pending_ms = 0; r = poll(ufds, nfds, pending_ms); - - if(r < 0) - return -1; - if(r == 0) - return 0; + if(r <= 0) + return r; for(i = 0; i < nfds; i++) { if(ufds[i].fd == CURL_SOCKET_BAD) @@ -466,7 +378,7 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, timediff_t timeout_ms) if(ufds[i].revents & POLLHUP) ufds[i].revents |= POLLIN; if(ufds[i].revents & POLLERR) - ufds[i].revents |= (POLLIN|POLLOUT); + ufds[i].revents |= POLLIN|POLLOUT; } #else /* HAVE_POLL_FINE */ @@ -482,7 +394,7 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, timediff_t timeout_ms) continue; VERIFY_SOCK(ufds[i].fd); if(ufds[i].events & (POLLIN|POLLOUT|POLLPRI| - POLLRDNORM|POLLWRNORM|POLLRDBAND)) { + POLLRDNORM|POLLWRNORM|POLLRDBAND)) { if(ufds[i].fd > maxfd) maxfd = ufds[i].fd; if(ufds[i].events & (POLLRDNORM|POLLIN)) @@ -494,24 +406,39 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, timediff_t timeout_ms) } } + /* + Note also that WinSock ignores the first argument, so we don't worry + about the fact that maxfd is computed incorrectly with WinSock (since + curl_socket_t is unsigned in such cases and thus -1 is the largest + value). + */ r = Curl_select(maxfd, &fds_read, &fds_write, &fds_err, timeout_ms); - - if(r < 0) - return -1; - if(r == 0) - return 0; + if(r <= 0) + return r; r = 0; for(i = 0; i < nfds; i++) { ufds[i].revents = 0; if(ufds[i].fd == CURL_SOCKET_BAD) continue; - if(FD_ISSET(ufds[i].fd, &fds_read)) - ufds[i].revents |= POLLIN; - if(FD_ISSET(ufds[i].fd, &fds_write)) - ufds[i].revents |= POLLOUT; - if(FD_ISSET(ufds[i].fd, &fds_err)) - ufds[i].revents |= POLLPRI; + if(FD_ISSET(ufds[i].fd, &fds_read)) { + if(ufds[i].events & POLLRDNORM) + ufds[i].revents |= POLLRDNORM; + if(ufds[i].events & POLLIN) + ufds[i].revents |= POLLIN; + } + if(FD_ISSET(ufds[i].fd, &fds_write)) { + if(ufds[i].events & POLLWRNORM) + ufds[i].revents |= POLLWRNORM; + if(ufds[i].events & POLLOUT) + ufds[i].revents |= POLLOUT; + } + if(FD_ISSET(ufds[i].fd, &fds_err)) { + if(ufds[i].events & POLLRDBAND) + ufds[i].revents |= POLLRDBAND; + if(ufds[i].events & POLLPRI) + ufds[i].revents |= POLLPRI; + } if(ufds[i].revents != 0) r++; } diff --git a/libs/libcurl/src/select.h b/libs/libcurl/src/select.h index 95181f467e..c9cc5c2e81 100644 --- a/libs/libcurl/src/select.h +++ b/libs/libcurl/src/select.h @@ -94,12 +94,23 @@ int tpf_select_libcurl(int maxfds, fd_set* reads, fd_set* writes, fd_set* excepts, struct timeval *tv); #endif -/* Winsock and TPF sockets are not in range [0..FD_SETSIZE-1], which +/* TPF sockets are not in range [0..FD_SETSIZE-1], which unfortunately makes it impossible for us to easily check if they're valid + + With Winsock the valid range is [0..INVALID_SOCKET-1] according to + https://docs.microsoft.com/en-us/windows/win32/winsock/socket-data-type-2 */ -#if defined(USE_WINSOCK) || defined(TPF) +#if defined(TPF) #define VALID_SOCK(x) 1 #define VERIFY_SOCK(x) Curl_nop_stmt +#elif defined(USE_WINSOCK) +#define VALID_SOCK(s) ((s) < INVALID_SOCKET) +#define VERIFY_SOCK(x) do { \ + if(!VALID_SOCK(x)) { \ + SET_SOCKERRNO(WSAEINVAL); \ + return -1; \ + } \ +} while(0) #else #define VALID_SOCK(s) (((s) >= 0) && ((s) < FD_SETSIZE)) #define VERIFY_SOCK(x) do { \ diff --git a/libs/libcurl/src/sendf.c b/libs/libcurl/src/sendf.c index 6943fa84e0..6cfc89b694 100644 --- a/libs/libcurl/src/sendf.c +++ b/libs/libcurl/src/sendf.c @@ -140,7 +140,7 @@ bool Curl_recv_has_postponed_data(struct connectdata *conn, int sockindex) psnd->recv_size > psnd->recv_processed; } -static void pre_receive_plain(struct connectdata *conn, int num) +static CURLcode pre_receive_plain(struct connectdata *conn, int num) { const curl_socket_t sockfd = conn->sock[num]; struct postponed_data * const psnd = &(conn->postponed[num]); @@ -161,6 +161,8 @@ static void pre_receive_plain(struct connectdata *conn, int num) /* Use buffer double default size for intermediate buffer */ psnd->allocated_size = 2 * conn->data->set.buffer_size; psnd->buffer = malloc(psnd->allocated_size); + if(!psnd->buffer) + return CURLE_OUT_OF_MEMORY; psnd->recv_size = 0; psnd->recv_processed = 0; #ifdef DEBUGBUILD @@ -180,6 +182,7 @@ static void pre_receive_plain(struct connectdata *conn, int num) psnd->allocated_size = 0; } } + return CURLE_OK; } static ssize_t get_pre_recved(struct connectdata *conn, int num, char *buf, @@ -225,7 +228,7 @@ bool Curl_recv_has_postponed_data(struct connectdata *conn, int sockindex) (void)sockindex; return false; } -#define pre_receive_plain(c,n) do {} while(0) +#define pre_receive_plain(c,n) CURLE_OK #define get_pre_recved(c,n,b,l) 0 #endif /* ! USE_RECV_BEFORE_SEND_WORKAROUND */ @@ -283,52 +286,6 @@ void Curl_failf(struct Curl_easy *data, const char *fmt, ...) } } -/* Curl_sendf() sends formatted data to the server */ -CURLcode Curl_sendf(curl_socket_t sockfd, struct connectdata *conn, - const char *fmt, ...) -{ - struct Curl_easy *data = conn->data; - ssize_t bytes_written; - size_t write_len; - CURLcode result = CURLE_OK; - char *s; - char *sptr; - va_list ap; - va_start(ap, fmt); - s = vaprintf(fmt, ap); /* returns an allocated string */ - va_end(ap); - if(!s) - return CURLE_OUT_OF_MEMORY; /* failure */ - - bytes_written = 0; - write_len = strlen(s); - sptr = s; - - for(;;) { - /* Write the buffer to the socket */ - result = Curl_write(conn, sockfd, sptr, write_len, &bytes_written); - - if(result) - break; - - if(data->set.verbose) - Curl_debug(data, CURLINFO_DATA_OUT, sptr, (size_t)bytes_written); - - if((size_t)bytes_written != write_len) { - /* if not all was written at once, we must advance the pointer, decrease - the size left and try again! */ - write_len -= bytes_written; - sptr += bytes_written; - } - else - break; - } - - free(s); /* free the output string */ - - return result; -} - /* * Curl_write() is an internal write function that sends data to the * server. Works with plain sockets, SCP, SSL or kerberos. @@ -379,7 +336,10 @@ ssize_t Curl_send_plain(struct connectdata *conn, int num, To avoid lossage of received data, recv() must be performed before every send() if any incoming data is available. */ - pre_receive_plain(conn, num); + if(pre_receive_plain(conn, num)) { + *code = CURLE_OUT_OF_MEMORY; + return -1; + } #if defined(MSG_FASTOPEN) && !defined(TCP_FASTOPEN_CONNECT) /* Linux */ if(conn->bits.tcp_fastopen) { diff --git a/libs/libcurl/src/sendf.h b/libs/libcurl/src/sendf.h index c68b017daa..2e270c598b 100644 --- a/libs/libcurl/src/sendf.h +++ b/libs/libcurl/src/sendf.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2018, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2020, 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,8 +24,6 @@ #include "curl_setup.h" -CURLcode Curl_sendf(curl_socket_t sockfd, struct connectdata *, - const char *fmt, ...); void Curl_infof(struct Curl_easy *, const char *fmt, ...); void Curl_failf(struct Curl_easy *, const char *fmt, ...); diff --git a/libs/libcurl/src/setopt.c b/libs/libcurl/src/setopt.c index d6213357cc..fa53982158 100644 --- a/libs/libcurl/src/setopt.c +++ b/libs/libcurl/src/setopt.c @@ -430,104 +430,12 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) primary->version_max = version_max; } #else - result = CURLE_UNKNOWN_OPTION; + result = CURLE_NOT_BUILT_IN; #endif break; -#ifndef CURL_DISABLE_HTTP - case CURLOPT_AUTOREFERER: - /* - * Switch on automatic referer that gets set if curl follows locations. - */ - data->set.http_auto_referer = (0 != va_arg(param, long)) ? TRUE : FALSE; - break; - - case CURLOPT_ACCEPT_ENCODING: - /* - * String to use at the value of Accept-Encoding header. - * - * If the encoding is set to "" we use an Accept-Encoding header that - * encompasses all the encodings we support. - * If the encoding is set to NULL we don't send an Accept-Encoding header - * and ignore an received Content-Encoding header. - * - */ - argptr = va_arg(param, char *); - if(argptr && !*argptr) { - argptr = Curl_all_content_encodings(); - if(!argptr) - result = CURLE_OUT_OF_MEMORY; - else { - result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr); - free(argptr); - } - } - else - result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr); - break; - - case CURLOPT_TRANSFER_ENCODING: - data->set.http_transfer_encoding = (0 != va_arg(param, long)) ? - TRUE : FALSE; - break; - - case CURLOPT_FOLLOWLOCATION: - /* - * Follow Location: header hints on a HTTP-server. - */ - data->set.http_follow_location = (0 != va_arg(param, long)) ? TRUE : FALSE; - break; - - case CURLOPT_UNRESTRICTED_AUTH: - /* - * Send authentication (user+password) when following locations, even when - * hostname changed. - */ - data->set.allow_auth_to_other_hosts = - (0 != va_arg(param, long)) ? TRUE : FALSE; - break; - - case CURLOPT_MAXREDIRS: - /* - * The maximum amount of hops you allow curl to follow Location: - * headers. This should mostly be used to detect never-ending loops. - */ - arg = va_arg(param, long); - if(arg < -1) - return CURLE_BAD_FUNCTION_ARGUMENT; - data->set.maxredirs = arg; - break; - - case CURLOPT_POSTREDIR: - /* - * Set the behaviour of POST when redirecting - * CURL_REDIR_GET_ALL - POST is changed to GET after 301 and 302 - * CURL_REDIR_POST_301 - POST is kept as POST after 301 - * CURL_REDIR_POST_302 - POST is kept as POST after 302 - * CURL_REDIR_POST_303 - POST is kept as POST after 303 - * CURL_REDIR_POST_ALL - POST is kept as POST after 301, 302 and 303 - * other - POST is kept as POST after 301 and 302 - */ - arg = va_arg(param, long); - if(arg < CURL_REDIR_GET_ALL) - /* no return error on too high numbers since the bitmask could be - extended in a future */ - return CURLE_BAD_FUNCTION_ARGUMENT; - data->set.keep_post = arg & CURL_REDIR_POST_ALL; - break; - - case CURLOPT_POST: - /* Does this option serve a purpose anymore? Yes it does, when - CURLOPT_POSTFIELDS isn't used and the POST data is read off the - callback! */ - if(va_arg(param, long)) { - data->set.method = HTTPREQ_POST; - data->set.opt_no_body = FALSE; /* this is implied */ - } - else - data->set.method = HTTPREQ_GET; - break; - + /* MQTT "borrows" some of the HTTP options */ +#if !defined(CURL_DISABLE_HTTP) || !defined(CURL_DISABLE_MQTT) case CURLOPT_COPYPOSTFIELDS: /* * A string with POST data. Makes curl HTTP POST. Even if it is NULL. @@ -622,6 +530,100 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) data->set.postfieldsize = bigsize; break; +#endif +#ifndef CURL_DISABLE_HTTP + case CURLOPT_AUTOREFERER: + /* + * Switch on automatic referer that gets set if curl follows locations. + */ + data->set.http_auto_referer = (0 != va_arg(param, long)) ? TRUE : FALSE; + break; + + case CURLOPT_ACCEPT_ENCODING: + /* + * String to use at the value of Accept-Encoding header. + * + * If the encoding is set to "" we use an Accept-Encoding header that + * encompasses all the encodings we support. + * If the encoding is set to NULL we don't send an Accept-Encoding header + * and ignore an received Content-Encoding header. + * + */ + argptr = va_arg(param, char *); + if(argptr && !*argptr) { + argptr = Curl_all_content_encodings(); + if(!argptr) + result = CURLE_OUT_OF_MEMORY; + else { + result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr); + free(argptr); + } + } + else + result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr); + break; + + case CURLOPT_TRANSFER_ENCODING: + data->set.http_transfer_encoding = (0 != va_arg(param, long)) ? + TRUE : FALSE; + break; + + case CURLOPT_FOLLOWLOCATION: + /* + * Follow Location: header hints on a HTTP-server. + */ + data->set.http_follow_location = (0 != va_arg(param, long)) ? TRUE : FALSE; + break; + + case CURLOPT_UNRESTRICTED_AUTH: + /* + * Send authentication (user+password) when following locations, even when + * hostname changed. + */ + data->set.allow_auth_to_other_hosts = + (0 != va_arg(param, long)) ? TRUE : FALSE; + break; + + case CURLOPT_MAXREDIRS: + /* + * The maximum amount of hops you allow curl to follow Location: + * headers. This should mostly be used to detect never-ending loops. + */ + arg = va_arg(param, long); + if(arg < -1) + return CURLE_BAD_FUNCTION_ARGUMENT; + data->set.maxredirs = arg; + break; + + case CURLOPT_POSTREDIR: + /* + * Set the behaviour of POST when redirecting + * CURL_REDIR_GET_ALL - POST is changed to GET after 301 and 302 + * CURL_REDIR_POST_301 - POST is kept as POST after 301 + * CURL_REDIR_POST_302 - POST is kept as POST after 302 + * CURL_REDIR_POST_303 - POST is kept as POST after 303 + * CURL_REDIR_POST_ALL - POST is kept as POST after 301, 302 and 303 + * other - POST is kept as POST after 301 and 302 + */ + arg = va_arg(param, long); + if(arg < CURL_REDIR_GET_ALL) + /* no return error on too high numbers since the bitmask could be + extended in a future */ + return CURLE_BAD_FUNCTION_ARGUMENT; + data->set.keep_post = arg & CURL_REDIR_POST_ALL; + break; + + case CURLOPT_POST: + /* Does this option serve a purpose anymore? Yes it does, when + CURLOPT_POSTFIELDS isn't used and the POST data is read off the + callback! */ + if(va_arg(param, long)) { + data->set.method = HTTPREQ_POST; + data->set.opt_no_body = FALSE; /* this is implied */ + } + else + data->set.method = HTTPREQ_GET; + break; case CURLOPT_HTTPPOST: /* @@ -720,6 +722,9 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) argptr = (char *)va_arg(param, void *); if(argptr) { struct curl_slist *cl; + /* general protection against mistakes and abuse */ + if(strlen(argptr) > CURL_MAX_INPUT_LENGTH) + return CURLE_BAD_FUNCTION_ARGUMENT; /* append the cookie file name to the list of file names, and deal with them later */ cl = curl_slist_append(data->change.cookielist, argptr); @@ -804,6 +809,9 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) /* if cookie engine was not running, activate it */ data->cookies = Curl_cookie_init(data, NULL, NULL, TRUE); + /* general protection against mistakes and abuse */ + if(strlen(argptr) > CURL_MAX_INPUT_LENGTH) + return CURLE_BAD_FUNCTION_ARGUMENT; argptr = strdup(argptr); if(!argptr || !data->cookies) { result = CURLE_OUT_OF_MEMORY; @@ -1069,7 +1077,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) break; default: /* reserve other values for future use */ - result = CURLE_UNKNOWN_OPTION; + result = CURLE_BAD_FUNCTION_ARGUMENT; break; } break; @@ -1222,21 +1230,13 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) * An FTP/SFTP option that modifies an upload to create missing * directories on the server. */ - switch(va_arg(param, long)) { - case 0: - data->set.ftp_create_missing_dirs = 0; - break; - case 1: - data->set.ftp_create_missing_dirs = 1; - break; - case 2: - data->set.ftp_create_missing_dirs = 2; - break; - default: - /* reserve other values for future use */ - result = CURLE_UNKNOWN_OPTION; - break; - } + arg = va_arg(param, long); + /* reserve other values for future use */ + if((arg < CURLFTP_CREATE_DIR_NONE) || + (arg > CURLFTP_CREATE_DIR_RETRY)) + result = CURLE_BAD_FUNCTION_ARGUMENT; + else + data->set.ftp_create_missing_dirs = (int)arg; break; case CURLOPT_READDATA: /* @@ -2075,6 +2075,9 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) * The application kindly asks for a differently sized receive buffer. * If it seems reasonable, we'll use it. */ + if(data->state.buffer) + return CURLE_BAD_FUNCTION_ARGUMENT; + arg = va_arg(param, long); if(arg > READBUFFER_MAX) @@ -2084,18 +2087,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) else if(arg < READBUFFER_MIN) arg = READBUFFER_MIN; - /* Resize if new size */ - if((arg != data->set.buffer_size) && data->state.buffer) { - char *newbuff = realloc(data->state.buffer, arg + 1); - if(!newbuff) { - DEBUGF(fprintf(stderr, "Error: realloc of buffer failed\n")); - result = CURLE_OUT_OF_MEMORY; - } - else - data->state.buffer = newbuff; - } data->set.buffer_size = arg; - break; case CURLOPT_UPLOAD_BUFFERSIZE: @@ -2243,6 +2235,14 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) break; #endif + case CURLOPT_SSL_EC_CURVES: + /* + * Set accepted curves in SSL connection setup. + * Specify colon-delimited list of curve algorithm names. + */ + result = Curl_setstropt(&data->set.str[STRING_SSL_EC_CURVES], + va_arg(param, char *)); + break; #endif case CURLOPT_IPRESOLVE: arg = va_arg(param, long); @@ -2513,9 +2513,9 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) * Set the RTSP request method (OPTIONS, SETUP, PLAY, etc...) * Would this be better if the RTSPREQ_* were just moved into here? */ - long curl_rtspreq = va_arg(param, long); + long in_rtspreq = va_arg(param, long); Curl_RtspReq rtspreq = RTSPREQ_NONE; - switch(curl_rtspreq) { + switch(in_rtspreq) { case CURL_RTSPREQ_OPTIONS: rtspreq = RTSPREQ_OPTIONS; break; diff --git a/libs/libcurl/src/setup-win32.h b/libs/libcurl/src/setup-win32.h index 45b5847666..d20662aa19 100644 --- a/libs/libcurl/src/setup-win32.h +++ b/libs/libcurl/src/setup-win32.h @@ -60,7 +60,6 @@ /* * Define USE_WINSOCK to 2 if we have and use WINSOCK2 API, else - * define USE_WINSOCK to 1 if we have and use WINSOCK API, else * undefine USE_WINSOCK. */ @@ -70,7 +69,7 @@ # define USE_WINSOCK 2 #else # ifdef HAVE_WINSOCK_H -# define USE_WINSOCK 1 +# error "WinSock version 1 is no longer supported, version 2 is required!" # endif #endif diff --git a/libs/libcurl/src/share.c b/libs/libcurl/src/share.c index a2d896042a..407ac34536 100644 --- a/libs/libcurl/src/share.c +++ b/libs/libcurl/src/share.c @@ -92,7 +92,7 @@ curl_share_setopt(struct Curl_share *share, CURLSHoption option, ...) if(!share->sslsession) { share->max_ssl_sessions = 8; share->sslsession = calloc(share->max_ssl_sessions, - sizeof(struct curl_ssl_session)); + sizeof(struct Curl_ssl_session)); share->sessionage = 0; if(!share->sslsession) res = CURLSHE_NOMEM; diff --git a/libs/libcurl/src/share.h b/libs/libcurl/src/share.h index a7dea41adb..aa964b6ccd 100644 --- a/libs/libcurl/src/share.h +++ b/libs/libcurl/src/share.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2018, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2020, 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 @@ -46,7 +46,7 @@ struct Curl_share { curl_unlock_function unlockfunc; void *clientdata; struct conncache conn_cache; - struct curl_hash hostcache; + struct Curl_hash hostcache; #if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES) struct CookieInfo *cookies; #endif @@ -54,7 +54,7 @@ struct Curl_share { struct PslCache psl; #endif - struct curl_ssl_session *sslsession; + struct Curl_ssl_session *sslsession; size_t max_ssl_sessions; long sessionage; }; diff --git a/libs/libcurl/src/smb.c b/libs/libcurl/src/smb.c index d493adcc03..41d97b84cc 100644 --- a/libs/libcurl/src/smb.c +++ b/libs/libcurl/src/smb.c @@ -23,11 +23,9 @@ #include "curl_setup.h" -#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \ +#if !defined(CURL_DISABLE_SMB) && defined(USE_CURL_NTLM_CORE) && \ (CURL_SIZEOF_CURL_OFF_T > 4) -#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO) - #define BUILDING_CURL_SMB_C #ifdef HAVE_PROCESS_H @@ -88,6 +86,7 @@ const struct Curl_handler Curl_handler_smb = { ZERO_NULL, /* connection_check */ PORT_SMB, /* defport */ CURLPROTO_SMB, /* protocol */ + CURLPROTO_SMB, /* family */ PROTOPT_NONE /* flags */ }; @@ -113,6 +112,7 @@ const struct Curl_handler Curl_handler_smbs = { ZERO_NULL, /* connection_check */ PORT_SMBS, /* defport */ CURLPROTO_SMBS, /* protocol */ + CURLPROTO_SMB, /* family */ PROTOPT_SSL /* flags */ }; #endif @@ -996,6 +996,5 @@ static CURLcode smb_parse_url_path(struct connectdata *conn) return CURLE_OK; } -#endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */ - -#endif /* CURL_DISABLE_SMB && USE_NTLM && CURL_SIZEOF_CURL_OFF_T > 4 */ +#endif /* CURL_DISABLE_SMB && USE_CURL_NTLM_CORE && + CURL_SIZEOF_CURL_OFF_T > 4 */ diff --git a/libs/libcurl/src/smb.h b/libs/libcurl/src/smb.h index 136a89ce9e..ff0a354b7b 100644 --- a/libs/libcurl/src/smb.h +++ b/libs/libcurl/src/smb.h @@ -243,16 +243,13 @@ struct smb_tree_disconnect { #endif /* BUILDING_CURL_SMB_C */ -#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \ +#if !defined(CURL_DISABLE_SMB) && defined(USE_CURL_NTLM_CORE) && \ (CURL_SIZEOF_CURL_OFF_T > 4) -#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO) - extern const struct Curl_handler Curl_handler_smb; extern const struct Curl_handler Curl_handler_smbs; -#endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */ - -#endif /* CURL_DISABLE_SMB && USE_NTLM && CURL_SIZEOF_CURL_OFF_T > 4 */ +#endif /* CURL_DISABLE_SMB && USE_CURL_NTLM_CORE && + CURL_SIZEOF_CURL_OFF_T > 4 */ #endif /* HEADER_CURL_SMB_H */ diff --git a/libs/libcurl/src/smtp.c b/libs/libcurl/src/smtp.c index aea41bb4e3..49743c0369 100644 --- a/libs/libcurl/src/smtp.c +++ b/libs/libcurl/src/smtp.c @@ -133,6 +133,7 @@ const struct Curl_handler Curl_handler_smtp = { ZERO_NULL, /* connection_check */ PORT_SMTP, /* defport */ CURLPROTO_SMTP, /* protocol */ + CURLPROTO_SMTP, /* family */ PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY | /* flags */ PROTOPT_URLOPTIONS }; @@ -160,6 +161,7 @@ const struct Curl_handler Curl_handler_smtps = { ZERO_NULL, /* connection_check */ PORT_SMTPS, /* defport */ CURLPROTO_SMTPS, /* protocol */ + CURLPROTO_SMTP, /* family */ PROTOPT_CLOSEACTION | PROTOPT_SSL | PROTOPT_NOURLQUERY | PROTOPT_URLOPTIONS /* flags */ }; @@ -1322,6 +1324,7 @@ static CURLcode smtp_connect(struct connectdata *conn, bool *done) Curl_sasl_init(&smtpc->sasl, &saslsmtp); /* Initialise the pingpong layer */ + Curl_pp_setup(pp); Curl_pp_init(pp); /* Parse the URL options */ diff --git a/libs/libcurl/src/socketpair.c b/libs/libcurl/src/socketpair.c index 1ec0d75a46..9e1f9ef4c1 100644 --- a/libs/libcurl/src/socketpair.c +++ b/libs/libcurl/src/socketpair.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2019, Daniel Stenberg, , et al. + * Copyright (C) 2019 - 2020, 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 @@ -23,7 +23,7 @@ #include "curl_setup.h" #include "socketpair.h" -#ifndef HAVE_SOCKETPAIR +#if !defined(HAVE_SOCKETPAIR) && !defined(CURL_DISABLE_SOCKETPAIR) #ifdef WIN32 /* * This is a socketpair() implementation for Windows. diff --git a/libs/libcurl/src/socks.c b/libs/libcurl/src/socks.c index 44783d015c..a41b67d5a9 100644 --- a/libs/libcurl/src/socks.c +++ b/libs/libcurl/src/socks.c @@ -184,12 +184,12 @@ int Curl_SOCKS_getsock(struct connectdata *conn, curl_socket_t *sock, * Set protocol4a=true for "SOCKS 4A (Simple Extension to SOCKS 4 Protocol)" * Nonsupport "Identification Protocol (RFC1413)" */ -CURLcode Curl_SOCKS4(const char *proxy_user, - const char *hostname, - int remote_port, - int sockindex, - struct connectdata *conn, - bool *done) +CURLproxycode Curl_SOCKS4(const char *proxy_user, + const char *hostname, + int remote_port, + int sockindex, + struct connectdata *conn, + bool *done) { const bool protocol4a = (conn->socks_proxy.proxytype == CURLPROXY_SOCKS4A) ? TRUE : FALSE; @@ -237,11 +237,11 @@ CURLcode Curl_SOCKS4(const char *proxy_user, Curl_resolv(conn, hostname, remote_port, FALSE, &dns); if(rc == CURLRESOLV_ERROR) - return CURLE_COULDNT_RESOLVE_PROXY; + return CURLPX_RESOLVE_HOST; else if(rc == CURLRESOLV_PENDING) { sxstate(conn, CONNECT_RESOLVING); infof(data, "SOCKS4 non-blocking resolve of %s\n", hostname); - return CURLE_OK; + return CURLPX_OK; } sxstate(conn, CONNECT_RESOLVED); goto CONNECT_RESOLVED; @@ -265,8 +265,11 @@ CURLcode Curl_SOCKS4(const char *proxy_user, } else { result = Curl_resolv_check(data->conn, &dns); - if(!dns) - return result; + if(!dns) { + if(result) + return CURLPX_RESOLVE_HOST; + return CURLPX_OK; + } } /* FALLTHROUGH */ CONNECT_RESOLVED: @@ -303,7 +306,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user, if(!hp) { failf(data, "Failed to resolve \"%s\" for SOCKS4 connect.", hostname); - return CURLE_COULDNT_RESOLVE_HOST; + return CURLPX_RESOLVE_HOST; } } /* FALLTHROUGH */ @@ -316,8 +319,8 @@ CURLcode Curl_SOCKS4(const char *proxy_user, if(proxy_user) { size_t plen = strlen(proxy_user); if(plen >= sizeof(sx->socksreq) - 8) { - failf(data, "Too long SOCKS proxy name, can't use!\n"); - return CURLE_COULDNT_CONNECT; + failf(data, "Too long SOCKS proxy user name, can't use!\n"); + return CURLPX_LONG_USER; } /* copy the proxy name WITH trailing zero */ memcpy(socksreq + 8, proxy_user, plen + 1); @@ -343,7 +346,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user, strcpy((char *)socksreq + packetsize, hostname); else { failf(data, "SOCKS4: too long host name"); - return CURLE_COULDNT_CONNECT; + return CURLPX_LONG_HOSTNAME; } packetsize += hostnamelen; } @@ -358,13 +361,13 @@ CURLcode Curl_SOCKS4(const char *proxy_user, sx->outstanding, &written); if(result && (CURLE_AGAIN != result)) { failf(data, "Failed to send SOCKS4 connect request."); - return CURLE_COULDNT_CONNECT; + return CURLPX_SEND_CONNECT; } if(written != sx->outstanding) { /* not done, remain in state */ sx->outstanding -= written; sx->outp += written; - return CURLE_OK; + return CURLPX_OK; } /* done sending! */ @@ -380,18 +383,18 @@ CURLcode Curl_SOCKS4(const char *proxy_user, if(result && (CURLE_AGAIN != result)) { failf(data, "SOCKS4: Failed receiving connect request ack: %s", curl_easy_strerror(result)); - return CURLE_COULDNT_CONNECT; + return CURLPX_RECV_CONNECT; } else if(!result && !actualread) { /* connection closed */ failf(data, "connection to proxy closed"); - return CURLE_COULDNT_CONNECT; + return CURLPX_CLOSED; } else if(actualread != sx->outstanding) { /* remain in reading state */ sx->outstanding -= actualread; sx->outp += actualread; - return CURLE_OK; + return CURLPX_OK; } sxstate(conn, CONNECT_DONE); break; @@ -422,7 +425,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user, if(socksreq[0] != 0) { failf(data, "SOCKS4 reply has wrong version, version should be 0."); - return CURLE_COULDNT_CONNECT; + return CURLPX_BAD_VERSION; } /* Result */ @@ -438,7 +441,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user, (unsigned char)socksreq[6], (unsigned char)socksreq[7], (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]), (unsigned char)socksreq[1]); - return CURLE_COULDNT_CONNECT; + return CURLPX_REQUEST_FAILED; case 92: failf(data, "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)" @@ -448,7 +451,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user, (unsigned char)socksreq[6], (unsigned char)socksreq[7], (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]), (unsigned char)socksreq[1]); - return CURLE_COULDNT_CONNECT; + return CURLPX_IDENTD; case 93: failf(data, "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)" @@ -458,7 +461,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user, (unsigned char)socksreq[6], (unsigned char)socksreq[7], (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]), (unsigned char)socksreq[1]); - return CURLE_COULDNT_CONNECT; + return CURLPX_IDENTD_DIFFER; default: failf(data, "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)" @@ -467,24 +470,24 @@ CURLcode Curl_SOCKS4(const char *proxy_user, (unsigned char)socksreq[6], (unsigned char)socksreq[7], (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]), (unsigned char)socksreq[1]); - return CURLE_COULDNT_CONNECT; + return CURLPX_UNKNOWN_FAIL; } *done = TRUE; - return CURLE_OK; /* Proxy was successful! */ + return CURLPX_OK; /* Proxy was successful! */ } /* * This function logs in to a SOCKS5 proxy and sends the specifics to the final * destination server. */ -CURLcode Curl_SOCKS5(const char *proxy_user, - const char *proxy_password, - const char *hostname, - int remote_port, - int sockindex, - struct connectdata *conn, - bool *done) +CURLproxycode Curl_SOCKS5(const char *proxy_user, + const char *proxy_password, + const char *hostname, + int remote_port, + int sockindex, + struct connectdata *conn, + bool *done) { /* According to the RFC1928, section "6. Replies". This is what a SOCK5 @@ -561,13 +564,13 @@ CURLcode Curl_SOCKS5(const char *proxy_user, result = Curl_write_plain(conn, sockfd, (char *)socksreq, idx, &written); if(result && (CURLE_AGAIN != result)) { failf(data, "Unable to send initial SOCKS5 request."); - return CURLE_COULDNT_CONNECT; + return CURLPX_SEND_CONNECT; } if(written != idx) { sxstate(conn, CONNECT_SOCKS_SEND); sx->outstanding = idx - written; sx->outp = &socksreq[written]; - return CURLE_OK; + return CURLPX_OK; } sxstate(conn, CONNECT_SOCKS_READ); goto CONNECT_SOCKS_READ_INIT; @@ -576,13 +579,13 @@ CURLcode Curl_SOCKS5(const char *proxy_user, sx->outstanding, &written); if(result && (CURLE_AGAIN != result)) { failf(data, "Unable to send initial SOCKS5 request."); - return CURLE_COULDNT_CONNECT; + return CURLPX_SEND_CONNECT; } if(written != sx->outstanding) { /* not done, remain in state */ sx->outstanding -= written; sx->outp += written; - return CURLE_OK; + return CURLPX_OK; } /* FALLTHROUGH */ CONNECT_SOCKS_READ_INIT: @@ -595,22 +598,22 @@ CURLcode Curl_SOCKS5(const char *proxy_user, sx->outstanding, &actualread); if(result && (CURLE_AGAIN != result)) { failf(data, "Unable to receive initial SOCKS5 response."); - return CURLE_COULDNT_CONNECT; + return CURLPX_RECV_CONNECT; } else if(!result && !actualread) { /* connection closed */ failf(data, "Connection to proxy closed"); - return CURLE_COULDNT_CONNECT; + return CURLPX_CLOSED; } else if(actualread != sx->outstanding) { /* remain in reading state */ sx->outstanding -= actualread; sx->outp += actualread; - return CURLE_OK; + return CURLPX_OK; } else if(socksreq[0] != 5) { failf(data, "Received invalid version in initial SOCKS5 response."); - return CURLE_COULDNT_CONNECT; + return CURLPX_BAD_VERSION; } else if(socksreq[1] == 0) { /* DONE! No authentication needed. Send request. */ @@ -628,7 +631,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user, result = Curl_SOCKS5_gssapi_negotiate(sockindex, conn); if(result) { failf(data, "Unable to negotiate SOCKS5 GSS-API context."); - return CURLE_COULDNT_CONNECT; + return CURLPX_GSSAPI; } } #endif @@ -637,16 +640,16 @@ CURLcode Curl_SOCKS5(const char *proxy_user, if(!allow_gssapi && (socksreq[1] == 1)) { failf(data, "SOCKS5 GSSAPI per-message authentication is not supported."); - return CURLE_COULDNT_CONNECT; + return CURLPX_GSSAPI_PERMSG; } else if(socksreq[1] == 255) { failf(data, "No authentication method was acceptable."); - return CURLE_COULDNT_CONNECT; + return CURLPX_NO_AUTH; } } failf(data, "Undocumented SOCKS5 mode attempted to be used by server."); - return CURLE_COULDNT_CONNECT; + return CURLPX_UNKNOWN_MODE; #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) case CONNECT_GSSAPI_INIT: /* GSSAPI stuff done non-blocking */ @@ -683,7 +686,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user, /* the length must fit in a single byte */ if(proxy_user_len >= 255) { failf(data, "Excessive user name length for proxy auth"); - return CURLE_BAD_FUNCTION_ARGUMENT; + return CURLPX_LONG_USER; } memcpy(socksreq + len, proxy_user, proxy_user_len); } @@ -693,7 +696,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user, /* the length must fit in a single byte */ if(proxy_password_len > 255) { failf(data, "Excessive password length for proxy auth"); - return CURLE_BAD_FUNCTION_ARGUMENT; + return CURLPX_LONG_PASSWD; } memcpy(socksreq + len, proxy_password, proxy_password_len); } @@ -708,13 +711,13 @@ CURLcode Curl_SOCKS5(const char *proxy_user, sx->outstanding, &written); if(result && (CURLE_AGAIN != result)) { failf(data, "Failed to send SOCKS5 sub-negotiation request."); - return CURLE_COULDNT_CONNECT; + return CURLPX_SEND_AUTH; } if(sx->outstanding != written) { /* remain in state */ sx->outstanding -= written; sx->outp += written; - return CURLE_OK; + return CURLPX_OK; } sx->outp = socksreq; sx->outstanding = 2; @@ -725,24 +728,24 @@ CURLcode Curl_SOCKS5(const char *proxy_user, sx->outstanding, &actualread); if(result && (CURLE_AGAIN != result)) { failf(data, "Unable to receive SOCKS5 sub-negotiation response."); - return CURLE_COULDNT_CONNECT; + return CURLPX_RECV_AUTH; } else if(!result && !actualread) { /* connection closed */ failf(data, "connection to proxy closed"); - return CURLE_COULDNT_CONNECT; + return CURLPX_CLOSED; } else if(actualread != sx->outstanding) { /* remain in state */ sx->outstanding -= actualread; sx->outp += actualread; - return CURLE_OK; + return CURLPX_OK; } /* ignore the first (VER) byte */ else if(socksreq[1] != 0) { /* status */ failf(data, "User was rejected by the SOCKS5 server (%d %d).", socksreq[0], socksreq[1]); - return CURLE_COULDNT_CONNECT; + return CURLPX_USER_REJECTED; } /* Everything is good so far, user was authenticated! */ @@ -755,11 +758,11 @@ CURLcode Curl_SOCKS5(const char *proxy_user, FALSE, &dns); if(rc == CURLRESOLV_ERROR) - return CURLE_COULDNT_RESOLVE_HOST; + return CURLPX_RESOLVE_HOST; if(rc == CURLRESOLV_PENDING) { sxstate(conn, CONNECT_RESOLVING); - return CURLE_OK; + return CURLPX_OK; } sxstate(conn, CONNECT_RESOLVED); goto CONNECT_RESOLVED; @@ -780,8 +783,11 @@ CURLcode Curl_SOCKS5(const char *proxy_user, if(!dns) { result = Curl_resolv_check(data->conn, &dns); - if(!dns) - return result; + if(!dns) { + if(result) + return CURLPX_RESOLVE_HOST; + return CURLPX_OK; + } } /* FALLTHROUGH */ CONNECT_RESOLVED: @@ -793,7 +799,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user, if(!hp) { failf(data, "Failed to resolve \"%s\" for SOCKS5 connect.", hostname); - return CURLE_COULDNT_RESOLVE_HOST; + return CURLPX_RESOLVE_HOST; } Curl_printable_address(hp, dest, sizeof(dest)); @@ -867,7 +873,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user, #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) if(conn->socks5_gssapi_enctype) { failf(data, "SOCKS5 GSS-API protection not yet implemented."); - return CURLE_COULDNT_CONNECT; + return CURLPX_GSSAPI_PROTECTION; } #endif sx->outp = socksreq; @@ -879,18 +885,18 @@ CURLcode Curl_SOCKS5(const char *proxy_user, sx->outstanding, &written); if(result && (CURLE_AGAIN != result)) { failf(data, "Failed to send SOCKS5 connect request."); - return CURLE_COULDNT_CONNECT; + return CURLPX_SEND_REQUEST; } if(sx->outstanding != written) { /* remain in state */ sx->outstanding -= written; sx->outp += written; - return CURLE_OK; + return CURLPX_OK; } #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) if(conn->socks5_gssapi_enctype) { failf(data, "SOCKS5 GSS-API protection not yet implemented."); - return CURLE_COULDNT_CONNECT; + return CURLPX_GSSAPI_PROTECTION; } #endif sx->outstanding = 10; /* minimum packet size is 10 */ @@ -902,29 +908,46 @@ CURLcode Curl_SOCKS5(const char *proxy_user, sx->outstanding, &actualread); if(result && (CURLE_AGAIN != result)) { failf(data, "Failed to receive SOCKS5 connect request ack."); - return CURLE_COULDNT_CONNECT; + return CURLPX_RECV_REQACK; } else if(!result && !actualread) { /* connection closed */ failf(data, "connection to proxy closed"); - return CURLE_COULDNT_CONNECT; + return CURLPX_CLOSED; } else if(actualread != sx->outstanding) { /* remain in state */ sx->outstanding -= actualread; sx->outp += actualread; - return CURLE_OK; + return CURLPX_OK; } if(socksreq[0] != 5) { /* version */ failf(data, "SOCKS5 reply has wrong version, version should be 5."); - return CURLE_COULDNT_CONNECT; + return CURLPX_BAD_VERSION; } else if(socksreq[1] != 0) { /* Anything besides 0 is an error */ + CURLproxycode rc = CURLPX_REPLY_UNASSIGNED; + int code = socksreq[1]; failf(data, "Can't complete SOCKS5 connection to %s. (%d)", hostname, (unsigned char)socksreq[1]); - return CURLE_COULDNT_CONNECT; + if(code < 9) { + /* RFC 1928 section 6 lists: */ + static const CURLproxycode lookup[] = { + CURLPX_OK, + CURLPX_REPLY_GENERAL_SERVER_FAILURE, + CURLPX_REPLY_NOT_ALLOWED, + CURLPX_REPLY_NETWORK_UNREACHABLE, + CURLPX_REPLY_HOST_UNREACHABLE, + CURLPX_REPLY_CONNECTION_REFUSED, + CURLPX_REPLY_TTL_EXPIRED, + CURLPX_REPLY_COMMAND_NOT_SUPPORTED, + CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED, + }; + rc = lookup[code]; + } + return rc; } /* Fix: in general, returned BND.ADDR is variable length parameter by RFC @@ -958,7 +981,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user, } else { failf(data, "SOCKS5 reply has wrong address type."); - return CURLE_COULDNT_CONNECT; + return CURLPX_BAD_ADDRESS_TYPE; } /* At this point we already read first 10 bytes */ @@ -984,25 +1007,25 @@ CURLcode Curl_SOCKS5(const char *proxy_user, sx->outstanding, &actualread); if(result && (CURLE_AGAIN != result)) { failf(data, "Failed to receive SOCKS5 connect request ack."); - return CURLE_COULDNT_CONNECT; + return CURLPX_RECV_ADDRESS; } else if(!result && !actualread) { /* connection closed */ failf(data, "connection to proxy closed"); - return CURLE_COULDNT_CONNECT; + return CURLPX_CLOSED; } else if(actualread != sx->outstanding) { /* remain in state */ sx->outstanding -= actualread; sx->outp += actualread; - return CURLE_OK; + return CURLPX_OK; } sxstate(conn, CONNECT_DONE); } infof(data, "SOCKS5 request granted.\n"); *done = TRUE; - return CURLE_OK; /* Proxy was successful! */ + return CURLPX_OK; /* Proxy was successful! */ } #endif /* CURL_DISABLE_PROXY */ diff --git a/libs/libcurl/src/socks.h b/libs/libcurl/src/socks.h index 64a7563373..17e6f46101 100644 --- a/libs/libcurl/src/socks.h +++ b/libs/libcurl/src/socks.h @@ -48,24 +48,24 @@ int Curl_SOCKS_getsock(struct connectdata *conn, * This function logs in to a SOCKS4(a) proxy and sends the specifics to the * final destination server. */ -CURLcode Curl_SOCKS4(const char *proxy_name, - const char *hostname, - int remote_port, - int sockindex, - struct connectdata *conn, - bool *done); +CURLproxycode Curl_SOCKS4(const char *proxy_name, + const char *hostname, + int remote_port, + int sockindex, + struct connectdata *conn, + bool *done); /* * This function logs in to a SOCKS5 proxy and sends the specifics to the * final destination server. */ -CURLcode Curl_SOCKS5(const char *proxy_name, - const char *proxy_password, - const char *hostname, - int remote_port, - int sockindex, - struct connectdata *conn, - bool *done); +CURLproxycode Curl_SOCKS5(const char *proxy_name, + const char *proxy_password, + const char *hostname, + int remote_port, + int sockindex, + struct connectdata *conn, + bool *done); #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) /* diff --git a/libs/libcurl/src/strerror.c b/libs/libcurl/src/strerror.c index 015e588cf7..b5808df2d1 100644 --- a/libs/libcurl/src/strerror.c +++ b/libs/libcurl/src/strerror.c @@ -320,6 +320,9 @@ curl_easy_strerror(CURLcode error) case CURLE_QUIC_CONNECT_ERROR: return "QUIC connection error"; + case CURLE_PROXY: + return "proxy handshake error"; + /* error codes not used by current libcurl */ case CURLE_OBSOLETE20: case CURLE_OBSOLETE24: @@ -652,34 +655,27 @@ static const char * get_winapi_error(int err, char *buf, size_t buflen) { char *p; + wchar_t wbuf[256]; if(!buflen) return NULL; *buf = '\0'; - -#ifdef _WIN32_WCE - { - wchar_t wbuf[256]; - wbuf[0] = L'\0'; - - if(FormatMessage((FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err, - LANG_NEUTRAL, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL)) { - size_t written = wcstombs(buf, wbuf, buflen - 1); - if(written != (size_t)-1) - buf[written] = '\0'; - else - *buf = '\0'; - } - } -#else - if(!FormatMessageA((FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err, - LANG_NEUTRAL, buf, (DWORD)buflen, NULL)) { - *buf = '\0'; + *wbuf = L'\0'; + + /* We return the local codepage version of the error string because if it is + output to the user's terminal it will likely be with functions which + expect the local codepage (eg fprintf, failf, infof). + FormatMessageW -> wcstombs is used for Windows CE compatibility. */ + if(FormatMessageW((FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err, + LANG_NEUTRAL, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL)) { + size_t written = wcstombs(buf, wbuf, buflen - 1); + if(written != (size_t)-1) + buf[written] = '\0'; + else + *buf = '\0'; } -#endif /* Truncate multiple lines */ p = strchr(buf, '\n'); diff --git a/libs/libcurl/src/system_win32.c b/libs/libcurl/src/system_win32.c index 2e59e032e2..9b0797bf9f 100644 --- a/libs/libcurl/src/system_win32.c +++ b/libs/libcurl/src/system_win32.c @@ -55,12 +55,7 @@ CURLcode Curl_win32_init(long flags) WSADATA wsaData; int res; -#if defined(ENABLE_IPV6) && (USE_WINSOCK < 2) -#error IPV6_requires_winsock2 -#endif - - wVersionRequested = MAKEWORD(USE_WINSOCK, USE_WINSOCK); - + wVersionRequested = MAKEWORD(2, 2); res = WSAStartup(wVersionRequested, &wsaData); if(res != 0) @@ -83,9 +78,9 @@ CURLcode Curl_win32_init(long flags) return CURLE_FAILED_INIT; } /* The Windows Sockets DLL is acceptable. Proceed. */ - #elif defined(USE_LWIPSOCK) +#elif defined(USE_LWIPSOCK) lwip_init(); - #endif +#endif } /* CURL_GLOBAL_WIN32 */ #ifdef USE_WINDOWS_SSPI diff --git a/libs/libcurl/src/telnet.c b/libs/libcurl/src/telnet.c index c3b58e54c5..754febe27b 100644 --- a/libs/libcurl/src/telnet.c +++ b/libs/libcurl/src/telnet.c @@ -87,12 +87,6 @@ #define printoption(a,b,c,d) Curl_nop_stmt #endif -#ifdef USE_WINSOCK -typedef WSAEVENT (WINAPI *WSOCK2_EVENT)(void); -typedef FARPROC WSOCK2_FUNC; -static CURLcode check_wsock2(struct Curl_easy *data); -#endif - static CURLcode telrcv(struct connectdata *, const unsigned char *inbuf, /* Data received from socket */ @@ -194,50 +188,11 @@ const struct Curl_handler Curl_handler_telnet = { ZERO_NULL, /* connection_check */ PORT_TELNET, /* defport */ CURLPROTO_TELNET, /* protocol */ + CURLPROTO_TELNET, /* family */ PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */ }; -#ifdef USE_WINSOCK -static CURLcode -check_wsock2(struct Curl_easy *data) -{ - int err; - WORD wVersionRequested; - WSADATA wsaData; - - DEBUGASSERT(data); - - /* telnet requires at least WinSock 2.0 so ask for it. */ - wVersionRequested = MAKEWORD(2, 0); - - err = WSAStartup(wVersionRequested, &wsaData); - - /* We must've called this once already, so this call */ - /* should always succeed. But, just in case... */ - if(err != 0) { - failf(data,"WSAStartup failed (%d)",err); - return CURLE_FAILED_INIT; - } - - /* We have to have a WSACleanup call for every successful */ - /* WSAStartup call. */ - WSACleanup(); - - /* Check that our version is supported */ - if(LOBYTE(wsaData.wVersion) != LOBYTE(wVersionRequested) || - HIBYTE(wsaData.wVersion) != HIBYTE(wVersionRequested)) { - /* Our version isn't supported */ - failf(data, "insufficient winsock version to support " - "telnet"); - return CURLE_FAILED_INIT; - } - - /* Our version is supported */ - return CURLE_OK; -} -#endif - static CURLcode init_telnet(struct connectdata *conn) { @@ -1301,11 +1256,6 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done) struct Curl_easy *data = conn->data; curl_socket_t sockfd = conn->sock[FIRSTSOCKET]; #ifdef USE_WINSOCK - HMODULE wsock2; - WSOCK2_FUNC close_event_func; - WSOCK2_EVENT create_event_func; - WSOCK2_FUNC event_select_func; - WSOCK2_FUNC enum_netevents_func; WSAEVENT event_handle; WSANETWORKEVENTS events; HANDLE stdin_handle; @@ -1340,75 +1290,21 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done) return result; #ifdef USE_WINSOCK - /* - ** This functionality only works with WinSock >= 2.0. So, - ** make sure we have it. - */ - result = check_wsock2(data); - if(result) - return result; - - /* OK, so we have WinSock 2.0. We need to dynamically */ - /* load ws2_32.dll and get the function pointers we need. */ - wsock2 = Curl_load_library(TEXT("WS2_32.DLL")); - if(wsock2 == NULL) { - failf(data, "failed to load WS2_32.DLL (%u)", GetLastError()); - return CURLE_FAILED_INIT; - } - - /* Grab a pointer to WSACreateEvent */ - create_event_func = - CURLX_FUNCTION_CAST(WSOCK2_EVENT, - (GetProcAddress(wsock2, "WSACreateEvent"))); - if(create_event_func == NULL) { - failf(data, "failed to find WSACreateEvent function (%u)", GetLastError()); - FreeLibrary(wsock2); - return CURLE_FAILED_INIT; - } - - /* And WSACloseEvent */ - close_event_func = GetProcAddress(wsock2, "WSACloseEvent"); - if(close_event_func == NULL) { - failf(data, "failed to find WSACloseEvent function (%u)", GetLastError()); - FreeLibrary(wsock2); - return CURLE_FAILED_INIT; - } - - /* And WSAEventSelect */ - event_select_func = GetProcAddress(wsock2, "WSAEventSelect"); - if(event_select_func == NULL) { - failf(data, "failed to find WSAEventSelect function (%u)", GetLastError()); - FreeLibrary(wsock2); - return CURLE_FAILED_INIT; - } - - /* And WSAEnumNetworkEvents */ - enum_netevents_func = GetProcAddress(wsock2, "WSAEnumNetworkEvents"); - if(enum_netevents_func == NULL) { - failf(data, "failed to find WSAEnumNetworkEvents function (%u)", - GetLastError()); - FreeLibrary(wsock2); - return CURLE_FAILED_INIT; - } - /* We want to wait for both stdin and the socket. Since ** the select() function in winsock only works on sockets ** we have to use the WaitForMultipleObjects() call. */ /* First, create a sockets event object */ - event_handle = (WSAEVENT)create_event_func(); + event_handle = WSACreateEvent(); if(event_handle == WSA_INVALID_EVENT) { failf(data, "WSACreateEvent failed (%d)", SOCKERRNO); - FreeLibrary(wsock2); return CURLE_FAILED_INIT; } /* Tell winsock what events we want to listen to */ - if(event_select_func(sockfd, event_handle, FD_READ|FD_CLOSE) == - SOCKET_ERROR) { - close_event_func(event_handle); - FreeLibrary(wsock2); + if(WSAEventSelect(sockfd, event_handle, FD_READ|FD_CLOSE) == SOCKET_ERROR) { + WSACloseEvent(event_handle); return CURLE_OK; } @@ -1439,6 +1335,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done) DWORD waitret = WaitForMultipleObjects(obj_count, objs, FALSE, wait_timeout); switch(waitret) { + case WAIT_TIMEOUT: { for(;;) { @@ -1508,9 +1405,9 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done) break; case WAIT_OBJECT_0: - + { events.lNetworkEvents = 0; - if(SOCKET_ERROR == enum_netevents_func(sockfd, event_handle, &events)) { + if(WSAEnumNetworkEvents(sockfd, event_handle, &events) == SOCKET_ERROR) { err = SOCKERRNO; if(err != EINPROGRESS) { infof(data, "WSAEnumNetworkEvents failed (%d)", err); @@ -1554,7 +1451,8 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done) if(events.lNetworkEvents & FD_CLOSE) { keepon = FALSE; } - break; + } + break; } @@ -1569,19 +1467,9 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done) } /* We called WSACreateEvent, so call WSACloseEvent */ - if(!close_event_func(event_handle)) { + if(!WSACloseEvent(event_handle)) { infof(data, "WSACloseEvent failed (%d)", SOCKERRNO); } - - /* "Forget" pointers into the library we're about to free */ - create_event_func = NULL; - close_event_func = NULL; - event_select_func = NULL; - enum_netevents_func = NULL; - - /* We called LoadLibrary, so call FreeLibrary */ - if(!FreeLibrary(wsock2)) - infof(data, "FreeLibrary(wsock2) failed (%u)", GetLastError()); #else pfd[0].fd = sockfd; pfd[0].events = POLLIN; diff --git a/libs/libcurl/src/tftp.c b/libs/libcurl/src/tftp.c index 378d956081..1d3b8e8255 100644 --- a/libs/libcurl/src/tftp.c +++ b/libs/libcurl/src/tftp.c @@ -183,6 +183,7 @@ const struct Curl_handler Curl_handler_tftp = { ZERO_NULL, /* connection_check */ PORT_TFTP, /* defport */ CURLPROTO_TFTP, /* protocol */ + CURLPROTO_TFTP, /* family */ PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */ }; diff --git a/libs/libcurl/src/url.c b/libs/libcurl/src/url.c index 150667aa97..8af33c0403 100644 --- a/libs/libcurl/src/url.c +++ b/libs/libcurl/src/url.c @@ -130,7 +130,6 @@ bool curl_win32_idn_to_ascii(const char *in, char **out); #include "memdebug.h" static void conn_free(struct connectdata *conn); -static unsigned int get_protocol_family(unsigned int protocol); /* Some parts of the code (e.g. chunked encoding) assume this buffer has at * more than just a few bytes to play with. Don't let it become too small or @@ -140,6 +139,24 @@ static unsigned int get_protocol_family(unsigned int protocol); # error READBUFFER_SIZE is too small #endif +/* +* get_protocol_family() +* +* This is used to return the protocol family for a given protocol. +* +* Parameters: +* +* 'h' [in] - struct Curl_handler pointer. +* +* Returns the family as a single bit protocol identifier. +*/ +static unsigned int get_protocol_family(const struct Curl_handler *h) +{ + DEBUGASSERT(h); + DEBUGASSERT(h->family); + return h->family; +} + /* * Protocol table. Schemes (roughly) in 2019 popularity order: @@ -215,9 +232,8 @@ static const struct Curl_handler * const protocols[] = { #endif #endif -#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \ - (CURL_SIZEOF_CURL_OFF_T > 4) && \ - (!defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)) +#if !defined(CURL_DISABLE_SMB) && defined(USE_CURL_NTLM_CORE) && \ + (CURL_SIZEOF_CURL_OFF_T > 4) &Curl_handler_smb, #ifdef USE_SSL &Curl_handler_smbs, @@ -228,7 +244,7 @@ static const struct Curl_handler * const protocols[] = { &Curl_handler_rtsp, #endif -#ifdef CURL_ENABLE_MQTT +#ifndef CURL_DISABLE_MQTT &Curl_handler_mqtt, #endif @@ -274,6 +290,7 @@ static const struct Curl_handler Curl_handler_dummy = { ZERO_NULL, /* connection_check */ 0, /* defport */ 0, /* protocol */ + 0, /* family */ PROTOPT_NONE /* flags */ }; @@ -392,11 +409,8 @@ CURLcode Curl_close(struct Curl_easy **datap) Curl_dyn_free(&data->state.headerb); Curl_safefree(data->state.ulbuf); Curl_flush_cookies(data, TRUE); -#ifdef USE_ALTSVC Curl_altsvc_save(data, data->asi, data->set.str[STRING_ALTSVC]); - Curl_altsvc_cleanup(data->asi); - data->asi = NULL; -#endif + Curl_altsvc_cleanup(&data->asi); #if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH) Curl_http_auth_cleanup_digest(data); #endif @@ -1019,7 +1033,7 @@ static void prune_dead_connections(struct Curl_easy *data) Curl_conncache_remove_conn(data, prune.extracted, TRUE); /* disconnect it */ - (void)Curl_disconnect(data, prune.extracted, /* dead_connection */TRUE); + (void)Curl_disconnect(data, prune.extracted, TRUE); } CONNCACHE_LOCK(data); data->state.conn_cache->last_cleanup = now; @@ -1075,7 +1089,7 @@ ConnectionExists(struct Curl_easy *data, &hostbundle); if(bundle) { /* Max pipe length is zero (unlimited) for multiplexed connections */ - struct curl_llist_element *curr; + struct Curl_llist_element *curr; infof(data, "Found bundle for host %s: %p [%s]\n", hostbundle, (void *)bundle, (bundle->multiuse == BUNDLE_MULTIPLEX ? @@ -1121,6 +1135,12 @@ ConnectionExists(struct Curl_easy *data, /* connect-only or to-be-closed connections will not be reused */ continue; + if(extract_if_dead(check, data)) { + /* disconnect it */ + (void)Curl_disconnect(data, check, TRUE); + continue; + } + if(bundle->multiuse == BUNDLE_MULTIPLEX) multiplexed = CONN_INUSE(check); @@ -1171,7 +1191,7 @@ ConnectionExists(struct Curl_easy *data, if((needle->handler->flags&PROTOPT_SSL) != (check->handler->flags&PROTOPT_SSL)) /* don't do mixed SSL and non-SSL connections */ - if(get_protocol_family(check->handler->protocol) != + if(get_protocol_family(check->handler) != needle->handler->protocol || !check->bits.tls_upgraded) /* except protocols that have been upgraded via TLS */ continue; @@ -1276,7 +1296,7 @@ ConnectionExists(struct Curl_easy *data, is allowed to be upgraded via TLS */ if((strcasecompare(needle->handler->scheme, check->handler->scheme) || - (get_protocol_family(check->handler->protocol) == + (get_protocol_family(check->handler) == needle->handler->protocol && check->bits.tls_upgraded)) && (!needle->bits.conn_to_host || strcasecompare( needle->conn_to_host.name, check->conn_to_host.name)) && @@ -2377,8 +2397,10 @@ static CURLcode parse_proxy(struct Curl_easy *data, static CURLcode parse_proxy_auth(struct Curl_easy *data, struct connectdata *conn) { - char *proxyuser = data->set.str[STRING_PROXYUSERNAME]; - char *proxypasswd = data->set.str[STRING_PROXYPASSWORD]; + const char *proxyuser = data->set.str[STRING_PROXYUSERNAME] ? + data->set.str[STRING_PROXYUSERNAME] : ""; + const char *proxypasswd = data->set.str[STRING_PROXYPASSWORD] ? + data->set.str[STRING_PROXYPASSWORD] : ""; CURLcode result = CURLE_OK; if(proxyuser) @@ -2551,6 +2573,9 @@ static CURLcode create_conn_helper_init_proxy(struct connectdata *conn) conn->bits.socksproxy = FALSE; conn->bits.proxy_user_passwd = FALSE; conn->bits.tunnel_proxy = FALSE; + /* CURLPROXY_HTTPS does not have its own flag in conn->bits, yet we need + to signal that CURLPROXY_HTTPS is not used for this connection */ + conn->http_proxy.proxytype = CURLPROXY_HTTP; } out: @@ -3611,6 +3636,7 @@ static CURLcode create_conn(struct Curl_easy *data, data->set.ssl.primary.pinned_key = data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG]; data->set.ssl.primary.cert_blob = data->set.blobs[BLOB_CERT_ORIG]; + data->set.ssl.primary.curves = data->set.str[STRING_SSL_EC_CURVES]; #ifndef CURL_DISABLE_PROXY data->set.proxy_ssl.primary.CApath = data->set.str[STRING_SSL_CAPATH_PROXY]; @@ -3627,18 +3653,15 @@ static CURLcode create_conn(struct Curl_easy *data, data->set.proxy_ssl.primary.cert_blob = data->set.blobs[BLOB_CERT_PROXY]; data->set.proxy_ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE_PROXY]; data->set.proxy_ssl.issuercert = data->set.str[STRING_SSL_ISSUERCERT_PROXY]; - data->set.proxy_ssl.cert = data->set.str[STRING_CERT_PROXY]; data->set.proxy_ssl.cert_type = data->set.str[STRING_CERT_TYPE_PROXY]; data->set.proxy_ssl.key = data->set.str[STRING_KEY_PROXY]; data->set.proxy_ssl.key_type = data->set.str[STRING_KEY_TYPE_PROXY]; data->set.proxy_ssl.key_passwd = data->set.str[STRING_KEY_PASSWD_PROXY]; data->set.proxy_ssl.primary.clientcert = data->set.str[STRING_CERT_PROXY]; - data->set.proxy_ssl.cert_blob = data->set.blobs[BLOB_CERT_PROXY]; data->set.proxy_ssl.key_blob = data->set.blobs[BLOB_KEY_PROXY]; #endif data->set.ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE_ORIG]; data->set.ssl.issuercert = data->set.str[STRING_SSL_ISSUERCERT_ORIG]; - data->set.ssl.cert = data->set.str[STRING_CERT_ORIG]; data->set.ssl.cert_type = data->set.str[STRING_CERT_TYPE_ORIG]; data->set.ssl.key = data->set.str[STRING_KEY_ORIG]; data->set.ssl.key_type = data->set.str[STRING_KEY_TYPE_ORIG]; @@ -3653,7 +3676,6 @@ static CURLcode create_conn(struct Curl_easy *data, #endif #endif - data->set.ssl.cert_blob = data->set.blobs[BLOB_CERT_ORIG]; data->set.ssl.key_blob = data->set.blobs[BLOB_KEY_ORIG]; data->set.ssl.issuercert_blob = data->set.blobs[BLOB_SSL_ISSUERCERT_ORIG]; @@ -3752,8 +3774,7 @@ static CURLcode create_conn(struct Curl_easy *data, CONNCACHE_UNLOCK(data); if(conn_candidate) - (void)Curl_disconnect(data, conn_candidate, - /* dead_connection */ FALSE); + (void)Curl_disconnect(data, conn_candidate, FALSE); else { infof(data, "No more connections allowed to host %s: %zu\n", bundlehost, max_host_connections); @@ -3773,8 +3794,7 @@ static CURLcode create_conn(struct Curl_easy *data, /* The cache is full. Let's see if we can kill a connection. */ conn_candidate = Curl_conncache_extract_oldest(data); if(conn_candidate) - (void)Curl_disconnect(data, conn_candidate, - /* dead_connection */ FALSE); + (void)Curl_disconnect(data, conn_candidate, FALSE); else { infof(data, "No connections available in cache\n"); connections_available = FALSE; @@ -4026,113 +4046,3 @@ CURLcode Curl_init_do(struct Curl_easy *data, struct connectdata *conn) return CURLE_OK; } - -/* -* get_protocol_family() -* -* This is used to return the protocol family for a given protocol. -* -* Parameters: -* -* protocol [in] - A single bit protocol identifier such as HTTP or HTTPS. -* -* Returns the family as a single bit protocol identifier. -*/ - -static unsigned int get_protocol_family(unsigned int protocol) -{ - unsigned int family; - - switch(protocol) { - case CURLPROTO_HTTP: - case CURLPROTO_HTTPS: - family = CURLPROTO_HTTP; - break; - - case CURLPROTO_FTP: - case CURLPROTO_FTPS: - family = CURLPROTO_FTP; - break; - - case CURLPROTO_SCP: - family = CURLPROTO_SCP; - break; - - case CURLPROTO_SFTP: - family = CURLPROTO_SFTP; - break; - - case CURLPROTO_TELNET: - family = CURLPROTO_TELNET; - break; - - case CURLPROTO_LDAP: - case CURLPROTO_LDAPS: - family = CURLPROTO_LDAP; - break; - - case CURLPROTO_DICT: - family = CURLPROTO_DICT; - break; - - case CURLPROTO_FILE: - family = CURLPROTO_FILE; - break; - - case CURLPROTO_TFTP: - family = CURLPROTO_TFTP; - break; - - case CURLPROTO_IMAP: - case CURLPROTO_IMAPS: - family = CURLPROTO_IMAP; - break; - - case CURLPROTO_POP3: - case CURLPROTO_POP3S: - family = CURLPROTO_POP3; - break; - - case CURLPROTO_SMTP: - case CURLPROTO_SMTPS: - family = CURLPROTO_SMTP; - break; - - case CURLPROTO_RTSP: - family = CURLPROTO_RTSP; - break; - - case CURLPROTO_RTMP: - case CURLPROTO_RTMPS: - family = CURLPROTO_RTMP; - break; - - case CURLPROTO_RTMPT: - case CURLPROTO_RTMPTS: - family = CURLPROTO_RTMPT; - break; - - case CURLPROTO_RTMPE: - family = CURLPROTO_RTMPE; - break; - - case CURLPROTO_RTMPTE: - family = CURLPROTO_RTMPTE; - break; - - case CURLPROTO_GOPHER: - family = CURLPROTO_GOPHER; - break; - - case CURLPROTO_SMB: - case CURLPROTO_SMBS: - family = CURLPROTO_SMB; - break; - - default: - family = 0; - break; - } - - return family; -} diff --git a/libs/libcurl/src/urlapi.c b/libs/libcurl/src/urlapi.c index acbfb82875..88b7f042f4 100644 --- a/libs/libcurl/src/urlapi.c +++ b/libs/libcurl/src/urlapi.c @@ -1255,8 +1255,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what, return CURLUE_UNKNOWN_PART; } if(storep && *storep) { - free(*storep); - *storep = NULL; + Curl_safefree(*storep); } return CURLUE_OK; } @@ -1284,8 +1283,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what, break; case CURLUPART_HOST: storep = &u->host; - free(u->zoneid); - u->zoneid = NULL; + Curl_safefree(u->zoneid); break; case CURLUPART_ZONEID: storep = &u->zoneid; diff --git a/libs/libcurl/src/urldata.h b/libs/libcurl/src/urldata.h index 0ae9269275..5ee81770ea 100644 --- a/libs/libcurl/src/urldata.h +++ b/libs/libcurl/src/urldata.h @@ -76,9 +76,7 @@ /* length of longest IPv6 address string including the trailing null */ #define MAX_IPADR_LEN sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") -/* Default FTP/IMAP etc response timeout in milliseconds. - Symbian OS panics when given a timeout much greater than 1/2 hour. -*/ +/* Default FTP/IMAP etc response timeout in milliseconds */ #define RESP_TIMEOUT (120*1000) /* Max string input length is a precaution against abuse and to detect junk @@ -230,6 +228,7 @@ struct ssl_primary_config { char *cipher_list13; /* list of TLS 1.3 cipher suites to use */ char *pinned_key; struct curl_blob *cert_blob; + char *curves; /* list of curves to use */ BIT(verifypeer); /* set TRUE if this is desired */ BIT(verifyhost); /* set TRUE if CN/SAN must match hostname */ BIT(verifystatus); /* set TRUE if certificate status must be checked */ @@ -244,8 +243,6 @@ struct ssl_config_data { struct curl_blob *issuercert_blob; curl_ssl_ctx_callback fsslctx; /* function to initialize ssl ctx */ void *fsslctxp; /* parameter for call back */ - char *cert; /* client certificate file name */ - struct curl_blob *cert_blob; char *cert_type; /* format for certificate (default: PEM)*/ char *key; /* private key file name */ struct curl_blob *key_blob; @@ -271,7 +268,7 @@ struct ssl_general_config { }; /* information stored about one single SSL session */ -struct curl_ssl_session { +struct Curl_ssl_session { char *name; /* host name for which this ID was used */ char *conn_to_host; /* host name for the connection (may be NULL) */ const char *scheme; /* protocol scheme used */ @@ -472,6 +469,7 @@ struct ConnectBits { EPRT doesn't work we disable it for the forthcoming requests */ BIT(ftp_use_data_ssl); /* Enabled SSL for the data connection */ + BIT(ftp_use_control_ssl); /* Enabled SSL for the control connection */ #endif BIT(netrc); /* name+password provided by netrc */ BIT(bound); /* set true if bind() has already been done on this socket/ @@ -740,6 +738,8 @@ struct Curl_handler { long defport; /* Default port. */ unsigned int protocol; /* See CURLPROTO_* - this needs to be the single specific protocol bit */ + unsigned int family; /* single bit for protocol family; basically the + non-TLS name of the protocol this is */ unsigned int flags; /* Extra particular characteristics, see PROTOPT_* */ }; @@ -860,7 +860,7 @@ struct connectdata { connection is used! */ struct Curl_easy *data; struct connstate cnnct; - struct curl_llist_element bundle_node; /* conncache */ + struct Curl_llist_element bundle_node; /* conncache */ /* chunk is for HTTP chunked encoding, but is in the general connectdata struct only because we can do just about any protocol through a HTTP proxy @@ -1024,7 +1024,7 @@ struct connectdata { struct kerberos5data krb5; /* variables into the structure definition, */ #endif /* however, some of them are ftp specific. */ - struct curl_llist easyq; /* List of easy handles using this connection */ + struct Curl_llist easyq; /* List of easy handles using this connection */ curl_seek_callback seek_func; /* function that seeks the input */ void *seek_client; /* pointer to pass to the seek() above */ @@ -1134,6 +1134,7 @@ struct PureInfo { OpenSSL, GnuTLS, Schannel, NSS and GSKit builds. Asked for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */ + CURLproxycode pxcode; BIT(timecond); /* set to TRUE if the time condition didn't match, which thus made the document NOT get fetched */ }; @@ -1274,7 +1275,7 @@ typedef enum { * One instance for each timeout an easy handle can set. */ struct time_node { - struct curl_llist_element list; + struct Curl_llist_element list; struct curltime time; expire_id eid; }; @@ -1314,7 +1315,7 @@ struct UrlState { strdup() data. */ int first_remote_port; /* remote port of the first (not followed) request */ - struct curl_ssl_session *session; /* array of 'max_ssl_sessions' size */ + struct Curl_ssl_session *session; /* array of 'max_ssl_sessions' size */ long sessionage; /* number of the most recent session */ unsigned int tempcount; /* number of entries in use in tempwrite, 0 - 3 */ struct tempbuf tempwrite[3]; /* BOTH, HEADER, BODY */ @@ -1338,7 +1339,7 @@ struct UrlState { #endif /* USE_OPENSSL */ struct curltime expiretime; /* set this with Curl_expire() only */ struct Curl_tree timenode; /* for the splay stuff */ - struct curl_llist timeoutlist; /* list of pending timeouts */ + struct Curl_llist timeoutlist; /* list of pending timeouts */ struct time_node expires[EXPIRE_LAST]; /* nodes for each expire type */ /* a place to store the most recently set FTP entrypath */ @@ -1347,8 +1348,7 @@ struct UrlState { int httpversion; /* the lowest HTTP version*10 reported by any server involved in this request */ -#if !defined(WIN32) && !defined(MSDOS) && !defined(__EMX__) && \ - !defined(__SYMBIAN32__) +#if !defined(WIN32) && !defined(MSDOS) && !defined(__EMX__) /* do FTP line-end conversions on most platforms */ #define CURL_DO_LINEEND_CONV /* for FTP downloads: track CRLF sequences that span blocks */ @@ -1564,6 +1564,7 @@ enum dupstring { STRING_DNS_INTERFACE, STRING_DNS_LOCAL_IP4, STRING_DNS_LOCAL_IP6, + STRING_SSL_EC_CURVES, /* -- end of null-terminated strings -- */ @@ -1839,7 +1840,7 @@ struct UserDefined { }; struct Names { - struct curl_hash *hostcache; + struct Curl_hash *hostcache; enum { HCACHE_NONE, /* not pointing to anything */ HCACHE_MULTI, /* points to a shared one in the multi handle */ @@ -1863,8 +1864,8 @@ struct Curl_easy { struct Curl_easy *prev; struct connectdata *conn; - struct curl_llist_element connect_queue; - struct curl_llist_element conn_queue; /* list per connectdata */ + struct Curl_llist_element connect_queue; + struct Curl_llist_element conn_queue; /* list per connectdata */ CURLMstate mstate; /* the handle's state */ CURLcode result; /* previous result */ diff --git a/libs/libcurl/src/version.c b/libs/libcurl/src/version.c index 4f6dda24fe..bdeba88357 100644 --- a/libs/libcurl/src/version.c +++ b/libs/libcurl/src/version.c @@ -31,8 +31,8 @@ #include "curl_printf.h" #ifdef USE_ARES -# if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \ - (defined(WIN32) || defined(__SYMBIAN32__)) +# if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \ + defined(WIN32) # define CARES_STATICLIB # endif # include @@ -56,10 +56,6 @@ #ifdef HAVE_ZLIB_H #include -#ifdef __SYMBIAN32__ -/* zlib pollutes the namespace with this definition */ -#undef WIN32 -#endif #endif #ifdef HAVE_BROTLI @@ -298,7 +294,7 @@ static const char * const protocols[] = { "ldaps", #endif #endif -#ifdef CURL_ENABLE_MQTT +#ifndef CURL_DISABLE_MQTT "mqtt", #endif #ifndef CURL_DISABLE_POP3 @@ -319,9 +315,8 @@ static const char * const protocols[] = { #ifdef USE_SSH "sftp", #endif -#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \ - (CURL_SIZEOF_CURL_OFF_T > 4) && \ - (!defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)) +#if !defined(CURL_DISABLE_SMB) && defined(USE_CURL_NTLM_CORE) && \ + (CURL_SIZEOF_CURL_OFF_T > 4) "smb", # ifdef USE_SSL "smbs", @@ -475,11 +470,13 @@ curl_version_info_data *curl_version_info(CURLversion stamp) #ifdef USE_SSL Curl_ssl_version(ssl_buffer, sizeof(ssl_buffer)); version_info.ssl_version = ssl_buffer; +#ifndef CURL_DISABLE_PROXY if(Curl_ssl->supports & SSLSUPP_HTTPS_PROXY) version_info.features |= CURL_VERSION_HTTPS_PROXY; else version_info.features &= ~CURL_VERSION_HTTPS_PROXY; #endif +#endif #ifdef HAVE_LIBZ version_info.libz_version = zlibVersion(); diff --git a/libs/libcurl/src/vquic/ngtcp2.c b/libs/libcurl/src/vquic/ngtcp2.c index 20ee08dd65..c076b7c3e7 100644 --- a/libs/libcurl/src/vquic/ngtcp2.c +++ b/libs/libcurl/src/vquic/ngtcp2.c @@ -798,7 +798,7 @@ CURLcode Curl_quic_connect(struct connectdata *conn, infof(data, "Connect socket %d over QUIC to %s:%ld\n", sockfd, ipbuf, port); - qs->version = NGTCP2_PROTO_VER; + qs->version = NGTCP2_PROTO_VER_MAX; #ifdef USE_OPENSSL qs->sslctx = quic_ssl_ctx(data); if(!qs->sslctx) @@ -831,13 +831,9 @@ CURLcode Curl_quic_connect(struct connectdata *conn, ngtcp2_addr_init(&path.local, &qs->local_addr, qs->local_addrlen, NULL); ngtcp2_addr_init(&path.remote, addr, addrlen, NULL); -#ifdef NGTCP2_PROTO_VER -#define QUICVER NGTCP2_PROTO_VER -#else -#error "unsupported ngtcp2 version" -#endif - rc = ngtcp2_conn_client_new(&qs->qconn, &qs->dcid, &qs->scid, &path, QUICVER, - &ng_callbacks, &qs->settings, NULL, qs); + rc = ngtcp2_conn_client_new(&qs->qconn, &qs->dcid, &qs->scid, &path, + NGTCP2_PROTO_VER_MAX, &ng_callbacks, + &qs->settings, NULL, qs); if(rc) return CURLE_QUIC_CONNECT_ERROR; @@ -954,6 +950,7 @@ static const struct Curl_handler Curl_handler_http3 = { ng_conncheck, /* connection_check */ PORT_HTTP, /* defport */ CURLPROTO_HTTPS, /* protocol */ + CURLPROTO_HTTP, /* family */ PROTOPT_SSL | PROTOPT_STREAM /* flags */ }; @@ -1729,6 +1726,7 @@ static CURLcode ng_process_ingress(struct connectdata *conn, int sockfd, socklen_t remote_addrlen; ngtcp2_path path; ngtcp2_tstamp ts = timestamp(); + ngtcp2_pkt_info pi = { 0 }; for(;;) { remote_addrlen = sizeof(remote_addr); @@ -1750,7 +1748,7 @@ static CURLcode ng_process_ingress(struct connectdata *conn, int sockfd, ngtcp2_addr_init(&path.remote, (struct sockaddr *)&remote_addr, remote_addrlen, NULL); - rv = ngtcp2_conn_read_pkt(qs->qconn, &path, buf, recvd, ts); + rv = ngtcp2_conn_read_pkt(qs->qconn, &path, &pi, buf, recvd, ts); if(rv != 0) { /* TODO Send CONNECTION_CLOSE if possible */ return CURLE_RECV_ERROR; @@ -1815,7 +1813,7 @@ static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd, uint32_t flags = NGTCP2_WRITE_STREAM_FLAG_MORE | (fin ? NGTCP2_WRITE_STREAM_FLAG_FIN : 0); outlen = - ngtcp2_conn_writev_stream(qs->qconn, &ps.path, + ngtcp2_conn_writev_stream(qs->qconn, &ps.path, NULL, out, pktlen, &ndatalen, flags, stream_id, (const ngtcp2_vec *)vec, veccnt, ts); @@ -1860,7 +1858,8 @@ static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd, } } if(outlen < 0) { - outlen = ngtcp2_conn_write_pkt(qs->qconn, &ps.path, out, pktlen, ts); + outlen = ngtcp2_conn_write_pkt(qs->qconn, &ps.path, NULL, + out, pktlen, ts); if(outlen < 0) { failf(conn->data, "ngtcp2_conn_write_pkt returned error: %s\n", ngtcp2_strerror((int)outlen)); diff --git a/libs/libcurl/src/vquic/quiche.c b/libs/libcurl/src/vquic/quiche.c index fd9cb8bd34..f52e9da325 100644 --- a/libs/libcurl/src/vquic/quiche.c +++ b/libs/libcurl/src/vquic/quiche.c @@ -154,6 +154,7 @@ static const struct Curl_handler Curl_handler_http3 = { quiche_conncheck, /* connection_check */ PORT_HTTP, /* defport */ CURLPROTO_HTTPS, /* protocol */ + CURLPROTO_HTTP, /* family */ PROTOPT_SSL | PROTOPT_STREAM /* flags */ }; diff --git a/libs/libcurl/src/vssh/libssh.c b/libs/libcurl/src/vssh/libssh.c index 8988e2392d..acdb4e7534 100644 --- a/libs/libcurl/src/vssh/libssh.c +++ b/libs/libcurl/src/vssh/libssh.c @@ -158,6 +158,7 @@ const struct Curl_handler Curl_handler_scp = { ZERO_NULL, /* connection_check */ PORT_SSH, /* defport */ CURLPROTO_SCP, /* protocol */ + CURLPROTO_SCP, /* family */ PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY /* flags */ }; @@ -183,6 +184,7 @@ const struct Curl_handler Curl_handler_sftp = { ZERO_NULL, /* connection_check */ PORT_SSH, /* defport */ CURLPROTO_SFTP, /* protocol */ + CURLPROTO_SFTP, /* family */ PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY /* flags */ }; @@ -2692,7 +2694,9 @@ static void sftp_quote(struct connectdata *conn) */ if(strncasecompare(cmd, "chgrp ", 6) || strncasecompare(cmd, "chmod ", 6) || - strncasecompare(cmd, "chown ", 6)) { + strncasecompare(cmd, "chown ", 6) || + strncasecompare(cmd, "atime ", 6) || + strncasecompare(cmd, "mtime ", 6)) { /* attribute change */ /* sshc->quote_path1 contains the mode to set */ @@ -2702,7 +2706,7 @@ static void sftp_quote(struct connectdata *conn) if(result == CURLE_OUT_OF_MEMORY) failf(data, "Out of memory"); else - failf(data, "Syntax error in chgrp/chmod/chown: " + failf(data, "Syntax error in chgrp/chmod/chown/atime/mtime: " "Bad second parameter"); Curl_safefree(sshc->quote_path1); state(conn, SSH_SFTP_CLOSE); @@ -2863,6 +2867,34 @@ static void sftp_quote_stat(struct connectdata *conn) } sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_UIDGID; } + else if(strncasecompare(cmd, "atime", 5)) { + time_t date = Curl_getdate_capped(sshc->quote_path1); + if(date == -1) { + Curl_safefree(sshc->quote_path1); + Curl_safefree(sshc->quote_path2); + failf(data, "Syntax error: incorrect access date format"); + state(conn, SSH_SFTP_CLOSE); + sshc->nextstate = SSH_NO_STATE; + sshc->actualcode = CURLE_QUOTE_ERROR; + return; + } + sshc->quote_attrs->atime = (uint32_t)date; + sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_ACMODTIME; + } + else if(strncasecompare(cmd, "mtime", 5)) { + time_t date = Curl_getdate_capped(sshc->quote_path1); + if(date == -1) { + Curl_safefree(sshc->quote_path1); + Curl_safefree(sshc->quote_path2); + failf(data, "Syntax error: incorrect modification date format"); + state(conn, SSH_SFTP_CLOSE); + sshc->nextstate = SSH_NO_STATE; + sshc->actualcode = CURLE_QUOTE_ERROR; + return; + } + sshc->quote_attrs->mtime = (uint32_t)date; + sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_ACMODTIME; + } /* Now send the completed structure... */ state(conn, SSH_SFTP_QUOTE_SETSTAT); diff --git a/libs/libcurl/src/vssh/libssh2.c b/libs/libcurl/src/vssh/libssh2.c index 4f56bb44ce..d983cc9a9c 100644 --- a/libs/libcurl/src/vssh/libssh2.c +++ b/libs/libcurl/src/vssh/libssh2.c @@ -150,6 +150,7 @@ const struct Curl_handler Curl_handler_scp = { ZERO_NULL, /* connection_check */ PORT_SSH, /* defport */ CURLPROTO_SCP, /* protocol */ + CURLPROTO_SCP, /* family */ PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY /* flags */ }; @@ -177,6 +178,7 @@ const struct Curl_handler Curl_handler_sftp = { ZERO_NULL, /* connection_check */ PORT_SSH, /* defport */ CURLPROTO_SFTP, /* protocol */ + CURLPROTO_SFTP, /* family */ PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY /* flags */ }; @@ -442,6 +444,7 @@ static CURLcode ssh_knownhost(struct connectdata *conn) if(data->set.str[STRING_SSH_KNOWNHOSTS]) { /* we're asked to verify the host against a file */ struct ssh_conn *sshc = &conn->proto.sshc; + struct libssh2_knownhost *host = NULL; int rc; int keytype; size_t keylen; @@ -456,7 +459,6 @@ static CURLcode ssh_knownhost(struct connectdata *conn) * What host name does OpenSSH store in its file if an IDN name is * used? */ - struct libssh2_knownhost *host; enum curl_khmatch keymatch; curl_sshkeycallback func = data->set.ssh_keyfunc?data->set.ssh_keyfunc:sshkeycallback; @@ -568,7 +570,13 @@ static CURLcode ssh_knownhost(struct connectdata *conn) /* DEFER means bail out but keep the SSH_HOSTKEY state */ result = sshc->actualcode = CURLE_PEER_FAILED_VERIFICATION; break; + case CURLKHSTAT_FINE_REPLACE: + /* remove old host+key that doesn't match */ + if(host) + libssh2_knownhost_del(sshc->kh, host); + /*FALLTHROUGH*/ case CURLKHSTAT_FINE: + /*FALLTHROUGH*/ case CURLKHSTAT_FINE_ADD_TO_FILE: /* proceed */ if(keycheck != LIBSSH2_KNOWNHOST_CHECK_MATCH) { @@ -583,7 +591,8 @@ static CURLcode ssh_knownhost(struct connectdata *conn) if(addrc) infof(data, "Warning adding the known host %s failed!\n", conn->host.name); - else if(rc == CURLKHSTAT_FINE_ADD_TO_FILE) { + else if(rc == CURLKHSTAT_FINE_ADD_TO_FILE || + rc == CURLKHSTAT_FINE_REPLACE) { /* now we write the entire in-memory list of known hosts to the known_hosts file */ int wrc = @@ -814,6 +823,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) result = ssh_force_knownhost_key_type(conn); if(result) { state(conn, SSH_SESSION_FREE); + sshc->actualcode = result; break; } @@ -1390,7 +1400,9 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) */ if(strncasecompare(cmd, "chgrp ", 6) || strncasecompare(cmd, "chmod ", 6) || - strncasecompare(cmd, "chown ", 6) ) { + strncasecompare(cmd, "chown ", 6) || + strncasecompare(cmd, "atime ", 6) || + strncasecompare(cmd, "mtime ", 6)) { /* attribute change */ /* sshc->quote_path1 contains the mode to set */ @@ -1587,6 +1599,34 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) break; } } + else if(strncasecompare(cmd, "atime", 5)) { + time_t date = Curl_getdate_capped(sshc->quote_path1); + if(date == -1) { + Curl_safefree(sshc->quote_path1); + Curl_safefree(sshc->quote_path2); + failf(data, "Syntax error: incorrect access date format"); + state(conn, SSH_SFTP_CLOSE); + sshc->nextstate = SSH_NO_STATE; + sshc->actualcode = CURLE_QUOTE_ERROR; + break; + } + sshc->quote_attrs.atime = (unsigned long)date; + sshc->quote_attrs.flags = LIBSSH2_SFTP_ATTR_ACMODTIME; + } + else if(strncasecompare(cmd, "mtime", 5)) { + time_t date = Curl_getdate_capped(sshc->quote_path1); + if(date == -1) { + Curl_safefree(sshc->quote_path1); + Curl_safefree(sshc->quote_path2); + failf(data, "Syntax error: incorrect modification date format"); + state(conn, SSH_SFTP_CLOSE); + sshc->nextstate = SSH_NO_STATE; + sshc->actualcode = CURLE_QUOTE_ERROR; + break; + } + sshc->quote_attrs.mtime = (unsigned long)date; + sshc->quote_attrs.flags = LIBSSH2_SFTP_ATTR_ACMODTIME; + } /* Now send the completed structure... */ state(conn, SSH_SFTP_QUOTE_SETSTAT); @@ -2999,6 +3039,42 @@ static CURLcode ssh_setup_connection(struct connectdata *conn) static Curl_recv scp_recv, sftp_recv; static Curl_send scp_send, sftp_send; +static ssize_t ssh_tls_recv(libssh2_socket_t sock, void *buffer, + size_t length, int flags, void **abstract) +{ + struct connectdata *conn = (struct connectdata *)*abstract; + ssize_t nread; + CURLcode result; + (void)flags; + + result = Curl_read(conn, sock, buffer, length, &nread); + if(result == CURLE_AGAIN) + return -EAGAIN; /* magic return code for libssh2 */ + else if(result) + return -1; /* generic error */ + if(conn->data->set.verbose) + Curl_debug(conn->data, CURLINFO_DATA_IN, (char *)buffer, (size_t)nread); + return nread; +} + +static ssize_t ssh_tls_send(libssh2_socket_t sock, const void *buffer, + size_t length, int flags, void **abstract) +{ + struct connectdata *conn = (struct connectdata *)*abstract; + ssize_t nwrite; + CURLcode result; + (void)flags; + + result = Curl_write(conn, sock, buffer, length, &nwrite); + if(result == CURLE_AGAIN) + return -EAGAIN; /* magic return code for libssh2 */ + else if(result) + return -1; /* error */ + if(conn->data->set.verbose) + Curl_debug(conn->data, CURLINFO_DATA_OUT, (char *)buffer, (size_t)nwrite); + return nwrite; +} + /* * Curl_ssh_connect() gets called from Curl_protocol_connect() to allow us to * do protocol-specific actions at connect-time. @@ -3020,14 +3096,6 @@ static CURLcode ssh_connect(struct connectdata *conn, bool *done) function to make the re-use checks properly be able to check this bit. */ connkeep(conn, "SSH default"); - if(conn->handler->protocol & CURLPROTO_SCP) { - conn->recv[FIRSTSOCKET] = scp_recv; - conn->send[FIRSTSOCKET] = scp_send; - } - else { - conn->recv[FIRSTSOCKET] = sftp_recv; - conn->send[FIRSTSOCKET] = sftp_send; - } ssh = &conn->proto.sshc; #ifdef CURL_LIBSSH2_DEBUG @@ -3048,6 +3116,53 @@ static CURLcode ssh_connect(struct connectdata *conn, bool *done) return CURLE_FAILED_INIT; } + if(conn->http_proxy.proxytype == CURLPROXY_HTTPS) { + /* + * This crazy union dance is here to avoid assigning a void pointer a + * function pointer as it is invalid C. The problem is of course that + * libssh2 has such an API... + */ + union receive { + void *recvp; + ssize_t (*recvptr)(libssh2_socket_t, void *, size_t, int, void **); + }; + union transfer { + void *sendp; + ssize_t (*sendptr)(libssh2_socket_t, const void *, size_t, int, void **); + }; + union receive sshrecv; + union transfer sshsend; + + sshrecv.recvptr = ssh_tls_recv; + sshsend.sendptr = ssh_tls_send; + + infof(data, "Uses HTTPS proxy!\n"); + /* + Setup libssh2 callbacks to make it read/write TLS from the socket. + + ssize_t + recvcb(libssh2_socket_t sock, void *buffer, size_t length, + int flags, void **abstract); + + ssize_t + sendcb(libssh2_socket_t sock, const void *buffer, size_t length, + int flags, void **abstract); + + */ + libssh2_session_callback_set(ssh->ssh_session, + LIBSSH2_CALLBACK_RECV, sshrecv.recvp); + libssh2_session_callback_set(ssh->ssh_session, + LIBSSH2_CALLBACK_SEND, sshsend.sendp); + } + else if(conn->handler->protocol & CURLPROTO_SCP) { + conn->recv[FIRSTSOCKET] = scp_recv; + conn->send[FIRSTSOCKET] = scp_send; + } + else { + conn->recv[FIRSTSOCKET] = sftp_recv; + conn->send[FIRSTSOCKET] = sftp_send; + } + if(data->set.ssh_compression) { #if LIBSSH2_VERSION_NUM >= 0x010208 if(libssh2_session_flag(ssh->ssh_session, LIBSSH2_FLAG_COMPRESS, 1) < 0) diff --git a/libs/libcurl/src/vtls/gskit.c b/libs/libcurl/src/vtls/gskit.c index 0538e4a463..dc79f487c8 100644 --- a/libs/libcurl/src/vtls/gskit.c +++ b/libs/libcurl/src/vtls/gskit.c @@ -705,7 +705,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex) int rc; const char * const keyringfile = SSL_CONN_CONFIG(CAfile); const char * const keyringpwd = SSL_SET_OPTION(key_passwd); - const char * const keyringlabel = SSL_SET_OPTION(cert); + const char * const keyringlabel = SSL_SET_OPTION(primary.clientcert); const long int ssl_version = SSL_CONN_CONFIG(version); const bool verifypeer = SSL_CONN_CONFIG(verifypeer); const char * const hostname = SSL_IS_PROXY()? conn->http_proxy.host.name: diff --git a/libs/libcurl/src/vtls/gtls.c b/libs/libcurl/src/vtls/gtls.c index 16b0bd6cb5..ec3f8599b0 100644 --- a/libs/libcurl/src/vtls/gtls.c +++ b/libs/libcurl/src/vtls/gtls.c @@ -81,7 +81,7 @@ static bool gtls_inited = FALSE; struct ssl_backend_data { gnutls_session_t session; gnutls_certificate_credentials_t cred; -#ifdef USE_TLS_SRP +#ifdef HAVE_GNUTLS_SRP gnutls_srp_client_credentials_t srp_client_cred; #endif }; @@ -304,7 +304,7 @@ static gnutls_x509_crt_fmt_t do_file_type(const char *type) return GNUTLS_X509_FMT_PEM; if(strcasecompare(type, "DER")) return GNUTLS_X509_FMT_DER; - return -1; + return GNUTLS_X509_FMT_PEM; /* default to PEM */ } #define GNUTLS_CIPHERS "NORMAL:-ARCFOUR-128:-CTYPE-ALL:+CTYPE-X509" @@ -399,15 +399,8 @@ gtls_connect_step1(struct connectdata *conn, #endif const char *prioritylist; const char *err = NULL; -#ifndef CURL_DISABLE_PROXY - const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name : - conn->host.name; - long * const certverifyresult = SSL_IS_PROXY() ? - &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult; -#else - const char * const hostname = conn->host.name; - long * const certverifyresult = &data->set.ssl.certverifyresult; -#endif + const char * const hostname = SSL_HOST_NAME(); + long * const certverifyresult = &SSL_SET_OPTION_LVALUE(certverifyresult); if(connssl->state == ssl_connection_complete) /* to make us tolerant against being called more than once for the @@ -434,7 +427,7 @@ gtls_connect_step1(struct connectdata *conn, return CURLE_SSL_CONNECT_ERROR; } -#ifdef USE_TLS_SRP +#ifdef HAVE_GNUTLS_SRP if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP) { infof(data, "Using TLS-SRP username: %s\n", SSL_SET_OPTION(username)); @@ -588,7 +581,7 @@ gtls_connect_step1(struct connectdata *conn, return CURLE_SSL_CONNECT_ERROR; } -#ifdef USE_TLS_SRP +#ifdef HAVE_GNUTLS_SRP /* Only add SRP to the cipher list if SRP is requested. Otherwise * GnuTLS will disable TLS 1.3 support. */ if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP) { @@ -610,7 +603,7 @@ gtls_connect_step1(struct connectdata *conn, else { #endif rc = gnutls_priority_set_direct(session, prioritylist, &err); -#ifdef USE_TLS_SRP +#ifdef HAVE_GNUTLS_SRP } #endif @@ -645,7 +638,7 @@ gtls_connect_step1(struct connectdata *conn, gnutls_alpn_set_protocols(session, protocols, cur, 0); } - if(SSL_SET_OPTION(cert)) { + if(SSL_SET_OPTION(primary.clientcert)) { if(SSL_SET_OPTION(key_passwd)) { const unsigned int supported_key_encryption_algorithms = GNUTLS_PKCS_USE_PKCS12_3DES | GNUTLS_PKCS_USE_PKCS12_ARCFOUR | @@ -654,9 +647,9 @@ gtls_connect_step1(struct connectdata *conn, GNUTLS_PKCS_USE_PBES2_AES_256; rc = gnutls_certificate_set_x509_key_file2( backend->cred, - SSL_SET_OPTION(cert), + SSL_SET_OPTION(primary.clientcert), SSL_SET_OPTION(key) ? - SSL_SET_OPTION(key) : SSL_SET_OPTION(cert), + SSL_SET_OPTION(key) : SSL_SET_OPTION(primary.clientcert), do_file_type(SSL_SET_OPTION(cert_type)), SSL_SET_OPTION(key_passwd), supported_key_encryption_algorithms); @@ -670,9 +663,9 @@ gtls_connect_step1(struct connectdata *conn, else { if(gnutls_certificate_set_x509_key_file( backend->cred, - SSL_SET_OPTION(cert), + SSL_SET_OPTION(primary.clientcert), SSL_SET_OPTION(key) ? - SSL_SET_OPTION(key) : SSL_SET_OPTION(cert), + SSL_SET_OPTION(key) : SSL_SET_OPTION(primary.clientcert), do_file_type(SSL_SET_OPTION(cert_type)) ) != GNUTLS_E_SUCCESS) { failf(data, "error reading X.509 key or certificate file"); @@ -681,7 +674,7 @@ gtls_connect_step1(struct connectdata *conn, } } -#ifdef USE_TLS_SRP +#ifdef HAVE_GNUTLS_SRP /* put the credentials to the current session */ if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP) { rc = gnutls_credentials_set(session, GNUTLS_CRD_SRP, @@ -839,15 +832,8 @@ gtls_connect_step3(struct connectdata *conn, unsigned int bits; gnutls_protocol_t version = gnutls_protocol_get_version(session); #endif -#ifndef CURL_DISABLE_PROXY - const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name : - conn->host.name; - long * const certverifyresult = SSL_IS_PROXY() ? - &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult; -#else - const char * const hostname = conn->host.name; - long * const certverifyresult = &data->set.ssl.certverifyresult; -#endif + const char * const hostname = SSL_HOST_NAME(); + long * const certverifyresult = &SSL_SET_OPTION_LVALUE(certverifyresult); /* the name of the cipher suite used, e.g. ECDHE_RSA_AES_256_GCM_SHA384. */ ptr = gnutls_cipher_suite_get_name(gnutls_kx_get(session), @@ -868,7 +854,7 @@ gtls_connect_step3(struct connectdata *conn, if(SSL_CONN_CONFIG(verifypeer) || SSL_CONN_CONFIG(verifyhost) || SSL_SET_OPTION(issuercert)) { -#ifdef USE_TLS_SRP +#ifdef HAVE_GNUTLS_SRP if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP && SSL_SET_OPTION(username) != NULL && !SSL_CONN_CONFIG(verifypeer) @@ -881,7 +867,7 @@ gtls_connect_step3(struct connectdata *conn, failf(data, "failed to get server cert"); *certverifyresult = GNUTLS_E_NO_CERTIFICATE_FOUND; return CURLE_PEER_FAILED_VERIFICATION; -#ifdef USE_TLS_SRP +#ifdef HAVE_GNUTLS_SRP } #endif } @@ -1128,22 +1114,15 @@ gtls_connect_step3(struct connectdata *conn, } #endif if(!rc) { -#ifndef CURL_DISABLE_PROXY - const char * const dispname = SSL_IS_PROXY() ? - conn->http_proxy.host.dispname : conn->host.dispname; -#else - const char * const dispname = conn->host.dispname; -#endif - if(SSL_CONN_CONFIG(verifyhost)) { failf(data, "SSL: certificate subject name (%s) does not match " - "target host name '%s'", certname, dispname); + "target host name '%s'", certname, SSL_HOST_DISPNAME()); gnutls_x509_crt_deinit(x509_cert); return CURLE_PEER_FAILED_VERIFICATION; } else infof(data, "\t common name: %s (does not match '%s')\n", - certname, dispname); + certname, SSL_HOST_DISPNAME()); } else infof(data, "\t common name: %s (matched)\n", certname); @@ -1448,7 +1427,7 @@ static void close_one(struct ssl_connect_data *connssl) gnutls_certificate_free_credentials(backend->cred); backend->cred = NULL; } -#ifdef USE_TLS_SRP +#ifdef HAVE_GNUTLS_SRP if(backend->srp_client_cred) { gnutls_srp_free_client_credentials(backend->srp_client_cred); backend->srp_client_cred = NULL; @@ -1530,7 +1509,7 @@ static int Curl_gtls_shutdown(struct connectdata *conn, int sockindex) } gnutls_certificate_free_credentials(backend->cred); -#ifdef USE_TLS_SRP +#ifdef HAVE_GNUTLS_SRP if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP && SSL_SET_OPTION(username) != NULL) gnutls_srp_free_client_credentials(backend->srp_client_cred); diff --git a/libs/libcurl/src/vtls/mbedtls.c b/libs/libcurl/src/vtls/mbedtls.c index 545f824c62..4e5f6574f1 100644 --- a/libs/libcurl/src/vtls/mbedtls.c +++ b/libs/libcurl/src/vtls/mbedtls.c @@ -31,6 +31,9 @@ #ifdef USE_MBEDTLS +/* Define this to enable lots of debugging for mbedTLS */ +/* #define MBEDTLS_DEBUG */ + #include #if MBEDTLS_VERSION_NUMBER >= 0x02040000 #include @@ -46,6 +49,12 @@ #include #include +#if MBEDTLS_VERSION_MAJOR >= 2 +# ifdef MBEDTLS_DEBUG +# include +# endif +#endif + #include "urldata.h" #include "sendf.h" #include "inet_pton.h" @@ -113,9 +122,6 @@ static int entropy_func_mutex(void *data, unsigned char *output, size_t len) #endif /* THREADING_SUPPORT */ -/* Define this to enable lots of debugging for mbedTLS */ -#undef MBEDTLS_DEBUG - #ifdef MBEDTLS_DEBUG static void mbed_debug(void *context, int level, const char *f_name, int line_nb, const char *line) @@ -244,7 +250,7 @@ mbed_connect_step1(struct connectdata *conn, const char * const ssl_cafile = SSL_CONN_CONFIG(CAfile); const bool verifypeer = SSL_CONN_CONFIG(verifypeer); const char * const ssl_capath = SSL_CONN_CONFIG(CApath); - char * const ssl_cert = SSL_SET_OPTION(cert); + char * const ssl_cert = SSL_SET_OPTION(primary.clientcert); const char * const ssl_crlfile = SSL_SET_OPTION(CRLfile); #ifndef CURL_DISABLE_PROXY const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name : diff --git a/libs/libcurl/src/vtls/mesalink.c b/libs/libcurl/src/vtls/mesalink.c index 7132bdfd22..7346a75f95 100644 --- a/libs/libcurl/src/vtls/mesalink.c +++ b/libs/libcurl/src/vtls/mesalink.c @@ -158,8 +158,8 @@ mesalink_connect_step1(struct connectdata *conn, int sockindex) SSL_CONN_CONFIG(CApath))) { if(SSL_CONN_CONFIG(verifypeer)) { failf(data, - "error setting certificate verify locations:\n" - " CAfile: %s\n CApath: %s", + "error setting certificate verify locations: " + " CAfile: %s CApath: %s", SSL_CONN_CONFIG(CAfile) ? SSL_CONN_CONFIG(CAfile) : "none", SSL_CONN_CONFIG(CApath) ? @@ -173,20 +173,18 @@ mesalink_connect_step1(struct connectdata *conn, int sockindex) else { infof(data, "successfully set certificate verify locations:\n"); } - infof(data, - " CAfile: %s\n" - " CApath: %s\n", - SSL_CONN_CONFIG(CAfile)? - SSL_CONN_CONFIG(CAfile): "none", - SSL_CONN_CONFIG(CApath)? - SSL_CONN_CONFIG(CApath): "none"); + infof(data, " CAfile: %s\n", + SSL_CONN_CONFIG(CAfile) ? SSL_CONN_CONFIG(CAfile): "none"); + infof(data, " CApath: %s\n", + SSL_CONN_CONFIG(CApath) ? SSL_CONN_CONFIG(CApath): "none"); } - if(SSL_SET_OPTION(cert) && SSL_SET_OPTION(key)) { + if(SSL_SET_OPTION(primary.clientcert) && SSL_SET_OPTION(key)) { int file_type = do_file_type(SSL_SET_OPTION(cert_type)); - if(SSL_CTX_use_certificate_chain_file(BACKEND->ctx, SSL_SET_OPTION(cert), - file_type) != 1) { + if(SSL_CTX_use_certificate_chain_file(BACKEND->ctx, + SSL_SET_OPTION(primary.clientcert), + file_type) != 1) { failf(data, "unable to use client certificate (no key or wrong pass" " phrase?)"); return CURLE_SSL_CONNECT_ERROR; diff --git a/libs/libcurl/src/vtls/nss.c b/libs/libcurl/src/vtls/nss.c index 0f0d1ee6c8..d0988549dd 100644 --- a/libs/libcurl/src/vtls/nss.c +++ b/libs/libcurl/src/vtls/nss.c @@ -83,7 +83,7 @@ struct ssl_backend_data { PRFileDesc *handle; char *client_nickname; struct Curl_easy *data; - struct curl_llist obj_list; + struct Curl_llist obj_list; PK11GenericObject *obj_clicert; }; @@ -91,14 +91,14 @@ static PRLock *nss_initlock = NULL; static PRLock *nss_crllock = NULL; static PRLock *nss_findslot_lock = NULL; static PRLock *nss_trustload_lock = NULL; -static struct curl_llist nss_crl_list; +static struct Curl_llist nss_crl_list; static NSSInitContext *nss_context = NULL; static volatile int initialized = 0; /* type used to wrap pointers as list nodes */ struct ptr_list_wrap { void *ptr; - struct curl_llist_element node; + struct Curl_llist_element node; }; struct cipher_s { @@ -430,7 +430,7 @@ static PK11SlotInfo* nss_find_slot_by_name(const char *slot_name) } /* wrap 'ptr' as list node and tail-insert into 'list' */ -static CURLcode insert_wrapped_ptr(struct curl_llist *list, void *ptr) +static CURLcode insert_wrapped_ptr(struct Curl_llist *list, void *ptr) { struct ptr_list_wrap *wrap = malloc(sizeof(*wrap)); if(!wrap) @@ -1027,12 +1027,7 @@ static SECStatus BadCertHandler(void *arg, PRFileDesc *sock) CERTCertificate *cert; /* remember the cert verification result */ -#ifndef CURL_DISABLE_PROXY - if(SSL_IS_PROXY()) - data->set.proxy_ssl.certverifyresult = err; - else -#endif - data->set.ssl.certverifyresult = err; + SSL_SET_OPTION_LVALUE(certverifyresult) = err; if(err == SSL_ERROR_BAD_CERT_DOMAIN && !SSL_CONN_CONFIG(verifyhost)) /* we are asked not to verify the host name */ @@ -1631,9 +1626,8 @@ static CURLcode nss_load_ca_certificates(struct connectdata *conn, if(capath && !capath[0]) capath = NULL; - infof(data, " CAfile: %s\n CApath: %s\n", - cafile ? cafile : "none", - capath ? capath : "none"); + infof(data, " CAfile: %s\n", cafile ? cafile : "none"); + infof(data, " CApath: %s\n", capath ? capath : "none"); /* load libnssckbi.so if no other trust roots were specified */ use_trust_module = !cafile && !capath; @@ -1673,7 +1667,8 @@ static CURLcode nss_load_ca_certificates(struct connectdata *conn, if(!dir) return CURLE_SSL_CACERT_BADFILE; - while((entry = PR_ReadDir(dir, PR_SKIP_BOTH | PR_SKIP_HIDDEN))) { + while((entry = + PR_ReadDir(dir, (PRDirFlags)(PR_SKIP_BOTH | PR_SKIP_HIDDEN)))) { char *fullpath = aprintf("%s/%s", capath, entry->name); if(!fullpath) { PR_CloseDir(dir); @@ -1838,12 +1833,6 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex) CURLcode result; bool second_layer = FALSE; SSLVersionRange sslver_supported; -#ifndef CURL_DISABLE_PROXY - const char *hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name : - conn->host.name; -#else - const char *hostname = conn->host.name; -#endif SSLVersionRange sslver = { SSL_LIBRARY_VERSION_TLS_1_0, /* min */ @@ -1948,12 +1937,7 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex) goto error; /* not checked yet */ -#ifndef CURL_DISABLE_PROXY - if(SSL_IS_PROXY()) - data->set.proxy_ssl.certverifyresult = 0; - else -#endif - data->set.ssl.certverifyresult = 0; + SSL_SET_OPTION_LVALUE(certverifyresult) = 0; if(SSL_BadCertHook(model, BadCertHandler, conn) != SECSuccess) goto error; @@ -1981,14 +1965,15 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex) infof(data, " CRLfile: %s\n", SSL_SET_OPTION(CRLfile)); } - if(SSL_SET_OPTION(cert)) { - char *nickname = dup_nickname(data, SSL_SET_OPTION(cert)); + if(SSL_SET_OPTION(primary.clientcert)) { + char *nickname = dup_nickname(data, SSL_SET_OPTION(primary.clientcert)); if(nickname) { /* we are not going to use libnsspem.so to read the client cert */ backend->obj_clicert = NULL; } else { - CURLcode rv = cert_stuff(conn, sockindex, SSL_SET_OPTION(cert), + CURLcode rv = cert_stuff(conn, sockindex, + SSL_SET_OPTION(primary.clientcert), SSL_SET_OPTION(key)); if(rv) { /* failf() is already done in cert_stuff() */ @@ -2124,11 +2109,11 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex) goto error; /* propagate hostname to the TLS layer */ - if(SSL_SetURL(backend->handle, hostname) != SECSuccess) + if(SSL_SetURL(backend->handle, SSL_HOST_NAME()) != SECSuccess) goto error; /* prevent NSS from re-using the session for a different hostname */ - if(SSL_SetSockPeerID(backend->handle, hostname) != SECSuccess) + if(SSL_SetSockPeerID(backend->handle, SSL_HOST_NAME()) != SECSuccess) goto error; return CURLE_OK; @@ -2147,18 +2132,6 @@ static CURLcode nss_do_connect(struct connectdata *conn, int sockindex) struct Curl_easy *data = conn->data; CURLcode result = CURLE_SSL_CONNECT_ERROR; PRUint32 timeout; -#ifndef CURL_DISABLE_PROXY - long * const certverifyresult = SSL_IS_PROXY() ? - &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult; - const char * const pinnedpubkey = SSL_IS_PROXY() ? - data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] : - data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG]; -#else - long * const certverifyresult = &data->set.ssl.certverifyresult; - const char * const pinnedpubkey = - data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG]; -#endif - /* check timeout situation */ const timediff_t time_left = Curl_timeleft(data, NULL, TRUE); @@ -2174,9 +2147,9 @@ static CURLcode nss_do_connect(struct connectdata *conn, int sockindex) if(PR_GetError() == PR_WOULD_BLOCK_ERROR) /* blocking direction is updated by nss_update_connecting_state() */ return CURLE_AGAIN; - else if(*certverifyresult == SSL_ERROR_BAD_CERT_DOMAIN) + else if(SSL_SET_OPTION(certverifyresult) == SSL_ERROR_BAD_CERT_DOMAIN) result = CURLE_PEER_FAILED_VERIFICATION; - else if(*certverifyresult != 0) + else if(SSL_SET_OPTION(certverifyresult) != 0) result = CURLE_PEER_FAILED_VERIFICATION; goto error; } @@ -2204,7 +2177,7 @@ static CURLcode nss_do_connect(struct connectdata *conn, int sockindex) } } - result = cmp_peer_pubkey(connssl, pinnedpubkey); + result = cmp_peer_pubkey(connssl, SSL_PINNED_PUB_KEY()); if(result) /* status already printed */ goto error; diff --git a/libs/libcurl/src/vtls/openssl.c b/libs/libcurl/src/vtls/openssl.c index 1685a4aa4c..28a1ae6dab 100644 --- a/libs/libcurl/src/vtls/openssl.c +++ b/libs/libcurl/src/vtls/openssl.c @@ -34,6 +34,13 @@ /* Wincrypt must be included before anything that could include OpenSSL. */ #if defined(USE_WIN32_CRYPTO) #include +/* Undefine wincrypt conflicting symbols for BoringSSL. */ +#undef X509_NAME +#undef X509_EXTENSIONS +#undef PKCS7_ISSUER_AND_SERIAL +#undef PKCS7_SIGNER_INFO +#undef OCSP_REQUEST +#undef OCSP_RESPONSE #endif #include "urldata.h" @@ -193,6 +200,10 @@ !defined(OPENSSL_IS_BORINGSSL)) #define HAVE_SSL_CTX_SET_CIPHERSUITES #define HAVE_SSL_CTX_SET_POST_HANDSHAKE_AUTH +/* SET_EC_CURVES available under the same preconditions: see + * https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set1_groups.html + */ +#define HAVE_SSL_CTX_SET_EC_CURVES #endif #if defined(LIBRESSL_VERSION_NUMBER) @@ -1571,16 +1582,8 @@ static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert) CURLcode result = CURLE_OK; bool dNSName = FALSE; /* if a dNSName field exists in the cert */ bool iPAddress = FALSE; /* if a iPAddress field exists in the cert */ -#ifndef CURL_DISABLE_PROXY - const char * const hostname = SSL_IS_PROXY() ? - conn->http_proxy.host.name : conn->host.name; - const char * const dispname = SSL_IS_PROXY() ? - conn->http_proxy.host.dispname : conn->host.dispname; -#else - /* disabled proxy support */ - const char * const hostname = conn->host.name; - const char * const dispname = conn->host.dispname; -#endif + const char * const hostname = SSL_HOST_NAME(); + const char * const dispname = SSL_HOST_DISPNAME(); #ifdef ENABLE_IPV6 if(conn->bits.ipv6_ip && @@ -2459,31 +2462,20 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex) #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME bool sni; -#ifndef CURL_DISABLE_PROXY - const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name : - conn->host.name; -#else - const char * const hostname = conn->host.name; -#endif + const char * const hostname = SSL_HOST_NAME(); #ifdef ENABLE_IPV6 struct in6_addr addr; #else struct in_addr addr; #endif -#endif -#ifndef CURL_DISABLE_PROXY - long * const certverifyresult = SSL_IS_PROXY() ? - &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult; -#else - long * const certverifyresult = &data->set.ssl.certverifyresult; #endif const long int ssl_version = SSL_CONN_CONFIG(version); -#ifdef USE_TLS_SRP +#ifdef HAVE_OPENSSL_SRP const enum CURL_TLSAUTH ssl_authtype = SSL_SET_OPTION(authtype); #endif - char * const ssl_cert = SSL_SET_OPTION(cert); - const struct curl_blob *ssl_cert_blob = SSL_SET_OPTION(cert_blob); + char * const ssl_cert = SSL_SET_OPTION(primary.clientcert); + const struct curl_blob *ssl_cert_blob = SSL_SET_OPTION(primary.cert_blob); const char * const ssl_cert_type = SSL_SET_OPTION(cert_type); const char * const ssl_cafile = SSL_CONN_CONFIG(CAfile); const char * const ssl_capath = SSL_CONN_CONFIG(CApath); @@ -2500,7 +2492,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex) if(result) return result; - *certverifyresult = !X509_V_OK; + SSL_SET_OPTION_LVALUE(certverifyresult) = !X509_V_OK; /* check to see if we've been told to use an explicit SSL/TLS version */ @@ -2524,7 +2516,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex) failf(data, OSSL_PACKAGE " was built without SSLv2 support"); return CURLE_NOT_BUILT_IN; #else -#ifdef USE_TLS_SRP +#ifdef HAVE_OPENSSL_SRP if(ssl_authtype == CURL_TLSAUTH_SRP) return CURLE_SSL_CONNECT_ERROR; #endif @@ -2537,7 +2529,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex) failf(data, OSSL_PACKAGE " was built without SSLv3 support"); return CURLE_NOT_BUILT_IN; #else -#ifdef USE_TLS_SRP +#ifdef HAVE_OPENSSL_SRP if(ssl_authtype == CURL_TLSAUTH_SRP) return CURLE_SSL_CONNECT_ERROR; #endif @@ -2793,7 +2785,19 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex) SSL_CTX_set_post_handshake_auth(backend->ctx, 1); #endif -#ifdef USE_TLS_SRP +#ifdef HAVE_SSL_CTX_SET_EC_CURVES + { + char *curves = SSL_CONN_CONFIG(curves); + if(curves) { + if(!SSL_CTX_set1_curves_list(backend->ctx, curves)) { + failf(data, "failed setting curves list: '%s'", curves); + return CURLE_SSL_CIPHER; + } + } + } +#endif + +#ifdef HAVE_OPENSSL_SRP if(ssl_authtype == CURL_TLSAUTH_SRP) { char * const ssl_username = SSL_SET_OPTION(username); @@ -2910,7 +2914,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex) /* "If GetLastError returns CRYPT_E_NOT_FOUND, the certificate is good for all uses. If it returns zero, the certificate has no valid uses." */ - if(GetLastError() != CRYPT_E_NOT_FOUND) + if((HRESULT)GetLastError() != CRYPT_E_NOT_FOUND) continue; } else { @@ -2970,7 +2974,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex) { if(ssl_cafile) { if(!SSL_CTX_load_verify_file(backend->ctx, ssl_cafile)) { - if(verifypeer) { + if(verifypeer && !imported_native_ca) { /* Fail if we insist on successfully verifying the server. */ failf(data, "error setting certificate file: %s", ssl_cafile); return CURLE_SSL_CACERT_BADFILE; @@ -2978,11 +2982,11 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex) /* Continue with a warning if no certificate verif is required. */ infof(data, "error setting certificate file, continuing anyway\n"); } - infof(data, " CAfile: %s\n", ssl_cafile); + infof(data, " CAfile: %s\n", ssl_cafile); } if(ssl_capath) { if(!SSL_CTX_load_verify_dir(backend->ctx, ssl_capath)) { - if(verifypeer) { + if(verifypeer && !imported_native_ca) { /* Fail if we insist on successfully verifying the server. */ failf(data, "error setting certificate path: %s", ssl_capath); return CURLE_SSL_CACERT_BADFILE; @@ -2990,7 +2994,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex) /* Continue with a warning if no certificate verif is required. */ infof(data, "error setting certificate path, continuing anyway\n"); } - infof(data, " CApath: %s\n", ssl_capath); + infof(data, " CApath: %s\n", ssl_capath); } } #else @@ -3000,8 +3004,8 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex) if(!SSL_CTX_load_verify_locations(backend->ctx, ssl_cafile, ssl_capath)) { if(verifypeer && !imported_native_ca) { /* Fail if we insist on successfully verifying the server. */ - failf(data, "error setting certificate verify locations:\n" - " CAfile: %s\n CApath: %s", + failf(data, "error setting certificate verify locations:" + " CAfile: %s CApath: %s", ssl_cafile ? ssl_cafile : "none", ssl_capath ? ssl_capath : "none"); return CURLE_SSL_CACERT_BADFILE; @@ -3015,11 +3019,8 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex) /* Everything is fine. */ infof(data, "successfully set certificate verify locations:\n"); } - infof(data, - " CAfile: %s\n" - " CApath: %s\n", - ssl_cafile ? ssl_cafile : "none", - ssl_capath ? ssl_capath : "none"); + infof(data, " CAfile: %s\n", ssl_cafile ? ssl_cafile : "none"); + infof(data, " CApath: %s\n", ssl_capath ? ssl_capath : "none"); } #endif @@ -3201,12 +3202,6 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex) struct Curl_easy *data = conn->data; int err; struct ssl_connect_data *connssl = &conn->ssl[sockindex]; -#ifndef CURL_DISABLE_PROXY - long * const certverifyresult = SSL_IS_PROXY() ? - &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult; -#else - long * const certverifyresult = &data->set.ssl.certverifyresult; -#endif struct ssl_backend_data *backend = connssl->backend; DEBUGASSERT(ssl_connect_2 == connssl->connecting_state || ssl_connect_2_reading == connssl->connecting_state @@ -3265,12 +3260,13 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex) reason = ERR_GET_REASON(errdetail); if((lib == ERR_LIB_SSL) && - (reason == SSL_R_CERTIFICATE_VERIFY_FAILED)) { + ((reason == SSL_R_CERTIFICATE_VERIFY_FAILED) || + (reason == SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED))) { result = CURLE_PEER_FAILED_VERIFICATION; lerr = SSL_get_verify_result(backend->handle); if(lerr != X509_V_OK) { - *certverifyresult = lerr; + SSL_SET_OPTION_LVALUE(certverifyresult) = lerr; msnprintf(error_buffer, sizeof(error_buffer), "SSL certificate problem: %s", X509_verify_cert_error_string(lerr)); @@ -3292,12 +3288,10 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex) * the SO_ERROR is also lost. */ if(CURLE_SSL_CONNECT_ERROR == result && errdetail == 0) { + const char * const hostname = SSL_HOST_NAME(); #ifndef CURL_DISABLE_PROXY - const char * const hostname = SSL_IS_PROXY() ? - conn->http_proxy.host.name : conn->host.name; const long int port = SSL_IS_PROXY() ? conn->port : conn->remote_port; #else - const char * const hostname = conn->host.name; const long int port = conn->remote_port; #endif char extramsg[80]=""; @@ -3752,12 +3746,6 @@ static CURLcode servercert(struct connectdata *conn, char error_buffer[256]=""; char buffer[2048]; const char *ptr; -#ifndef CURL_DISABLE_PROXY - long * const certverifyresult = SSL_IS_PROXY() ? - &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult; -#else - long * const certverifyresult = &data->set.ssl.certverifyresult; -#endif BIO *mem = BIO_new(BIO_s_mem()); struct ssl_backend_data *backend = connssl->backend; @@ -3878,9 +3866,9 @@ static CURLcode servercert(struct connectdata *conn, X509_free(issuer); } - lerr = *certverifyresult = SSL_get_verify_result(backend->handle); - - if(*certverifyresult != X509_V_OK) { + lerr = SSL_get_verify_result(backend->handle); + SSL_SET_OPTION_LVALUE(certverifyresult) = lerr; + if(lerr != X509_V_OK) { if(SSL_CONN_CONFIG(verifypeer)) { /* We probably never reach this, because SSL_connect() will fail and we return earlier if verifypeer is set? */ diff --git a/libs/libcurl/src/vtls/schannel.c b/libs/libcurl/src/vtls/schannel.c index 1c1432d757..c7e4e793cc 100644 --- a/libs/libcurl/src/vtls/schannel.c +++ b/libs/libcurl/src/vtls/schannel.c @@ -346,6 +346,8 @@ set_ssl_ciphers(SCHANNEL_CRED *schannel_cred, char *ciphers) } #ifdef HAS_CLIENT_CERT_PATH + +/* Function allocates memory for store_path only if CURLE_OK is returned */ static CURLcode get_cert_location(TCHAR *path, DWORD *store_name, TCHAR **store_path, TCHAR **thumbprint) @@ -388,16 +390,16 @@ get_cert_location(TCHAR *path, DWORD *store_name, TCHAR **store_path, if(sep == NULL) return CURLE_SSL_CERTPROBLEM; + *thumbprint = sep + 1; + if(_tcslen(*thumbprint) != CERT_THUMBPRINT_STR_LEN) + return CURLE_SSL_CERTPROBLEM; + *sep = TEXT('\0'); *store_path = _tcsdup(store_path_start); *sep = TEXT('\\'); if(*store_path == NULL) return CURLE_OUT_OF_MEMORY; - *thumbprint = sep + 1; - if(_tcslen(*thumbprint) != CERT_THUMBPRINT_STR_LEN) - return CURLE_SSL_CERTPROBLEM; - return CURLE_OK; } #endif @@ -418,7 +420,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex) SCHANNEL_CRED schannel_cred; PCCERT_CONTEXT client_certs[1] = { NULL }; SECURITY_STATUS sspi_status = SEC_E_OK; - struct curl_schannel_cred *old_cred = NULL; + struct Curl_schannel_cred *old_cred = NULL; struct in_addr addr; #ifdef ENABLE_IPV6 struct in6_addr addr6; @@ -588,7 +590,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex) #ifdef HAS_CLIENT_CERT_PATH /* client certificate */ - if(data->set.ssl.cert || data->set.ssl.cert_blob) { + if(data->set.ssl.primary.clientcert || data->set.ssl.primary.cert_blob) { DWORD cert_store_name = 0; TCHAR *cert_store_path = NULL; TCHAR *cert_thumbprint_str = NULL; @@ -598,27 +600,28 @@ schannel_connect_step1(struct connectdata *conn, int sockindex) FILE *fInCert = NULL; void *certdata = NULL; size_t certsize = 0; - bool blob = data->set.ssl.cert_blob != NULL; + bool blob = data->set.ssl.primary.cert_blob != NULL; TCHAR *cert_path = NULL; if(blob) { - certdata = data->set.ssl.cert_blob->data; - certsize = data->set.ssl.cert_blob->len; + certdata = data->set.ssl.primary.cert_blob->data; + certsize = data->set.ssl.primary.cert_blob->len; } else { - cert_path = curlx_convert_UTF8_to_tchar(data->set.ssl.cert); + cert_path = curlx_convert_UTF8_to_tchar( + data->set.ssl.primary.clientcert); if(!cert_path) return CURLE_OUT_OF_MEMORY; result = get_cert_location(cert_path, &cert_store_name, &cert_store_path, &cert_thumbprint_str); - if(result && (data->set.ssl.cert[0]!='\0')) - fInCert = fopen(data->set.ssl.cert, "rb"); + if(result && (data->set.ssl.primary.clientcert[0]!='\0')) + fInCert = fopen(data->set.ssl.primary.clientcert, "rb"); if(result && !fInCert) { failf(data, "schannel: Failed to get certificate location" " or file for %s", - data->set.ssl.cert); + data->set.ssl.primary.clientcert); curlx_unicodefree(cert_path); return result; } @@ -628,7 +631,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex) (!strcasecompare(data->set.ssl.cert_type, "P12"))) { failf(data, "schannel: certificate format compatibility error " " for %s", - blob ? "(memory blob)" : data->set.ssl.cert); + blob ? "(memory blob)" : data->set.ssl.primary.clientcert); curlx_unicodefree(cert_path); return CURLE_SSL_CERTPROBLEM; } @@ -643,7 +646,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex) size_t pwd_len = 0; int str_w_len = 0; const char *cert_showfilename_error = blob ? - "(memory blob)" : data->set.ssl.cert; + "(memory blob)" : data->set.ssl.primary.clientcert; curlx_unicodefree(cert_path); if(fInCert) { long cert_tell = 0; @@ -664,7 +667,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex) fclose(fInCert); if(!continue_reading) { failf(data, "schannel: Failed to read cert file %s", - data->set.ssl.cert); + data->set.ssl.primary.clientcert); free(certdata); return CURLE_SSL_CERTPROBLEM; } @@ -771,15 +774,15 @@ schannel_connect_step1(struct connectdata *conn, int sockindex) CertCloseStore(cert_store, 0); } #else - if(data->set.ssl.cert) { + if(data->set.ssl.primary.clientcert || data->set.ssl.primary.cert_blob) { failf(data, "schannel: client cert support not built in"); return CURLE_NOT_BUILT_IN; } #endif /* allocate memory for the re-usable credential handle */ - BACKEND->cred = (struct curl_schannel_cred *) - calloc(1, sizeof(struct curl_schannel_cred)); + BACKEND->cred = (struct Curl_schannel_cred *) + calloc(1, sizeof(struct Curl_schannel_cred)); if(!BACKEND->cred) { failf(data, "schannel: unable to allocate memory"); @@ -893,8 +896,8 @@ schannel_connect_step1(struct connectdata *conn, int sockindex) ISC_REQ_STREAM; /* allocate memory for the security context handle */ - BACKEND->ctxt = (struct curl_schannel_ctxt *) - calloc(1, sizeof(struct curl_schannel_ctxt)); + BACKEND->ctxt = (struct Curl_schannel_ctxt *) + calloc(1, sizeof(struct Curl_schannel_ctxt)); if(!BACKEND->ctxt) { failf(data, "schannel: unable to allocate memory"); return CURLE_OUT_OF_MEMORY; @@ -1178,6 +1181,10 @@ schannel_connect_step2(struct connectdata *conn, int sockindex) failf(data, "schannel: SNI or certificate check failed: %s", Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer))); return CURLE_PEER_FAILED_VERIFICATION; + case SEC_E_UNTRUSTED_ROOT: + failf(data, "schannel: %s", + Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer))); + return CURLE_PEER_FAILED_VERIFICATION; /* case SEC_E_INVALID_HANDLE: case SEC_E_INVALID_TOKEN: @@ -1401,7 +1408,7 @@ schannel_connect_step3(struct connectdata *conn, int sockindex) /* save the current session data for possible re-use */ if(SSL_SET_OPTION(primary.sessionid)) { bool incache; - struct curl_schannel_cred *old_cred = NULL; + struct Curl_schannel_cred *old_cred = NULL; Curl_ssl_sessionid_lock(conn); incache = !(Curl_ssl_getsessionid(conn, (void **)&old_cred, NULL, @@ -1417,7 +1424,7 @@ schannel_connect_step3(struct connectdata *conn, int sockindex) } if(!incache) { result = Curl_ssl_addsessionid(conn, (void *)BACKEND->cred, - sizeof(struct curl_schannel_cred), + sizeof(struct Curl_schannel_cred), sockindex); if(result) { Curl_ssl_sessionid_unlock(conn); @@ -2099,7 +2106,7 @@ static void Curl_schannel_close(struct connectdata *conn, int sockindex) static void Curl_schannel_session_free(void *ptr) { /* this is expected to be called under sessionid lock */ - struct curl_schannel_cred *cred = ptr; + struct Curl_schannel_cred *cred = ptr; cred->refcount--; if(cred->refcount == 0) { diff --git a/libs/libcurl/src/vtls/schannel.h b/libs/libcurl/src/vtls/schannel.h index ee8d7d47ac..f87bae8ff0 100644 --- a/libs/libcurl/src/vtls/schannel.h +++ b/libs/libcurl/src/vtls/schannel.h @@ -8,7 +8,7 @@ * \___|\___/|_| \_\_____| * * Copyright (C) 2012, Marc Hoersken, , et al. - * Copyright (C) 2012 - 2018, Daniel Stenberg, , et al. + * Copyright (C) 2012 - 2020, 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 @@ -70,20 +70,20 @@ CURLcode Curl_verify_certificate(struct connectdata *conn, int sockindex); #endif #endif -struct curl_schannel_cred { +struct Curl_schannel_cred { CredHandle cred_handle; TimeStamp time_stamp; int refcount; }; -struct curl_schannel_ctxt { +struct Curl_schannel_ctxt { CtxtHandle ctxt_handle; TimeStamp time_stamp; }; struct ssl_backend_data { - struct curl_schannel_cred *cred; - struct curl_schannel_ctxt *ctxt; + struct Curl_schannel_cred *cred; + struct Curl_schannel_ctxt *ctxt; SecPkgContext_StreamSizes stream_sizes; size_t encdata_length, decdata_length; size_t encdata_offset, decdata_offset; diff --git a/libs/libcurl/src/vtls/sectransp.c b/libs/libcurl/src/vtls/sectransp.c index 2627aff16a..af63df46ae 100644 --- a/libs/libcurl/src/vtls/sectransp.c +++ b/libs/libcurl/src/vtls/sectransp.c @@ -1397,11 +1397,16 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn, const char * const ssl_cafile = SSL_CONN_CONFIG(CAfile); const struct curl_blob *ssl_cablob = NULL; const bool verifypeer = SSL_CONN_CONFIG(verifypeer); - char * const ssl_cert = SSL_SET_OPTION(cert); - const struct curl_blob *ssl_cert_blob = SSL_SET_OPTION(cert_blob); + char * const ssl_cert = SSL_SET_OPTION(primary.clientcert); + const struct curl_blob *ssl_cert_blob = SSL_SET_OPTION(primary.cert_blob); +#ifndef CURL_DISABLE_PROXY const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name : conn->host.name; const long int port = SSL_IS_PROXY() ? conn->port : conn->remote_port; +#else + const char * const hostname = conn->host.name; + const long int port = conn->remote_port; +#endif #ifdef ENABLE_IPV6 struct in6_addr addr; #else @@ -1606,8 +1611,11 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn, &kCFTypeArrayCallBacks); #ifdef USE_NGHTTP2 - if(data->set.httpversion >= CURL_HTTP_VERSION_2 && - (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)) { + if(data->set.httpversion >= CURL_HTTP_VERSION_2 +#ifndef CURL_DISABLE_PROXY + && (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy) +#endif + ) { CFArrayAppendValue(alpnArr, CFSTR(NGHTTP2_PROTO_VERSION_ID)); infof(data, "ALPN, offering %s\n", NGHTTP2_PROTO_VERSION_ID); } @@ -2379,8 +2387,12 @@ sectransp_connect_step2(struct connectdata *conn, int sockindex) OSStatus err; SSLCipherSuite cipher; SSLProtocol protocol = 0; +#ifndef CURL_DISABLE_PROXY const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name : conn->host.name; +#else + const char * const hostname = conn->host.name; +#endif DEBUGASSERT(ssl_connect_2 == connssl->connecting_state || ssl_connect_2_reading == connssl->connecting_state diff --git a/libs/libcurl/src/vtls/vtls.c b/libs/libcurl/src/vtls/vtls.c index 281043aa63..e65fb4f787 100644 --- a/libs/libcurl/src/vtls/vtls.c +++ b/libs/libcurl/src/vtls/vtls.c @@ -138,6 +138,7 @@ Curl_ssl_config_matches(struct ssl_primary_config *data, Curl_safe_strcasecompare(data->egdsocket, needle->egdsocket) && Curl_safe_strcasecompare(data->cipher_list, needle->cipher_list) && Curl_safe_strcasecompare(data->cipher_list13, needle->cipher_list13) && + Curl_safe_strcasecompare(data->curves, needle->curves) && Curl_safe_strcasecompare(data->pinned_key, needle->pinned_key)) return TRUE; @@ -164,6 +165,7 @@ Curl_clone_primary_ssl_config(struct ssl_primary_config *source, CLONE_STRING(cipher_list); CLONE_STRING(cipher_list13); CLONE_STRING(pinned_key); + CLONE_STRING(curves); return TRUE; } @@ -179,6 +181,7 @@ void Curl_free_primary_ssl_config(struct ssl_primary_config *sslc) Curl_safefree(sslc->cipher_list13); Curl_safefree(sslc->pinned_key); Curl_safefree(sslc->cert_blob); + Curl_safefree(sslc->curves); } #ifdef USE_SSL @@ -362,7 +365,7 @@ bool Curl_ssl_getsessionid(struct connectdata *conn, size_t *idsize, /* set 0 if unknown */ int sockindex) { - struct curl_ssl_session *check; + struct Curl_ssl_session *check; struct Curl_easy *data = conn->data; size_t i; long *general_age; @@ -429,7 +432,7 @@ bool Curl_ssl_getsessionid(struct connectdata *conn, /* * Kill a single session ID entry in the cache. */ -void Curl_ssl_kill_session(struct curl_ssl_session *session) +void Curl_ssl_kill_session(struct Curl_ssl_session *session) { if(session->sessionid) { /* defensive check */ @@ -456,7 +459,7 @@ void Curl_ssl_delsessionid(struct connectdata *conn, void *ssl_sessionid) struct Curl_easy *data = conn->data; for(i = 0; i < data->set.general_ssl.max_ssl_sessions; i++) { - struct curl_ssl_session *check = &data->state.session[i]; + struct Curl_ssl_session *check = &data->state.session[i]; if(check->sessionid == ssl_sessionid) { Curl_ssl_kill_session(check); @@ -478,7 +481,7 @@ CURLcode Curl_ssl_addsessionid(struct connectdata *conn, { size_t i; struct Curl_easy *data = conn->data; /* the mother of all structs */ - struct curl_ssl_session *store = &data->state.session[0]; + struct Curl_ssl_session *store = &data->state.session[0]; long oldest_age = data->state.session[0].age; /* zero if unused */ char *clone_host; char *clone_conn_to_host; @@ -664,13 +667,13 @@ struct curl_slist *Curl_ssl_engines_list(struct Curl_easy *data) */ CURLcode Curl_ssl_initsessions(struct Curl_easy *data, size_t amount) { - struct curl_ssl_session *session; + struct Curl_ssl_session *session; if(data->state.session) /* this is just a precaution to prevent multiple inits */ return CURLE_OK; - session = calloc(amount, sizeof(struct curl_ssl_session)); + session = calloc(amount, sizeof(struct Curl_ssl_session)); if(!session) return CURLE_OUT_OF_MEMORY; diff --git a/libs/libcurl/src/vtls/vtls.h b/libs/libcurl/src/vtls/vtls.h index bcc8444161..b86bdbc1df 100644 --- a/libs/libcurl/src/vtls/vtls.h +++ b/libs/libcurl/src/vtls/vtls.h @@ -131,12 +131,26 @@ CURLcode Curl_none_md5sum(unsigned char *input, size_t inputlen, CURL_SOCKET_BAD ? FIRSTSOCKET : SECONDARYSOCKET].state) #define SSL_SET_OPTION(var) \ (SSL_IS_PROXY() ? data->set.proxy_ssl.var : data->set.ssl.var) +#define SSL_SET_OPTION_LVALUE(var) \ + (*(SSL_IS_PROXY() ? &data->set.proxy_ssl.var : &data->set.ssl.var)) #define SSL_CONN_CONFIG(var) \ (SSL_IS_PROXY() ? conn->proxy_ssl_config.var : conn->ssl_config.var) +#define SSL_HOST_NAME() \ + (SSL_IS_PROXY() ? conn->http_proxy.host.name : conn->host.name) +#define SSL_HOST_DISPNAME() \ + (SSL_IS_PROXY() ? conn->http_proxy.host.dispname : conn->host.dispname) +#define SSL_PINNED_PUB_KEY() (SSL_IS_PROXY() \ + ? data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] \ + : data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG]) #else #define SSL_IS_PROXY() FALSE #define SSL_SET_OPTION(var) data->set.ssl.var +#define SSL_SET_OPTION_LVALUE(var) data->set.ssl.var #define SSL_CONN_CONFIG(var) conn->ssl_config.var +#define SSL_HOST_NAME() conn->host.name +#define SSL_HOST_DISPNAME() conn->host.dispname +#define SSL_PINNED_PUB_KEY() \ + data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG] #endif bool Curl_ssl_config_matches(struct ssl_primary_config *data, @@ -221,7 +235,7 @@ CURLcode Curl_ssl_addsessionid(struct connectdata *conn, * take sessionid object ownership from sessionid cache * (e.g. decrement refcount). */ -void Curl_ssl_kill_session(struct curl_ssl_session *session); +void Curl_ssl_kill_session(struct Curl_ssl_session *session); /* delete a session from the cache * Sessionid mutex must be locked (see Curl_ssl_sessionid_lock). * This will call engine-specific curlssl_session_free function, which must diff --git a/libs/libcurl/src/vtls/wolfssl.c b/libs/libcurl/src/vtls/wolfssl.c index 7b2a124e4f..a299b99d1f 100644 --- a/libs/libcurl/src/vtls/wolfssl.c +++ b/libs/libcurl/src/vtls/wolfssl.c @@ -353,8 +353,8 @@ wolfssl_connect_step1(struct connectdata *conn, SSL_CONN_CONFIG(CApath))) { if(SSL_CONN_CONFIG(verifypeer)) { /* Fail if we insist on successfully verifying the server. */ - failf(data, "error setting certificate verify locations:\n" - " CAfile: %s\n CApath: %s", + failf(data, "error setting certificate verify locations:" + " CAfile: %s CApath: %s", SSL_CONN_CONFIG(CAfile)? SSL_CONN_CONFIG(CAfile): "none", SSL_CONN_CONFIG(CApath)? @@ -372,21 +372,19 @@ wolfssl_connect_step1(struct connectdata *conn, /* Everything is fine. */ infof(data, "successfully set certificate verify locations:\n"); } - infof(data, - " CAfile: %s\n" - " CApath: %s\n", - SSL_CONN_CONFIG(CAfile) ? SSL_CONN_CONFIG(CAfile): - "none", - SSL_CONN_CONFIG(CApath) ? SSL_CONN_CONFIG(CApath): - "none"); + infof(data, " CAfile: %s\n", + SSL_CONN_CONFIG(CAfile) ? SSL_CONN_CONFIG(CAfile) : "none"); + infof(data, " CApath: %s\n", + SSL_CONN_CONFIG(CApath) ? SSL_CONN_CONFIG(CApath) : "none"); } /* Load the client certificate, and private key */ - if(SSL_SET_OPTION(cert) && SSL_SET_OPTION(key)) { + if(SSL_SET_OPTION(primary.clientcert) && SSL_SET_OPTION(key)) { int file_type = do_file_type(SSL_SET_OPTION(cert_type)); - if(SSL_CTX_use_certificate_file(backend->ctx, SSL_SET_OPTION(cert), - file_type) != 1) { + if(SSL_CTX_use_certificate_file(backend->ctx, + SSL_SET_OPTION(primary.clientcert), + file_type) != 1) { failf(data, "unable to use client certificate (no key or wrong pass" " phrase?)"); return CURLE_SSL_CONNECT_ERROR; diff --git a/libs/libcurl/src/wildcard.h b/libs/libcurl/src/wildcard.h index 306c8c99ff..f090826fb2 100644 --- a/libs/libcurl/src/wildcard.h +++ b/libs/libcurl/src/wildcard.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2010 - 2019, Daniel Stenberg, , et al. + * Copyright (C) 2010 - 2020, 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 @@ -39,18 +39,18 @@ typedef enum { CURLWC_ERROR, /* error cases */ CURLWC_DONE /* if is wildcard->state == CURLWC_DONE wildcard loop will end */ -} curl_wildcard_states; +} wildcard_states; -typedef void (*curl_wildcard_dtor)(void *ptr); +typedef void (*wildcard_dtor)(void *ptr); /* struct keeping information about wildcard download process */ struct WildcardData { - curl_wildcard_states state; + wildcard_states state; char *path; /* path to the directory, where we trying wildcard-match */ char *pattern; /* wildcard pattern */ - struct curl_llist filelist; /* llist with struct Curl_fileinfo */ + struct Curl_llist filelist; /* llist with struct Curl_fileinfo */ void *protdata; /* pointer to protocol specific temporary data */ - curl_wildcard_dtor dtor; + wildcard_dtor dtor; void *customptr; /* for CURLOPT_CHUNK_DATA pointer */ }; -- cgit v1.2.3