| _ _ ____ _ |
| ___| | | | _ \| | |
| / __| | | | |_) | | |
| | (__| |_| | _ <| |___ |
| \___|\___/|_| \_\_____| |
| |
| Known Bugs |
| |
| These are problems and bugs known to exist at the time of this release. Feel |
| free to join in and help us correct one or more of these! Also be sure to |
| check the changelog of the current development status, as one or more of these |
| problems may have been fixed or changed somewhat since this was written! |
| |
| 1. HTTP |
| 1.2 Multiple methods in a single WWW-Authenticate: header |
| 1.3 STARTTRANSFER time is wrong for HTTP POSTs |
| 1.4 multipart formposts file name encoding |
| 1.5 Expect-100 meets 417 |
| 1.6 Unnecessary close when 401 received waiting for 100 |
| 1.7 Deflate error after all content was received |
| 1.8 DoH is not used for all name resolves when enabled |
| 1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM |
| |
| 2. TLS |
| 2.1 CURLINFO_SSL_VERIFYRESULT has limited support |
| 2.2 DER in keychain |
| 2.3 Unable to use PKCS12 certificate with Secure Transport |
| 2.4 Secure Transport will not import PKCS#12 client certificates without a password |
| 2.5 Client cert handling with Issuer DN differs between backends |
| 2.6 CURL_GLOBAL_SSL |
| 2.7 Client cert (MTLS) issues with Schannel |
| 2.8 Schannel disable CURLOPT_SSL_VERIFYPEER and verify hostname |
| 2.9 TLS session cache does not work with TFO |
| 2.10 Store TLS context per transfer instead of per connection |
| 2.11 Schannel TLS 1.2 handshake bug in old Windows versions |
| 2.12 FTPS with Schannel times out file list operation |
| 2.14 Secure Transport disabling hostname validation also disables SNI |
| 2.15 Renegotiate from server may cause hang for OpenSSL backend |
| |
| 3. Email protocols |
| 3.1 IMAP SEARCH ALL truncated response |
| 3.2 No disconnect command |
| 3.3 POP3 expects "CRLF.CRLF" eob for some single-line responses |
| 3.4 AUTH PLAIN for SMTP is not working on all servers |
| |
| 4. Command line |
| 4.1 -J and -O with %-encoded file names |
| 4.2 -J with -C - fails |
| 4.3 --retry and transfer timeouts |
| |
| 5. Build and portability issues |
| 5.1 OS400 port requires deprecated IBM library |
| 5.2 curl-config --libs contains private details |
| 5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10 |
| 5.4 Build with statically built dependency |
| 5.5 cannot handle Unicode arguments in non-Unicode builds on Windows |
| 5.7 Visual Studio project gaps |
| 5.8 configure finding libs in wrong directory |
| 5.9 Utilize Requires.private directives in libcurl.pc |
| 5.10 SMB tests fail with Python 2 |
| 5.11 configure --with-gssapi with Heimdal is ignored on macOS |
| 5.12 flaky Windows CI builds |
| |
| 6. Authentication |
| 6.1 NTLM authentication and unicode |
| 6.2 MIT Kerberos for Windows build |
| 6.3 NTLM in system context uses wrong name |
| 6.4 Negotiate and Kerberos V5 need a fake user name |
| 6.5 NTLM does not support password with ยง character |
| 6.6 libcurl can fail to try alternatives with --proxy-any |
| 6.7 Do not clear digest for single realm |
| 6.8 RTSP authentication breaks without redirect support |
| 6.9 SHA-256 digest not supported in Windows SSPI builds |
| 6.10 curl never completes Negotiate over HTTP |
| 6.11 Negotiate on Windows fails |
| 6.12 cannot use Secure Transport with Crypto Token Kit |
| |
| 7. FTP |
| 7.1 FTP without or slow 220 response |
| 7.2 FTP with CONNECT and slow server |
| 7.3 FTP with NOBODY and FAILONERROR |
| 7.4 FTP with ACCT |
| 7.5 ASCII FTP |
| 7.6 FTP with NULs in URL parts |
| 7.7 FTP and empty path parts in the URL |
| 7.8 Premature transfer end but healthy control channel |
| 7.9 Passive transfer tries only one IP address |
| 7.10 FTPS needs session reuse |
| 7.11 FTPS upload data loss with TLS 1.3 |
| |
| 8. TELNET |
| 8.1 TELNET and time limitations do not work |
| 8.2 Microsoft telnet server |
| |
| 9. SFTP and SCP |
| 9.1 SFTP does not do CURLOPT_POSTQUOTE correct |
| 9.2 wolfssh: publickey auth does not work |
| 9.3 Remote recursive folder creation with SFTP |
| |
| 10. SOCKS |
| 10.3 FTPS over SOCKS |
| 10.4 active FTP over a SOCKS |
| |
| 11. Internals |
| 11.1 Curl leaks .onion hostnames in DNS |
| 11.2 error buffer not set if connection to multiple addresses fails |
| 11.3 Disconnects do not do verbose |
| 11.4 HTTP test server 'connection-monitor' problems |
| 11.5 Connection information when using TCP Fast Open |
| 11.6 slow connect to localhost on Windows |
| 11.7 signal-based resolver timeouts |
| 11.8 DoH leaks memory after followlocation |
| 11.9 DoH does not inherit all transfer options |
| 11.10 Blocking socket operations in non-blocking API |
| 11.11 A shared connection cache is not thread-safe |
| 11.12 'no_proxy' string-matches IPv6 numerical addresses |
| 11.13 wakeup socket disconnect causes havoc |
| 11.14 Multi perform hangs waiting for threaded resolver |
| 11.15 CURLOPT_OPENSOCKETPAIRFUNCTION is missing |
| 11.16 libcurl uses renames instead of locking for atomic operations |
| |
| 12. LDAP |
| 12.1 OpenLDAP hangs after returning results |
| 12.2 LDAP on Windows does authentication wrong? |
| 12.3 LDAP on Windows does not work |
| 12.4 LDAPS with NSS is slow |
| |
| 13. TCP/IP |
| 13.1 --interface for ipv6 binds to unusable IP address |
| |
| 14. DICT |
| 14.1 DICT responses show the underlying protocol |
| |
| 15. CMake |
| 15.1 use correct SONAME |
| 15.2 support build with GnuTLS |
| 15.3 unusable tool_hugehelp.c with MinGW |
| 15.4 build docs/curl.1 |
| 15.5 build on Linux links libcurl to libdl |
| 15.6 uses -lpthread instead of Threads::Threads |
| 15.7 generated .pc file contains strange entries |
| 15.8 libcurl.pc uses absolute library paths |
| 15.9 cert paths autodetected when cross-compiling |
| 15.10 libspsl is not supported |
| 15.11 ExternalProject_Add does not set CURL_CA_PATH |
| 15.12 cannot enable LDAPS on Windows |
| 15.13 CMake build with MIT Kerberos does not work |
| |
| 16. Applications |
| 16.1 pulseUI VPN client |
| |
| 17. HTTP/2 |
| 17.1 Excessive HTTP/2 packets with TCP_NODELAY |
| 17.2 HTTP/2 frames while in the connection pool kill reuse |
| 17.3 ENHANCE_YOUR_CALM causes infinite retries |
| 17.4 Connection failures with parallel HTTP/2 |
| 17.5 HTTP/2 connections through HTTPS proxy frequently stall |
| |
| 18. HTTP/3 |
| 18.1 If the HTTP/3 server closes connection during upload curl hangs |
| 18.2 Uploading HTTP/3 files gets interrupted at certain file sizes |
| 18.3 HTTP/3 download is 5x times slower than HTTP/2 |
| 18.4 Downloading with HTTP/3 produces broken files |
| 18.5 HTTP/3 download with quiche halts after a while |
| 18.6 HTTP/3 multipart POST with quiche fails |
| 18.7 HTTP/3 quiche upload large file fails |
| 18.8 HTTP/3 does not support client certs |
| 18.9 connection migration does not work |
| |
| ============================================================================== |
| |
| 1. HTTP |
| |
| 1.2 Multiple methods in a single WWW-Authenticate: header |
| |
| The HTTP responses headers WWW-Authenticate: can provide information about |
| multiple authentication methods as multiple headers or as several methods |
| within a single header. The latter way, several methods in the same physical |
| line, is not supported by libcurl's parser. (For no good reason.) |
| |
| 1.3 STARTTRANSFER time is wrong for HTTP POSTs |
| |
| Wrong STARTTRANSFER timer accounting for POST requests Timer works fine with |
| GET requests, but while using POST the time for CURLINFO_STARTTRANSFER_TIME |
| is wrong. While using POST CURLINFO_STARTTRANSFER_TIME minus |
| CURLINFO_PRETRANSFER_TIME is near to zero every time. |
| |
| https://github.com/curl/curl/issues/218 |
| https://curl.se/bug/view.cgi?id=1213 |
| |
| 1.4 multipart formposts file name encoding |
| |
| When creating multipart formposts. The file name part can be encoded with |
| something beyond ascii but currently libcurl will only pass in the verbatim |
| string the app provides. There are several browsers that already do this |
| encoding. The key seems to be the updated draft to RFC2231: |
| https://tools.ietf.org/html/draft-reschke-rfc2231-in-http-02 |
| |
| 1.5 Expect-100 meets 417 |
| |
| If an upload using Expect: 100-continue receives an HTTP 417 response, it |
| ought to be automatically resent without the Expect:. A workaround is for |
| the client application to redo the transfer after disabling Expect:. |
| https://curl.se/mail/archive-2008-02/0043.html |
| |
| 1.6 Unnecessary close when 401 received waiting for 100 |
| |
| libcurl closes the connection if an HTTP 401 reply is received while it is |
| waiting for the 100-continue response. |
| https://curl.se/mail/lib-2008-08/0462.html |
| |
| 1.7 Deflate error after all content was received |
| |
| There's a situation where we can get an error in a HTTP response that is |
| compressed, when that error is detected after all the actual body contents |
| have been received and delivered to the application. This is tricky, but is |
| ultimately a broken server. |
| |
| See https://github.com/curl/curl/issues/2719 |
| |
| 1.8 DoH is not used for all name resolves when enabled |
| |
| Even if DoH is specified to be used, there are some name resolves that are |
| done without it. This should be fixed. When the internal function |
| `Curl_resolver_wait_resolv()` is called, it does not use DoH to complete the |
| resolve as it otherwise should. |
| |
| See https://github.com/curl/curl/pull/3857 and |
| https://github.com/curl/curl/pull/3850 |
| |
| 1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM |
| |
| I'm using libcurl to POST form data using a FILE* with the CURLFORM_STREAM |
| option of curl_formadd(). I have noticed that if the connection drops at just |
| the right time, the POST is reattempted without the data from the file. It |
| seems like the file stream position is not getting reset to the beginning of |
| the file. I found the CURLOPT_SEEKFUNCTION option and set that with a |
| function that performs an fseek() on the FILE*. However, setting that did not |
| seem to fix the issue or even get called. See |
| https://github.com/curl/curl/issues/768 |
| |
| |
| 2. TLS |
| |
| 2.1 CURLINFO_SSL_VERIFYRESULT has limited support |
| |
| CURLINFO_SSL_VERIFYRESULT is only implemented for the OpenSSL, NSS and |
| GnuTLS backends, so relying on this information in a generic app is flaky. |
| |
| 2.2 DER in keychain |
| |
| Curl does not recognize certificates in DER format in keychain, but it works |
| with PEM. https://curl.se/bug/view.cgi?id=1065 |
| |
| 2.3 Unable to use PKCS12 certificate with Secure Transport |
| |
| See https://github.com/curl/curl/issues/5403 |
| |
| 2.4 Secure Transport will not import PKCS#12 client certificates without a password |
| |
| libcurl calls SecPKCS12Import with the PKCS#12 client certificate, but that |
| function rejects certificates that do not have a password. |
| https://github.com/curl/curl/issues/1308 |
| |
| 2.5 Client cert handling with Issuer DN differs between backends |
| |
| When the specified client certificate does not match any of the |
| server-specified DNs, the OpenSSL and GnuTLS backends behave differently. |
| The github discussion may contain a solution. |
| |
| See https://github.com/curl/curl/issues/1411 |
| |
| 2.6 CURL_GLOBAL_SSL |
| |
| Since libcurl 7.57.0, the flag CURL_GLOBAL_SSL is a no-op. The change was |
| merged in https://github.com/curl/curl/commit/d661b0afb571a |
| |
| It was removed since it was |
| |
| A) never clear for applications on how to deal with init in the light of |
| different SSL backends (the option was added back in the days when life |
| was simpler) |
| |
| B) multissl introduced dynamic switching between SSL backends which |
| emphasized (A) even more |
| |
| C) libcurl uses some TLS backend functionality even for non-TLS functions (to |
| get "good" random) so applications trying to avoid the init for |
| performance reasons would do wrong anyway |
| |
| D) not documented carefully so all this mostly just happened to work |
| for some users |
| |
| However, in spite of the problems with the feature, there were some users who |
| apparently depended on this feature and who now claim libcurl is broken for |
| them. The fix for this situation is not obvious as a downright revert of the |
| patch is totally ruled out due to those reasons above. |
| |
| https://github.com/curl/curl/issues/2276 |
| |
| 2.7 Client cert (MTLS) issues with Schannel |
| |
| See https://github.com/curl/curl/issues/3145 |
| |
| 2.8 Schannel disable CURLOPT_SSL_VERIFYPEER and verify hostname |
| |
| This seems to be a limitation in the underlying Schannel API. |
| |
| https://github.com/curl/curl/issues/3284 |
| |
| 2.9 TLS session cache does not work with TFO |
| |
| See https://github.com/curl/curl/issues/4301 |
| |
| 2.10 Store TLS context per transfer instead of per connection |
| |
| The GnuTLS `backend->cred` and the OpenSSL `backend->ctx` data and their |
| proxy versions (and possibly other TLS backends), could be better moved to be |
| stored in the Curl_easy handle instead of in per connection so that a single |
| transfer that makes multiple connections can reuse the context and reduce |
| memory consumption. |
| |
| https://github.com/curl/curl/issues/5102 |
| |
| 2.11 Schannel TLS 1.2 handshake bug in old Windows versions |
| |
| In old versions of Windows such as 7 and 8.1 the Schannel TLS 1.2 handshake |
| implementation likely has a bug that can rarely cause the key exchange to |
| fail, resulting in error SEC_E_BUFFER_TOO_SMALL or SEC_E_MESSAGE_ALTERED. |
| |
| https://github.com/curl/curl/issues/5488 |
| |
| 2.12 FTPS with Schannel times out file list operation |
| |
| "Instead of the command completing, it just sits there until the timeout |
| expires." - the same command line seems to work with other TLS backends and |
| other operating systems. See https://github.com/curl/curl/issues/5284. |
| |
| 2.14 Secure Transport disabling hostname validation also disables SNI |
| |
| SNI is the hostname that is sent by the TLS library to the server as part of |
| the TLS handshake. Secure Transport does not send SNI when hostname validation |
| is disabled. Servers that host multiple websites may not know which |
| certificate to serve without SNI or which backend server to connect to. The |
| server may serve the certificate of a default server or abort. |
| |
| If a server aborts a handshake then curl shows error "SSL peer handshake |
| failed, the server most likely requires a client certificate to connect". |
| In this case the error may also have been caused by lack of SNI. |
| |
| https://github.com/curl/curl/issues/6347 |
| |
| 2.15 Renegotiate from server may cause hang for OpenSSL backend |
| |
| A race condition has been observed when, immediately after the initial |
| handshake, curl has sent an HTTP request to the server and at the same time |
| the server has sent a TLS hello request (renegotiate) to curl. Both are |
| waiting for the other to respond. OpenSSL is supposed to send a handshake |
| response but does not. |
| |
| https://github.com/curl/curl/issues/6785 |
| https://github.com/openssl/openssl/issues/14722 |
| |
| 3. Email protocols |
| |
| 3.1 IMAP SEARCH ALL truncated response |
| |
| IMAP "SEARCH ALL" truncates output on large boxes. "A quick search of the |
| code reveals that pingpong.c contains some truncation code, at line 408, when |
| it deems the server response to be too large truncating it to 40 characters" |
| https://curl.se/bug/view.cgi?id=1366 |
| |
| 3.2 No disconnect command |
| |
| The disconnect commands (LOGOUT and QUIT) may not be sent by IMAP, POP3 and |
| SMTP if a failure occurs during the authentication phase of a connection. |
| |
| 3.3 POP3 expects "CRLF.CRLF" eob for some single-line responses |
| |
| You have to tell libcurl not to expect a body, when dealing with one line |
| response commands. Please see the POP3 examples and test cases which show |
| this for the NOOP and DELE commands. https://curl.se/bug/?i=740 |
| |
| 3.4 AUTH PLAIN for SMTP is not working on all servers |
| |
| Specifying "--login-options AUTH=PLAIN" on the command line does not seem to |
| work correctly. |
| |
| See https://github.com/curl/curl/issues/4080 |
| |
| 4. Command line |
| |
| 4.1 -J and -O with %-encoded file names |
| |
| -J/--remote-header-name does not decode %-encoded file names. RFC6266 details |
| how it should be done. The can of worm is basically that we have no charset |
| handling in curl and ascii >=128 is a challenge for us. Not to mention that |
| decoding also means that we need to check for nastiness that is attempted, |
| like "../" sequences and the like. Probably everything to the left of any |
| embedded slashes should be cut off. |
| https://curl.se/bug/view.cgi?id=1294 |
| |
| -O also does not decode %-encoded names, and while it has even less |
| information about the charset involved the process is similar to the -J case. |
| |
| Note that we will not add decoding to -O without the user asking for it with |
| some other means as well, since -O has always been documented to use the name |
| exactly as specified in the URL. |
| |
| 4.2 -J with -C - fails |
| |
| When using -J (with -O), automatically resumed downloading together with "-C |
| -" fails. Without -J the same command line works! This happens because the |
| resume logic is worked out before the target file name (and thus its |
| pre-transfer size) has been figured out! |
| https://curl.se/bug/view.cgi?id=1169 |
| |
| 4.3 --retry and transfer timeouts |
| |
| If using --retry and the transfer timeouts (possibly due to using -m or |
| -y/-Y) the next attempt does not resume the transfer properly from what was |
| downloaded in the previous attempt but will truncate and restart at the |
| original position where it was at before the previous failed attempt. See |
| https://curl.se/mail/lib-2008-01/0080.html and Mandriva bug report |
| https://qa.mandriva.com/show_bug.cgi?id=22565 |
| |
| 5. Build and portability issues |
| |
| 5.1 OS400 port requires deprecated IBM library |
| |
| curl for OS400 requires QADRT to build, which provides ASCII wrappers for |
| libc/POSIX functions in the ILE, but IBM no longer supports or even offers |
| this library to download. |
| |
| See https://github.com/curl/curl/issues/5176 |
| |
| 5.2 curl-config --libs contains private details |
| |
| "curl-config --libs" will include details set in LDFLAGS when configure is |
| run that might be needed only for building libcurl. Further, curl-config |
| --cflags suffers from the same effects with CFLAGS/CPPFLAGS. |
| |
| 5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10 |
| |
| See https://github.com/curl/curl/issues/2905 |
| |
| 5.4 Build with statically built dependency |
| |
| The build scripts in curl (autotools, cmake and others) are primarily done to |
| work with shared/dynamic third party dependencies. When linking with shared |
| libraries, the dependency "chain" is handled automatically by the library |
| loader - on all modern systems. |
| |
| If you instead link with a static library, we need to provide all the |
| dependency libraries already at the link command line. |
| |
| Figuring out all the dependency libraries for a given library is hard, as it |
| might also involve figuring out the dependencies of the dependencies and they |
| may vary between platforms and even change between versions. |
| |
| When using static dependencies, the build scripts will mostly assume that |
| you, the user, will provide all the necessary additional dependency libraries |
| as additional arguments in the build. With configure, by setting LIBS/LDFLAGS |
| on the command line. |
| |
| We welcome help to improve curl's ability to link with static libraries, but |
| it is likely a task that we can never fully support. |
| |
| 5.5 cannot handle Unicode arguments in non-Unicode builds on Windows |
| |
| If a URL or filename cannot be encoded using the user's current codepage then |
| it can only be encoded properly in the Unicode character set. Windows uses |
| UTF-16 encoding for Unicode and stores it in wide characters, however curl |
| and libcurl are not equipped for that at the moment except when built with |
| _UNICODE and UNICODE defined. And, except for Cygwin, Windows cannot use UTF-8 |
| as a locale. |
| |
| https://curl.se/bug/?i=345 |
| https://curl.se/bug/?i=731 |
| https://curl.se/bug/?i=3747 |
| |
| 5.7 Visual Studio project gaps |
| |
| The Visual Studio projects lack some features that the autoconf and nmake |
| builds offer, such as the following: |
| |
| - support for zlib and nghttp2 |
| - use of static runtime libraries |
| - add the test suite components |
| |
| In addition to this the following could be implemented: |
| |
| - support for other development IDEs |
| - add PATH environment variables for third-party DLLs |
| |
| 5.8 configure finding libs in wrong directory |
| |
| When the configure script checks for third-party libraries, it adds those |
| directories to the LDFLAGS variable and then tries linking to see if it |
| works. When successful, the found directory is kept in the LDFLAGS variable |
| when the script continues to execute and do more tests and possibly check for |
| more libraries. |
| |
| This can make subsequent checks for libraries wrongly detect another |
| installation in a directory that was previously added to LDFLAGS by another |
| library check! |
| |
| A possibly better way to do these checks would be to keep the pristine LDFLAGS |
| even after successful checks and instead add those verified paths to a |
| separate variable that only after all library checks have been performed gets |
| appended to LDFLAGS. |
| |
| 5.9 Utilize Requires.private directives in libcurl.pc |
| |
| https://github.com/curl/curl/issues/864 |
| |
| 5.10 SMB tests fail with Python 2 |
| |
| The error message says "TreeConnectAndX not found". |
| |
| See https://github.com/curl/curl/issues/5983 |
| |
| 5.11 configure --with-gssapi with Heimdal is ignored on macOS |
| |
| ... unless you also pass --with-gssapi-libs |
| |
| https://github.com/curl/curl/issues/3841 |
| |
| 5.12 flaky Windows CI builds |
| |
| We run many CI builds for each commit and PR on github, and especially a |
| number of the Windows builds are flaky. This means that we rarely get all CI |
| builds go green and complete without errors. This is unfortunate as it makes |
| us sometimes miss actual build problems and it is surprising to newcomers to |
| the project who (rightfully) do not expect this. |
| |
| See https://github.com/curl/curl/issues/6972 |
| |
| 6. Authentication |
| |
| 6.1 NTLM authentication and unicode |
| |
| NTLM authentication involving unicode user name or password only works |
| properly if built with UNICODE defined together with the Schannel |
| backend. The original problem was mentioned in: |
| https://curl.se/mail/lib-2009-10/0024.html |
| https://curl.se/bug/view.cgi?id=896 |
| |
| The Schannel version verified to work as mentioned in |
| https://curl.se/mail/lib-2012-07/0073.html |
| |
| 6.2 MIT Kerberos for Windows build |
| |
| libcurl fails to build with MIT Kerberos for Windows (KfW) due to KfW's |
| library header files exporting symbols/macros that should be kept private to |
| the KfW library. See ticket #5601 at https://krbdev.mit.edu/rt/ |
| |
| 6.3 NTLM in system context uses wrong name |
| |
| NTLM authentication using SSPI (on Windows) when (lib)curl is running in |
| "system context" will make it use wrong(?) user name - at least when compared |
| to what winhttp does. See https://curl.se/bug/view.cgi?id=535 |
| |
| 6.4 Negotiate and Kerberos V5 need a fake user name |
| |
| In order to get Negotiate (SPNEGO) authentication to work in HTTP or Kerberos |
| V5 in the e-mail protocols, you need to provide a (fake) user name (this |
| concerns both curl and the lib) because the code wrongly only considers |
| authentication if there's a user name provided by setting |
| conn->bits.user_passwd in url.c https://curl.se/bug/view.cgi?id=440 How? |
| https://curl.se/mail/lib-2004-08/0182.html A possible solution is to |
| either modify this variable to be set or introduce a variable such as |
| new conn->bits.want_authentication which is set when any of the authentication |
| options are set. |
| |
| 6.5 NTLM does not support password with ยง character |
| |
| https://github.com/curl/curl/issues/2120 |
| |
| 6.6 libcurl can fail to try alternatives with --proxy-any |
| |
| When connecting via a proxy using --proxy-any, a failure to establish an |
| authentication will cause libcurl to abort trying other options if the |
| failed method has a higher preference than the alternatives. As an example, |
| --proxy-any against a proxy which advertise Negotiate and NTLM, but which |
| fails to set up Kerberos authentication will not proceed to try authentication |
| using NTLM. |
| |
| https://github.com/curl/curl/issues/876 |
| |
| 6.7 Do not clear digest for single realm |
| |
| https://github.com/curl/curl/issues/3267 |
| |
| 6.8 RTSP authentication breaks without redirect support |
| |
| RTSP authentication broke in 7.66.0. A work-around is to enable RTSP in |
| CURLOPT_REDIR_PROTOCOLS. Authentication should however not be considered an |
| actual redirect so a "proper" fix needs to be different and not require users |
| to allow redirects to RTSP to work. |
| |
| See https://github.com/curl/curl/pull/4750 |
| |
| 6.9 SHA-256 digest not supported in Windows SSPI builds |
| |
| Windows builds of curl that have SSPI enabled use the native Windows API calls |
| to create authentication strings. The call to InitializeSecurityContext fails |
| with SEC_E_QOP_NOT_SUPPORTED which causes curl to fail with CURLE_AUTH_ERROR. |
| |
| Microsoft does not document supported digest algorithms and that SEC_E error |
| code is not a documented error for InitializeSecurityContext (digest). |
| |
| https://github.com/curl/curl/issues/6302 |
| |
| 6.10 curl never completes Negotiate over HTTP |
| |
| Apparently it is not working correctly...? |
| |
| See https://github.com/curl/curl/issues/5235 |
| |
| 6.11 Negotiate on Windows fails |
| |
| When using --negotiate (or NTLM) with curl on Windows, SSL/TSL handshake |
| fails despite having a valid kerberos ticket cached. Works without any issue |
| in Unix/Linux. |
| |
| https://github.com/curl/curl/issues/5881 |
| |
| 6.12 cannot use Secure Transport with Crypto Token Kit |
| |
| https://github.com/curl/curl/issues/7048 |
| |
| 7. FTP |
| |
| 7.1 FTP without or slow 220 response |
| |
| If a connection is made to a FTP server but the server then just never sends |
| the 220 response or otherwise is dead slow, libcurl will not acknowledge the |
| connection timeout during that phase but only the "real" timeout - which may |
| surprise users as it is probably considered to be the connect phase to most |
| people. Brought up (and is being misunderstood) in: |
| https://curl.se/bug/view.cgi?id=856 |
| |
| 7.2 FTP with CONNECT and slow server |
| |
| When doing FTP over a socks proxy or CONNECT through HTTP proxy and the multi |
| interface is used, libcurl will fail if the (passive) TCP connection for the |
| data transfer is not more or less instant as the code does not properly wait |
| for the connect to be confirmed. See test case 564 for a first shot at a test |
| case. |
| |
| 7.3 FTP with NOBODY and FAILONERROR |
| |
| It seems sensible to be able to use CURLOPT_NOBODY and CURLOPT_FAILONERROR |
| with FTP to detect if a file exists or not, but it is not working: |
| https://curl.se/mail/lib-2008-07/0295.html |
| |
| 7.4 FTP with ACCT |
| |
| When doing an operation over FTP that requires the ACCT command (but not when |
| logging in), the operation will fail since libcurl does not detect this and |
| thus fails to issue the correct command: |
| https://curl.se/bug/view.cgi?id=635 |
| |
| 7.5 ASCII FTP |
| |
| FTP ASCII transfers do not follow RFC959. They do not convert the data |
| accordingly (not for sending nor for receiving). RFC 959 section 3.1.1.1 |
| clearly describes how this should be done: |
| |
| The sender converts the data from an internal character representation to |
| the standard 8-bit NVT-ASCII representation (see the Telnet |
| specification). The receiver will convert the data from the standard |
| form to his own internal form. |
| |
| Since 7.15.4 at least line endings are converted. |
| |
| 7.6 FTP with NULs in URL parts |
| |
| FTP URLs passed to curl may contain NUL (0x00) in the RFC 1738 <user>, |
| <password>, and <fpath> components, encoded as "%00". The problem is that |
| curl_unescape does not detect this, but instead returns a shortened C string. |
| From a strict FTP protocol standpoint, NUL is a valid character within RFC |
| 959 <string>, so the way to handle this correctly in curl would be to use a |
| data structure other than a plain C string, one that can handle embedded NUL |
| characters. From a practical standpoint, most FTP servers would not |
| meaningfully support NUL characters within RFC 959 <string>, anyway (e.g., |
| Unix pathnames may not contain NUL). |
| |
| 7.7 FTP and empty path parts in the URL |
| |
| libcurl ignores empty path parts in FTP URLs, whereas RFC1738 states that |
| such parts should be sent to the server as 'CWD ' (without an argument). The |
| only exception to this rule, is that we knowingly break this if the empty |
| part is first in the path, as then we use the double slashes to indicate that |
| the user wants to reach the root dir (this exception SHALL remain even when |
| this bug is fixed). |
| |
| 7.8 Premature transfer end but healthy control channel |
| |
| When 'multi_done' is called before the transfer has been completed the normal |
| way, it is considered a "premature" transfer end. In this situation, libcurl |
| closes the connection assuming it does not know the state of the connection so |
| it cannot be reused for subsequent requests. |
| |
| With FTP however, this is not necessarily true but there are a bunch of |
| situations (listed in the ftp_done code) where it *could* keep the connection |
| alive even in this situation - but the current code does not. Fixing this would |
| allow libcurl to reuse FTP connections better. |
| |
| 7.9 Passive transfer tries only one IP address |
| |
| When doing FTP operations through a proxy at localhost, the reported spotted |
| that curl only tried to connect once to the proxy, while it had multiple |
| addresses and a failed connect on one address should make it try the next. |
| |
| After switching to passive mode (EPSV), curl should try all IP addresses for |
| "localhost". Currently it tries ::1, but it should also try 127.0.0.1. |
| |
| See https://github.com/curl/curl/issues/1508 |
| |
| 7.10 FTPS needs session reuse |
| |
| When the control connection is reused for a subsequent transfer, some FTPS |
| servers complain about "missing session reuse" for the data channel for the |
| second transfer. |
| |
| https://github.com/curl/curl/issues/4654 |
| |
| 7.11 FTPS upload data loss with TLS 1.3 |
| |
| During FTPS upload curl does not attempt to read TLS handshake messages sent |
| after the initial handshake. OpenSSL servers running TLS 1.3 may send such a |
| message. When curl closes the upload connection if unread data has been |
| received (such as a TLS handshake message) then the TCP protocol sends an |
| RST to the server, which may cause the server to discard or truncate the |
| upload if it has not read all sent data yet, and then return an error to curl |
| on the control channel connection. |
| |
| Since 7.78.0 this is mostly fixed. curl will do a single read before closing |
| TLS connections (which causes the TLS library to read handshake messages), |
| however there is still possibility of an RST if more messages need to be read |
| or a message arrives after the read but before close (network race condition). |
| |
| https://github.com/curl/curl/issues/6149 |
| |
| 8. TELNET |
| |
| 8.1 TELNET and time limitations do not work |
| |
| When using telnet, the time limitation options do not work. |
| https://curl.se/bug/view.cgi?id=846 |
| |
| 8.2 Microsoft telnet server |
| |
| There seems to be a problem when connecting to the Microsoft telnet server. |
| https://curl.se/bug/view.cgi?id=649 |
| |
| |
| 9. SFTP and SCP |
| |
| 9.1 SFTP does not do CURLOPT_POSTQUOTE correct |
| |
| When libcurl sends CURLOPT_POSTQUOTE commands when connected to a SFTP server |
| using the multi interface, the commands are not being sent correctly and |
| instead the connection is "cancelled" (the operation is considered done) |
| prematurely. There is a half-baked (busy-looping) patch provided in the bug |
| report but it cannot be accepted as-is. See |
| https://curl.se/bug/view.cgi?id=748 |
| |
| 9.2 wolfssh: publickey auth does not work |
| |
| When building curl to use the wolfSSH backend for SFTP, the publickey |
| authentication does not work. This is simply functionality not written for curl |
| yet, the necessary API for make this work is provided by wolfSSH. |
| |
| See https://github.com/curl/curl/issues/4820 |
| |
| 9.3 Remote recursive folder creation with SFTP |
| |
| On this servers, the curl fails to create directories on the remote server |
| even when CURLOPT_FTP_CREATE_MISSING_DIRS option is set. |
| |
| See https://github.com/curl/curl/issues/5204 |
| |
| |
| 10. SOCKS |
| |
| 10.3 FTPS over SOCKS |
| |
| libcurl does not support FTPS over a SOCKS proxy. |
| |
| 10.4 active FTP over a SOCKS |
| |
| libcurl does not support active FTP over a SOCKS proxy |
| |
| |
| 11. Internals |
| |
| 11.1 Curl leaks .onion hostnames in DNS |
| |
| Curl sends DNS requests for hostnames with a .onion TLD. This leaks |
| information about what the user is attempting to access, and violates this |
| requirement of RFC7686: https://tools.ietf.org/html/rfc7686 |
| |
| Issue: https://github.com/curl/curl/issues/543 |
| |
| 11.2 error buffer not set if connection to multiple addresses fails |
| |
| If you ask libcurl to resolve a hostname like example.com to IPv6 addresses |
| only. But you only have IPv4 connectivity. libcurl will correctly fail with |
| CURLE_COULDNT_CONNECT. But the error buffer set by CURLOPT_ERRORBUFFER |
| remains empty. Issue: https://github.com/curl/curl/issues/544 |
| |
| 11.3 Disconnects do not do verbose |
| |
| Due to how libcurl keeps connections alive in the "connection pool" after use |
| to potentially transcend the life-time of the initial easy handle that was |
| used to drive the transfer over that connection, it uses a *separate* and |
| internal easy handle when it shuts down the connection. That separate |
| connection might not have the exact same settings as the original easy |
| handle, and in particular it is often note-worthy that it does not have the |
| same VERBOSE and debug callbacks setup so that an application will not get |
| the protocol data for the disconnect phase of a transfer the same way it got |
| all the other data. |
| |
| This is because the original easy handle might have already been freed at that |
| point and the application might not at all be prepared that the callback |
| would get called again long after the handle was freed. |
| |
| See for example https://github.com/curl/curl/issues/6995 |
| |
| 11.4 HTTP test server 'connection-monitor' problems |
| |
| The 'connection-monitor' feature of the sws HTTP test server does not work |
| properly if some tests are run in unexpected order. Like 1509 and then 1525. |
| |
| See https://github.com/curl/curl/issues/868 |
| |
| 11.5 Connection information when using TCP Fast Open |
| |
| CURLINFO_LOCAL_PORT (and possibly a few other) fails when TCP Fast Open is |
| enabled. |
| |
| See https://github.com/curl/curl/issues/1332 and |
| https://github.com/curl/curl/issues/4296 |
| |
| 11.6 slow connect to localhost on Windows |
| |
| When connecting to "localhost" on Windows, curl will resolve the name for |
| both ipv4 and ipv6 and try to connect to both happy eyeballs-style. Something |
| in there does however make it take 200 milliseconds to succeed - which is the |
| HAPPY_EYEBALLS_TIMEOUT define exactly. Lowering that define speeds up the |
| connection, suggesting a problem in the HE handling. |
| |
| If we can *know* that we are talking to a local host, we should lower the |
| happy eyeballs delay timeout for IPv6 (related: hardcode the "localhost" |
| addresses, mentioned in TODO). Possibly we should reduce that delay for all. |
| |
| https://github.com/curl/curl/issues/2281 |
| |
| 11.7 signal-based resolver timeouts |
| |
| libcurl built without an asynchronous resolver library uses alarm() to time |
| out DNS lookups. When a timeout occurs, this causes libcurl to jump from the |
| signal handler back into the library with a sigsetjmp, which effectively |
| causes libcurl to continue running within the signal handler. This is |
| non-portable and could cause problems on some platforms. A discussion on the |
| problem is available at https://curl.se/mail/lib-2008-09/0197.html |
| |
| Also, alarm() provides timeout resolution only to the nearest second. alarm |
| ought to be replaced by setitimer on systems that support it. |
| |
| 11.8 DoH leaks memory after followlocation |
| |
| https://github.com/curl/curl/issues/4592 |
| |
| 11.9 DoH does not inherit all transfer options |
| |
| Some options are not inherited because they are not relevant for the DoH SSL |
| connections, or inheriting the option may result in unexpected behavior. For |
| example the user's debug function callback is not inherited because it would |
| be unexpected for internal handles (ie DoH handles) to be passed to that |
| callback. |
| |
| If an option is not inherited then it is not possible to set it separately for |
| DoH without a DoH-specific option. For example: CURLOPT_DOH_SSL_VERIFYHOST, |
| CURLOPT_DOH_SSL_VERIFYPEER and CURLOPT_DOH_SSL_VERIFYSTATUS. |
| |
| See https://github.com/curl/curl/issues/6605 |
| |
| 11.10 Blocking socket operations in non-blocking API |
| |
| The list of blocking socket operations is in TODO section "More non-blocking". |
| |
| 11.11 A shared connection cache is not thread-safe |
| |
| The share interface offers CURL_LOCK_DATA_CONNECT to have multiple easy |
| handle share a connection cache, but due to how connections are used they are |
| still not thread-safe when used shared. |
| |
| See https://github.com/curl/curl/issues/4915 and lib1541.c |
| |
| 11.12 'no_proxy' string-matches IPv6 numerical addresses |
| |
| This has the downside that "::1" for example does not match "::0:1" even |
| though they are in fact the same address. |
| |
| See https://github.com/curl/curl/issues/5745 |
| |
| 11.13 wakeup socket disconnect causes havoc |
| |
| waking an iPad breaks the wakeup socket pair, triggering a POLLIN event and |
| resulting in SOCKERRNO being set to ENOTCONN. |
| |
| This condition, and other possible error conditions on the wakeup socket, are |
| not handled, so the condition remains on the FD and curl_multi_poll will |
| never block again. |
| |
| See https://github.com/curl/curl/issues/6132 and |
| https://github.com/curl/curl/pull/6133 |
| |
| 11.14 Multi perform hangs waiting for threaded resolver |
| |
| If a threaded resolver takes a long time to complete, libcurl can be blocked |
| waiting for it for a longer time than expected - and longer than the set |
| timeouts. |
| |
| See https://github.com/curl/curl/issues/2975 and |
| https://github.com/curl/curl/issues/4852 |
| |
| 11.15 CURLOPT_OPENSOCKETPAIRFUNCTION is missing |
| |
| When libcurl creates sockets with socketpair(), those are not "exposed" in |
| CURLOPT_OPENSOCKETFUNCTION and therefore might surprise and be unknown to |
| applications that expects and wants all sockets known beforehand. One way to |
| address this issue is to introduce a CURLOPT_OPENSOCKETPAIRFUNCTION callback. |
| |
| https://github.com/curl/curl/issues/5747 |
| |
| 11.16 libcurl uses renames instead of locking for atomic operations |
| |
| For saving cookies, alt-svc and hsts files. This is bad when for example the |
| file is stored in a directory where the application has no write permission |
| but it has permission for the file. |
| |
| https://github.com/curl/curl/issues/6882 |
| https://github.com/curl/curl/pull/6884 |
| |
| 12. LDAP |
| |
| 12.1 OpenLDAP hangs after returning results |
| |
| By configuration defaults, openldap automatically chase referrals on |
| secondary socket descriptors. The OpenLDAP backend is asynchronous and thus |
| should monitor all socket descriptors involved. Currently, these secondary |
| descriptors are not monitored, causing openldap library to never receive |
| data from them. |
| |
| As a temporary workaround, disable referrals chasing by configuration. |
| |
| The fix is not easy: proper automatic referrals chasing requires a |
| synchronous bind callback and monitoring an arbitrary number of socket |
| descriptors for a single easy handle (currently limited to 5). |
| |
| Generic LDAP is synchronous: OK. |
| |
| See https://github.com/curl/curl/issues/622 and |
| https://curl.se/mail/lib-2016-01/0101.html |
| |
| 12.2 LDAP on Windows does authentication wrong? |
| |
| https://github.com/curl/curl/issues/3116 |
| |
| 12.3 LDAP on Windows does not work |
| |
| A simple curl command line getting "ldap://ldap.forumsys.com" returns an |
| error that says "no memory" ! |
| |
| https://github.com/curl/curl/issues/4261 |
| |
| 12.4 LDAPS with NSS is slow |
| |
| See https://github.com/curl/curl/issues/5874 |
| |
| 13. TCP/IP |
| |
| 13.1 --interface for ipv6 binds to unusable IP address |
| |
| Since IPv6 provides a lot of addresses with different scope, binding to an |
| IPv6 address needs to take the proper care so that it does not bind to a |
| locally scoped address as that is bound to fail. |
| |
| https://github.com/curl/curl/issues/686 |
| |
| 14. DICT |
| |
| 14.1 DICT responses show the underlying protocol |
| |
| When getting a DICT response, the protocol parts of DICT are not stripped off |
| from the output. |
| |
| https://github.com/curl/curl/issues/1809 |
| |
| 15. CMake |
| |
| 15.1 use correct SONAME |
| |
| The autotools build sets the SONAME properly according to VERSIONINFO in |
| lib/Makefile.am and so should cmake to make comparable build. |
| |
| See https://github.com/curl/curl/pull/5935 |
| |
| 15.2 support build with GnuTLS |
| |
| 15.3 unusable tool_hugehelp.c with MinGW |
| |
| see https://github.com/curl/curl/issues/3125 |
| |
| 15.4 build docs/curl.1 |
| |
| The cmake build does not create the docs/curl.1 file and therefore must rely on |
| it being there already. This makes the --manual option not work and test |
| cases like 1139 cannot function. |
| |
| 15.5 build on Linux links libcurl to libdl |
| |
| ... which it should not need to! |
| |
| See https://github.com/curl/curl/issues/6165 |
| |
| 15.6 uses -lpthread instead of Threads::Threads |
| |
| See https://github.com/curl/curl/issues/6166 |
| |
| 15.7 generated .pc file contains strange entries |
| |
| The Libs.private field of the generated .pc file contains -lgcc -lgcc_s -lc |
| -lgcc -lgcc_s |
| |
| See https://github.com/curl/curl/issues/6167 |
| |
| 15.8 libcurl.pc uses absolute library paths |
| |
| The libcurl.pc file generated by cmake contains things like Libs.private: |
| /usr/lib64/libssl.so /usr/lib64/libcrypto.so /usr/lib64/libz.so. The |
| autotools equivalent would say Libs.private: -lssl -lcrypto -lz |
| |
| See https://github.com/curl/curl/issues/6169 |
| |
| 15.9 cert paths autodetected when cross-compiling |
| |
| The autotools build disables the ca_path/ca_bundle detection when |
| cross-compiling. The cmake build keeps doing the detection. |
| |
| See https://github.com/curl/curl/issues/6178 |
| |
| 15.10 libspsl is not supported |
| |
| See https://github.com/curl/curl/issues/6214 |
| |
| 15.11 ExternalProject_Add does not set CURL_CA_PATH |
| |
| CURL_CA_BUNDLE and CURL_CA_PATH are not set properly when cmake's |
| ExternalProject_Add is used to build curl as a dependency. |
| |
| See https://github.com/curl/curl/issues/6313 |
| |
| 15.12 cannot enable LDAPS on Windows |
| |
| See https://github.com/curl/curl/issues/6284 |
| |
| 15.13 CMake build with MIT Kerberos does not work |
| |
| Minimum CMake version was bumped in curl 7.71.0 (#5358) Since CMake 3.2 |
| try_compile started respecting the CMAKE_EXE_FLAGS. The code dealing with |
| MIT Kerberos detection sets few variables to potentially weird mix of space, |
| and ;-separated flags. It had to blow up at some point. All the CMake checks |
| that involve compilation are doomed from that point, the configured tree |
| cannot be built. |
| |
| https://github.com/curl/curl/issues/6904 |
| |
| 16. Applications |
| |
| 16.1 pulseUI VPN client |
| |
| This application crashes at startup with libcurl 7.74.0 (and presumably later |
| versions too) after we cleaned up OpenSSL initialization. Since this is the |
| only known application to do this, we suspect it is related to something they |
| are doing in their setup that is not kosher. We have not been able to get in |
| contact with them nor got any technical details to help us debug this |
| further. |
| |
| See |
| https://community.pulsesecure.net/t5/Pulse-Desktop-Clients/Linux-Pulse-Client-does-not-work-with-curl-7-74/m-p/44378 |
| and https://github.com/curl/curl/issues/6306 |
| |
| 17. HTTP/2 |
| |
| 17.1 Excessive HTTP/2 packets with TCP_NODELAY |
| |
| Because of how curl sets TCP_NODELAY by default, HTTP/2 requests are issued |
| using more separate TCP packets than it would otherwise need to use. This |
| means spending more bytes than it has to. Just disabling TCP_NODELAY for |
| HTTP/2 is also not the correct fix because that then makes the outgoing |
| packets to get delayed. |
| |
| See https://github.com/curl/curl/issues/6363 |
| |
| 17.2 HTTP/2 frames while in the connection pool kill reuse |
| |
| If the server sends HTTP/2 frames (like for example an HTTP/2 PING frame) to |
| curl while the connection is held in curl's connection pool, the socket will |
| be found readable when considered for reuse and that makes curl think it is |
| dead and then it will be closed and a new connection gets created instead. |
| |
| This is *best* fixed by adding monitoring to connections while they are kept |
| in the pool so that pings can be responded to appropriately. |
| |
| 17.3 ENHANCE_YOUR_CALM causes infinite retries |
| |
| Infinite retries with 2 parallel requests on one connection receiving GOAWAY |
| with ENHANCE_YOUR_CALM error code. |
| |
| See https://github.com/curl/curl/issues/5119 |
| |
| 17.4 Connection failures with parallel HTTP/2 |
| |
| See https://github.com/curl/curl/issues/5611 |
| |
| 17.5 HTTP/2 connections through HTTPS proxy frequently stall |
| |
| See https://github.com/curl/curl/issues/6936 |
| |
| 18. HTTP/3 |
| |
| 18.1 If the HTTP/3 server closes connection during upload curl hangs |
| |
| See https://github.com/curl/curl/issues/6606 |
| |
| 18.2 Uploading HTTP/3 files gets interrupted at certain file sizes |
| |
| See https://github.com/curl/curl/issues/6510 |
| |
| 18.3 HTTP/3 download is 5x times slower than HTTP/2 |
| |
| See https://github.com/curl/curl/issues/6494 |
| |
| 18.4 Downloading with HTTP/3 produces broken files |
| |
| See https://github.com/curl/curl/issues/7351 |
| |
| 18.5 HTTP/3 download with quiche halts after a while |
| |
| See https://github.com/curl/curl/issues/7339 |
| |
| 18.6 HTTP/3 multipart POST with quiche fails |
| |
| https://github.com/curl/curl/issues/7125 |
| |
| 18.7 HTTP/3 quiche upload large file fails |
| |
| https://github.com/curl/curl/issues/7532 |
| |
| 18.8 HTTP/3 does not support client certs |
| |
| aka "mutual authentication". |
| |
| https://github.com/curl/curl/issues/7625 |
| |
| 18.9 connection migration does not work |
| |
| https://github.com/curl/curl/issues/7695 |