Commit graph

14837 commits

Author SHA1 Message Date
Stefan Eissing
5eefdd71a3
vquic: ngtcp2 + openssl support
With the new addition of OpenSSL QUIC API support and the support in
ngtcp2 main branch, make the necessary adjustments in curl to support
this combination.

- add support in configure.ac to detect the feature OPENSSL_QUIC_API2 in
  openssl
- initialise ngtcp2 properly in this combination
- add a Curl_vquic_init() for global initialisation that ngtcp2 likes
  for performance reasons
- add documentation on how to build in docs/HTTP3.md
- add CI testing in http3-linux.yml

Assisted-by: Viktor Szakats
Closes #17027
2025-04-16 22:32:07 +02:00
Viktor Szakats
07cc50f8eb
cmake: add openssl 3.5.0 + ngtcp2 support
```
curl 8.13.1-DEV (Darwin) libcurl/8.13.1-DEV OpenSSL/3.5.0 [...] ngtcp2/1.12.90 nghttp3/1.9.0
Release-Date: [unreleased]
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS brotli HSTS HTTP2 HTTP3 HTTPS-proxy IDN IPv6 Largefile libz NTLM PSL SSL threadsafe TLS-SRP UnixSockets zstd
```

Ref: #17027
Closes #17018
2025-04-16 17:03:56 +02:00
Daniel Stenberg
c6db2d45b2
asyn-ares: fix build with old c-ares
See https://app.circleci.com/pipelines/github/curl/curl/13081/workflows/7d80b69e-9886-4f4c-b467-0fa321a0f8c2/jobs/130479

Closes #17075
2025-04-16 16:40:40 +02:00
Stefan Eissing
1ebd92d0fd
async: DoH improvements
Adds a "meta_hash" to each easy handle for keeping special data during
operations. All meta data set needs to add its destructor callback, so
that meta data gets destroyed properly when the easy handle is cleaned
up or reset.

Add data->master_mid for "sub" transfers that belong to a "master" easy
handle. When a "sub" transfer is done, the corresponding "master" can
add a callback to be invoked. Used in DoH name resolution.

DoH: use easy meta hash to add internal structs for DoH name resolution.
One in each in each probe easy handle. When probes are done, response
data is copied from the probe to the initiating easy.

This allows DoH using transfers and their probes to be cleaned up in any
sequence correctly.

Fold DoH cleanup into the Curl_async_shutdown() and Curl_async_destroy()
functions.

Closes #16384
2025-04-16 16:06:03 +02:00
Viktor Szakats
8478365e29
cmake: enable -Wall for MSVC when PICKY_COMPILER=ON
Enable it for `_MSC_VER <= 1943`.

Omit it for not yet CI-tested MSVC versions, to avoid hitting unfixed
warnings emitted by future toolchain releases. It means we need
to explicitly opt-in to newer MSVC versions while fixing any new issues.

The newly enabled warnings did not reveal new issues. It hints that we
catch those with clang/gcc. Yet, these warnings may be useful for local
development done with MSVC.

Also:
- disable and document warnings that don't seem useful, unactionable,
  or unfixable.
- disable and document warnings found in Windows SDK headers.
- tidy up a few comments, also to avoid
  `-Wdocumentation-unknown-command`, part of llvm/clang `-Wall`.
  ```
  lib\dynhds.h(159,29): error : unknown command tag name [-Werror,-Wdocumentation-unknown-command]
  lib\ftp.c(337,15): error : unknown command tag name [-Werror,-Wdocumentation-unknown-command]
  ```
  (This patch did not end up enabling `-Wall` for clang-cl.)

Closes #17050
2025-04-16 14:34:12 +02:00
Christian Schmitz
8ad0243e1f
mqtt: send ping at upkeep interval
Closes #16975
2025-04-16 09:36:19 +02:00
Stefan Eissing
56e40ae6a5
asyn resolver code improvements
"asyn" is the internal name under which both c-ares and threaded
resolver operate. Make the naming more consistent. Implement the c-ares
resolver in `asyn-ares.*` and the threaded resolver in `asyn-thrdd.*`.
The common functions are in `asyn-base.c`.

When `CURLRES_ASYNCH` is defined, either of the two is used and
`data->state.async` exists. Members of that struct vary for the selected
implementation, but have the fields `hostname`, `port` and `ip_version`
always present. This are populated when the async resolving starts and
eliminate the need to pass them again when checking on the status and
processing the results of the resolving.

Add a `Curl_resolv_blocking()` to `hostip.h` that relieves FTP and SOCKS
from having to repeat the same code.

`Curl_resolv_check()` remains the function to check for status of
ongoing resolving. Now it also performs internally the check if the
needed DNS entry exists in the dnscache and if so, aborts the asnyc
operation. (libcurl right now does not check for duplicate resolve
attempts. an area for future improvements).

The number of functions in `asyn.h` has been reduced. There were subtle
difference in "cancel()" and "kill()" calls, both replaced by
`Curl_async_shutdown()` now. This changes behaviour for threaded
resolver insofar as the resolving thread is now always joined unless
`data->set.quick_exit` is set. Before this was only done on some code
paths. A future improvement would be a thread pool that keeps a limit
and also could handle joins more gracefully.

DoH, not previously tagged under "asny", has its struct `doh_probes` now
also in `data->state.async`, moved there from `data->req` because it
makes more sense. Further integration of DoH underneath the "asyn"
umbrella seems like a good idea.

Closes #16963
2025-04-16 09:34:20 +02:00
Joel Depooter
fe9898d26e
schannel: handle pkcs12 client certificates which contain CA certificates
The SChannel code uses the CertFindCertificateInStore function to
retrieve the client certificate from a pkcs12 certificate store.
However, when called with the CERT_FIND_ANY flag, this function does not
provide any guarantees on the order in which certificates are retrieved.
If a pkcs12 file contains an entire certificate chain instead of a
single client certificate, the CertFindCertificateInStore function may
return the CA or an intermediate certificate instead of the desired
client certificate. Since there is no associated private key for such a
certificate, the TLS handshake fails.

With this change, we now pass the CERT_FIND_HAS_PRIVATE_KEY flag. This
ensures that the CertFindCertificateInStore function will return a
certificate which has a corresponding private key. This will stop the CA
and intermediate certificates from being selected. I don't think there
would be much use in a client certificate which has no associated
private key, so this should ensure the client certificate is selected. I
suppose it may be possible for a pkcs12 file to contain multiple
certificates with private keys and the new behaviour may not guarantee
which is selected. However, this is no worse that the previous behaviour
in which any certificate may been selected.

The CERT_FIND_HAS_PRIVATE_KEY is only available in Windows 8 / Server
2012 (aka Windows NT6.2). For older versions, we will fall back to using
the CERT_FIND_ANY flag.

Closes #16825
2025-04-15 23:27:40 +02:00
Sören Tempel
fbdb1e1dbe
http: in alt-svc negotiation only allow supported HTTP versions
Without this patch, the handling of the alt-svc header added via
279a4772ae in curl-8.13.0 attempts to
connect to alternative services via different HTTP versions, even if the
target HTTP version is not supported by curl (i.e., not enabled at
compile-time). If I understand the code and RFC 7838 correctly, then we
should only attempt to migrate to supported protocols. Therefore,
`allowed_apns` should only contain such protocols, and we need to guard
its modification with `ifdefs` for supported HTTP versions.

This was discovered in a downstream bug report in Alpine Linux [1] where
it was reported that a Matrix client (using libcurl) was defunct after
the upgrade to curl-8.13.0. Further debugging revealed that this was due
to the Matrix server sending a `alt-svc: h3=":443";` HTTP header,
causing curl to attempt migration to HTTP3 even though Alpine's curl
version is compiled without HTTP3 support.

I am not sure if this is the best place in the code to address this
or if the `allowed` bitmask shouldn't contain unsupported versions
in the first place. However, since there are existing `ifdefs` in
this function for source (not destination) ALP selection, it may
be a good fit to address this here.

[1]: https://gitlab.alpinelinux.org/alpine/aports/-/issues/17062

Closes #17037
2025-04-15 23:09:10 +02:00
Cole Helbling
2404a11d85
curl_get_line: handle lines ending on the buffer boundary
Very similar to 9f8bdd0eae, but affects
e.g. netrc file parsing.

Suggested-by: Graham Christensen <graham@grahamc.com>

Add test 744 to verify

Closes #17036
2025-04-15 17:48:32 +02:00
Stefan Eissing
39326f8ae6
easy_reset: fix dohfor_mid member
On an easy reset, the dohfor_mid must be reset to -1.

Reported-by: epicmkirzinger on github
Fixes #17052
Closes #17058
2025-04-15 17:31:17 +02:00
Stefan Eissing
6ab5afbc36
dict: move internal defines to dict.c
Move defines only used in dict.c from urldata.h to implementation.

Closes #17060
2025-04-15 17:30:02 +02:00
Viktor Szakats
00e8ebf567
wolfssl: fix to enable ALPN when available
wolfSSL headers publish the `HAVE_ALPN` macro to tell if it has ALPN
support compiled in. Use that instead of `HAS_ALPN`, which was never
set.

Follow-up to edd573d980 #16167
Closes #17056
2025-04-15 12:34:18 +02:00
Viktor Szakats
ae1a861bd6
cmake: revert CURL_LTO behavior for multi-config generators
To avoid having LTO enabled for Debug configurations with multi-config
generators (e.g. MSVC.)

Reported-by: PleaseJustDont
Fixes #17042
Ref: ##17034
Follow-up to a1eaa12a83 #15829
Closes #17043
2025-04-14 02:08:24 +02:00
Viktor Szakats
14d4712db7
cmake: use the LINK_OPTIONS property with CMake 3.13+
Replacing the superseded `LINK_FLAGS` in these versions.

Follow-up to 7b14449790 #14378
Closes #17039
2025-04-12 20:59:44 +02:00
Stefan Eissing
ff37657e4d
cpool/cshutdown: force close connections under pressure
when CURLMOPT_MAX_HOST_CONNECTIONS or CURLMOPT_MAX_TOTAL_CONNECTIONS
limits are reached, force close connections in shutdown to go below
limit when possible.

Fixes #17020
Reported-by: Fujii Hironori
Closes #17022
2025-04-11 22:46:56 +02:00
Stefan Eissing
219302b4e6
openssl-quic: fix shutdown when stream not open
Check that h3 stream had been opened before telling nghttp3 to
shut it down.

Fixes #16998
Reported-by: Demi Marie Obenour
Closes #17003
2025-04-10 08:38:58 +02:00
Viktor Szakats
6af7ab3b39
cmake: quotes, whitespace, use VERSION_GREATER_EQUAL
- `NOT` + `VERSION_LESS` -> `VERSION_GREATER_EQUAL`
  Available since 3.7, which is the minimum required for curl:
  https://cmake.org/cmake/help/latest/command/if.html#version-greater-equal
- make `CMAKE_REQUIRED_*` argument quotes consistent.
- make `CMAKE_REQUIRED_*` space alignment consistent.
- drop quote from version value for consistency with other cases.
- formatting

Closes #17002
2025-04-10 01:42:59 +02:00
Viktor Szakats
304b01b8cf
cmake: use INCLUDE_DIRECTORIES prop to specify local header dirs
To use more modern cmake, and make it somewhat more obvious where these
header directories should apply.

Also move setting the directory property _before_ defining targets,
to make them inherit this directory property.

Ref: https://cmake.org/cmake/help/latest/command/include_directories.html
Ref: https://cmake.org/cmake/help/latest/prop_dir/INCLUDE_DIRECTORIES.html

Follow-up to 45f7cb7695 #16238

Closes #16993
2025-04-08 19:09:58 +02:00
Daniel Stenberg
625f2c1644
lib: include files using known path
by including headers using "../[header]" when done from C files in
subdirectories, we do not need to specify the lib source dir as an
include path and we reduce the risk of header name collisions with
headers in the SDK using the same file names.

Idea-by: Kai Pastor

Ref: #16949
Closes #16991
2025-04-08 17:00:00 +02:00
Viktor Szakats
04c78c897b
curl_multibyte: fixup low-level calls, include in unity builds
Also adjust `()` around low-level calls preventing macro overrides via
e.g. `memdebug.h`:
- add for `malloc` and `free`.
- drop for `_open`. (We do not override `_open` in curl.)

Tidy-up: also sync libcurlu custom macro order in cmake with autotools.

Follow-up to f42a279ee3 #11928

Closes #16742
2025-04-07 22:33:24 +02:00
Andy Pan
131a2fd5aa
socketpair: support pipe2 where available
By replacing pipe with pipe2, it would save us 4 extra system calls of
setting O_NONBLOCK and O_CLOEXEC. This system call is widely supported
across UNIX-like OS's: Linux, *BSD, and SunOS derivatives - Solaris,
illumos, etc.

Ref:
https://man7.org/linux/man-pages/man2/pipe.2.html
https://man.freebsd.org/cgi/man.cgi?query=pipe
https://man.dragonflybsd.org/?command=pipe2
https://man.netbsd.org/pipe.2
https://man.openbsd.org/pipe.2
https://docs.oracle.com/cd/E88353_01/html/E37841/pipe2-2.html
https://illumos.org/man/2/pipe2
https://www.gnu.org/software/gnulib/manual/html_node/pipe2.html

Closes #16987
2025-04-07 12:35:17 +02:00
Andy Pan
3d02872be7
socket: use accept4 when available
Linux, *BSD, and Solaris support accept4 system call that enables the
caller to assign additional flags and save some extra system calls. It
can come in handy when O_NONBLOCK or/and FD_CLOEXEC is/are required on a
socket after being accepted.

Ref:
https://man7.org/linux/man-pages/man2/accept.2.html
https://man.freebsd.org/cgi/man.cgi?query=accept4
https://man.dragonflybsd.org/?command=accept&section=2
https://man.openbsd.org/accept.2
https://man.netbsd.org/accept.2
https://docs.oracle.com/cd/E88353_01/html/E37843/accept4-3c.html
https://www.gnu.org/software/gnulib/manual/html_node/accept4.html

Closes #16979
2025-04-06 13:08:33 +02:00
Daniel Stenberg
b676ae3b2a
CURLOPT_HTTP_TRANSFER_DECODING: fixed
The fix in b8bd019c6a (#16959) broke the
CURLOPT_HTTP_TRANSFER_DECODING handling, shown in test 319 and curl's
--raw option.

This is a follow-up that restores the functionality.

Enable test 319 again.

Fixes #16974
Closes #16984
2025-04-06 11:31:22 +02:00
Daniel Stenberg
badfb951ec
test1658: add unit test for the HTTPS RR decoder
Made the HTTPS-RR parser a little stricter while at it.

Drop the ALPN escape handling, that was not needed.

Make the hode handle (and ignore) duplicate ALPN entries.

Closes #16972
2025-04-05 21:03:47 +02:00
Daniel Stenberg
b8bd019c6a
content_encoding: Transfer-Encoding parser improvements
- allow and ignore "identity" as an encoding

- fail if any other encoder than chunked follows after chunked

- fail on unsolicited encodings - when the server encodes but curl did
  not ask for it

Add test 1493 to 1496 to verify.

Disable test 319 as that is now broken: issue #16974

Reported-by: Jonathan Rosa
Fixes #16956
Closes #16959
2025-04-05 18:23:07 +02:00
Stefan Eissing
5fbd78eb2d
http2: fix stream window size after unpausing
When pausing a HTTP/2 transfer, the stream's local window size
is reduced to 0 to prevent the server from sending further data
which curl cannot write out to the application.

When unpausing again, the stream's window size was not correctly
increased again. The attempt to trigger a window update was
ignored by nghttp2, the server never received it and the transfer
stalled.

Add a debug feature to allow use of small window sizes which
reproduces this bug in test_02_21.

Fixes #16955
Closes #16960
2025-04-05 14:54:40 +02:00
Yedaya Katsman
80f9f6e59b
rand: update comment on Curl_rand_bytes weak random
From what I understand both rustls and mbedTLS expose a strong random
function, so as long as you have a TLS library random will be strong.

Followup 8972845123 "vtls/rustls: support strong CSRNG data"
Followup a90a5bccd4 "mbedtls: implement CTR-DRBG and HAVEGE random generators"

Closes #16965
2025-04-04 21:32:07 +02:00
Stefan Eissing
4f3c22d77d
https-connect, fix httpsrr target check
The HTTPSRR check on the record's target was not working as it used the
wrong index on the NUL byte if the target was not NULL.

Fixes #16966
Reported-by: Pavel Kropachev
Closes #16968
2025-04-04 21:31:02 +02:00
Daniel Stenberg
db3e7a24b5
hostip: show the correct name on proxy resolve error
Regression, probably from 8ded8e5f3f (#16451)

Fixes #16958
Reported-by: Jean-Christophe Amiel
Closes #16961
2025-04-04 14:23:01 +02:00
Nigel Brittain
c871dcb612
http_aws_sigv4: add additional verbose log statements
To use curl as a tool for troubleshooting SigV4 signing, it is useful to
have the 'Canonical Request', 'String To Sign' and 'Signature'
calculations output.

Closes #16952
2025-04-04 08:54:09 +02:00
Yedaya Katsman
fe1ba25c87
rustls: make max size of cert and key reasonable
SIZE_MAX is an very overkill size for certificates or keys, lower it to
100KiB for both certificate and keys. The default max size of openssl is
100KiB for the entire chain [1], and it seems firefox fails at ~60kb
[2].

Found by https://github.com/curl/curl/pull/16923

[0] https://docs.openssl.org/3.2/man3/SSL_CTX_set_max_cert_list/#notes
[2] https://0x00.cl/blog/2024/exploring-tls-certs/

Closes #16951
2025-04-03 23:30:36 +02:00
Dan Fandrich
9ba597bed7 lib: make Curl_easyopts const
Also, make the optiontable rule work in an out-of-tree build.

Closes #16950
2025-04-03 13:43:26 -07:00
Dan Fandrich
9f4f61ddcb lib: add const to clientwriter tables
Unlike the connection filter tables that hold a writable log level, the
client writer tables can be const.
2025-04-03 12:45:54 -07:00
Daniel Stenberg
8f65bd6977
asyn-thread: fix build without socketpair
Follow-up to 9b6148e9d9

Closes #16945
2025-04-03 17:19:59 +02:00
Stefan Eissing
9b6148e9d9
async-threaded resolver: use ref counter
Allocate the data shared between a transfer and an aync resolver thread
separately and use a reference counter to determine its release.

Change `Curl_thread_destroy()` to clear the thread handle, so that the
thread is considered "gone" and we do not try to join (and fail to)
afterwards.

Retake of the revert in fb15a986c0

Closes #16916
2025-04-03 16:43:37 +02:00
Stefan Eissing
01e76702ac
dnscache: slight refactoring
Slight refactoring around dnscache, e.g. hostcache

- eliminate `data->state.hostcache`. Always look up
  relevant dnscache at share/multi.
- unify naming to "dnscache", replacing "hostcache"
- use `struct Curl_dnscache`, even though it just
  contains a `Curl_hash` for now.
- add `Curl_dnscache_destroy()` for cleanup in
  share/multi.

Closes #16941
2025-04-03 16:40:56 +02:00
Daniel Stenberg
d6a626d5d8
parsedate: provide Curl_wkday also for GnuTLS builds
Otherwise --disable-dateparse + --with-gnutls builds might fail.

Found with randdisable

Closes #16943
2025-04-03 16:00:17 +02:00
Daniel Stenberg
78710ee955
conncache: make Curl_cpool_init return void
Since it cannot fail, removing the return code simplifies the code paths
calling this function.

Closes #16936
2025-04-03 13:37:17 +02:00
Daniel Stenberg
49701094fc
http: fix a build error when all auths are disabled
error: ‘result’ undeclared (first use in this function)

Found with randdisable

Closes #16939
2025-04-03 12:38:36 +02:00
Daniel Stenberg
8f496d05b6
hostip: fix build without threaded-resolver and without DoH
Closes #16938
2025-04-03 11:52:37 +02:00
Stefan Eissing
b56b0c078e
vtls: fix build with ssl but without http
Fixes #16935
Closes #16937
2025-04-03 11:37:45 +02:00
Daniel Stenberg
4cf9e87fca
if2ip: build the function also if FTP is present
Previously it was not compiled if CURL_DISABLE_BINDLOCAL is set, but the
FTP code is also using this function.

Easily found by using configure --disable-bindlocal without disabling
FTP.

Closes #16933
2025-04-03 11:25:25 +02:00
Daniel Stenberg
5caba3bd97
curl_krb5: only use functions if FTP is still enabled
Reported-by: x1sc0 on github
Fixes #16925
Closes #16931
2025-04-03 10:52:47 +02:00
Andrew
fe5f435b42
http_negotiate: fix non-SSL build with GSSAPI
Fixes #16919
Closes #16921
2025-04-03 08:25:09 +02:00
Viktor Szakats
87168807b2
eventfd: fix feature guards
Enable eventfd code consistently when both `HAVE_EVENTFD` and
`HAVE_SYS_EVENTFD_H` macros are defined.

Before this patch `HAVE_EVENTFD` guarded it alone, though the code
also required the header, which was guarded by `HAVE_SYS_EVENTFD_H`.

These should normally be detected in pairs. When they aren't, omit using
`eventfd()` to avoid calling it without a known matching header.

If this disables valid cases (e.g. some system declares this function
via a different header), feature detection and the code may be extended
for those cases. If these are known to come in pairs, always, another
option is detect them both at build stage, and forward a single macro
to C.

Reported-by: Abhinav Singhal
Bug: https://curl.se/mail/lib-2025-04/0000.html
Closes #16909
2025-04-03 01:12:19 +02:00
Daniel Stenberg
0c6e63a1be
lib: unify conversions to/from hex
Curl_hexbyte - output a byte as a two-digit ASCII hex number

Curl_hexval - convert an ASCII hex digit to its binary value

... instead of duplicating similar code and hexdigit strings in numerous
places.

Closes #16888
2025-04-02 14:17:56 +02:00
Daniel Stenberg
63c1e6482a
vtls_scache: remove "Unreachable Call"
The condition required to reach this call could not happen, because
cf_ssl_scache_get() already checks the same condition and returns NULL
for 'scache' prior to this.

Found by CodeSonar

Closes #16896
2025-04-01 15:27:56 +02:00
Daniel Stenberg
50c1e62fa4
multi_ev: remove redundant check from mev_get_last_pollset
Pointed out by CodeSonar

Closes #16894
2025-04-01 14:28:18 +02:00
Stefan Eissing
1f844dd3f0
http2: fix stream assignemnt for pushes
When a PUSH_PROMISE was received, the h2_stream object was assigned
to the wrong `newhandle->mid` and was thereafter not found. This led
to internal confusion, because the nghttp2 stream user_data was not
cleared and an invalid easy handle was use for trace messages,
resulting in a crash.

Reported-by: Viktor Szakats
Fixes #16881
Closes #16905
2025-04-01 14:19:27 +02:00