Commit graph

14886 commits

Author SHA1 Message Date
Corinna Brandt
ea897fddfc
openssl: set the cipher string before doing private cert
... as this allows a set string to affect how OpenSSL deals with the
private keys/certs.

Closes #17227
2025-04-29 16:17:48 +02:00
Stefan Eissing
47b2300192
mqtt: use conn/easy meta hash
Remove mqtt structs from the unions at connectdata and
easy handle requests. Use meta hash at easy/connnection.

Make mqtt structs private to mqtt.c

Closes #17221
2025-04-29 14:25:25 +02:00
Daniel Stenberg
e383ba53eb
multi_ev: remove redundant check for data
Pointed out by CodeSonar

Closes #17226
2025-04-29 14:22:31 +02:00
Stefan Eissing
f0824d1ed7
meta data handling for easy/conn fixes
- return error when adding to hash fails
- do not free passed in data, as ownership is taken by call

Closes #17219
2025-04-29 13:57:16 +02:00
Daniel Stenberg
2fa3d528ae
openssl: first unload the provider, then free the context
Doing it in the reversed order causes bad problems inside OpenSSL.

Closes #17223
2025-04-29 12:45:23 +02:00
Daniel Stenberg
f2ce6c46b9
openssl: enable builds for *both* engines and providers
OpenSSL3 can in fact have both enabled at once. Load the provider and
key/cert appropriately. When loading a provider, the user can now also
set an associated "property string".

Work on this was sponsored by Valantic.

Closes #17165
2025-04-29 10:44:21 +02:00
Daniel Stenberg
e0ebc3ff13
lib: provide a getaddrinfo wrapper
This uses c-ares under the hood and supports the CURL_DNS_SERVER
environment variable - for debug builds only. The getaddrinfo()
replacement function is only used if CURL_DNS_SERVER is set to make a
debug build work more like a release version without the variable set.

'override-dns' is a new feature for the test suite when curl can be told
to use a dedicated DNS server, and test 2102 is the first to require
this.

Requires c-ares 1.26.0 or later.

Closes #17134
2025-04-28 23:48:02 +02:00
Daniel Stenberg
da33c1e349
cfilters: remove assert
The OSS-fuzz probe reaches this, so it can apparently in run-time. There
is already a run-time handling of the situation.

Closes #17211
2025-04-28 22:45:41 +02:00
Jay Satiro
4a70b9823b progress: fix integer overflow check
- Fix logic typo.

Prior to this change the overflow check was reversed, meaning it did
not stop an overflow condition and also if there wasn't an overflow it
erroneously set the total expected transfer size to the maximum value.

Follow-up to 69ce9a7f from earlier today.

Closes https://github.com/curl/curl/pull/17213
2025-04-28 14:07:32 -04:00
Daniel Stenberg
69ce9a7feb
progress: avoid integer overflow when gathering total transfer size
Reported by OSS-fuzz

Closes #17207
2025-04-28 15:31:30 +02:00
Daniel Stenberg
771c15b603
smb: avoid integer overflow on weird input date
Found by OSS-fuzz

Closes #17206
2025-04-28 15:29:59 +02:00
Stefan Eissing
daa0601614
ws: store protocol context as connection meta data
Eliminates union member on struct connectdata. Sample of how
other procotols can handle their connection related data.

This avoids potention mix-ups of the `proto` union of a
connection with other protocol instances.

Removed ws "disconnect" callback as meta data is automatically
destroyed when a connection is destroyed.

Closes #17146
2025-04-28 09:15:05 +02:00
sftcd
460ead61b6
tests: add basic ECH tests
Test 4000 and 4001

Closes #17192
2025-04-27 17:38:27 +02:00
Daniel Stenberg
e9a35ded8a
curl_osslq: remove a leftover debug fprintf() call
Reported-by: xiadnoring on github
Fixes #17198
Closes #17202
2025-04-26 23:43:07 +02:00
Daniel Stenberg
991c30d0d6
ws: fix the header replace check
It passed in the wrong header length to the check function, which made
it do duplicated headers in cases where the user provides its own set.

Reported-by: sbernatsky on github
Fixes #17170
Closes #17194
Closes #16178
2025-04-26 23:21:04 +02:00
Viktor Szakats
f9eb9e5e23
cmake: use LIB_NAME in curl-config.cmake.in
Cherry-picked from #16973
Closes #17195
2025-04-26 12:59:53 +02:00
Daniel Stenberg
15839450be
urlapi: redirecting to "" is considered fine
If the CURLU handle already holds a proper URL, otherwise it is an
error.

Verified by test 1560

Fixes #17188
Reported-by: zopsicle on github
Closes #17189
2025-04-25 22:38:04 +02:00
Viktor Szakats
d7914f75aa
sectransp: fix building for macOS Sierra and older
Reported-by: Eric Knibbe
Bug: https://github.com/curl/curl/pull/16581#issuecomment-2830837500
Regression from 2d94439eaa #16581

Closes #17193
2025-04-25 21:06:22 +02:00
Andreas Westin
cc884c08a8
cf-socket: fix FTP accept connect
When cf_tcp_accept_connect() is called and it sets up a connection it
never indicates to the caller that the it's done.

Closes #17186
2025-04-25 17:39:27 +02:00
Daniel Stenberg
2ab6b9d405
aws-sigv4: allow a blank string
make sure a zero length sigv4 gets the default value

Reported-by: Arian van Putten
Fixes #17176
Closes #17178
2025-04-25 09:32:57 +02:00
Viktor Szakats
ae0ff69f7a
build: tidy up internal feature detection variables for wolfSSL
Sync them with the function name they detect, and sync them between
cmake and autotools.

- rename `HAVE_WOLFSSL_BIO` to `HAVE_WOLFSSL_BIO_NEW`.
- rename `HAVE_WOLFSSL_FULL_BIO` to `HAVE_WOLFSSL_BIO_SET_SHUTDOWN`.
- autotools: rename `WOLFSSL_NTLM` to `HAVE_WOLFSSL_DES_ECB_ENCRYPT`
  (to sync with cmake).
- autotools: rename `WOLFSSL_BIO` to `HAVE_WOLFSSL_BIO_NEW`
  (to sync with cmake).
- autotools: simplify `HAVE_WOLFSSL_DES_ECB_ENCRYPT` detection.

Cherry-picked from #17082

Closes #17175
2025-04-24 23:44:33 +02:00
Viktor Szakats
4bfc379b90
cmake: tidy up and document feature detections in dependencies
- update text on dependency feature detection variables, and move it
  to its own section in `docs/INSTALL-CMAKE.md`.
  Ref: #17032 (Discussion)

- tidy up descriptions/comments, alpha-sort.

- move comment to its own section in `docs/INSTALL-CMAKE.md`.

- split `HAVE_SSL_SET_QUIC_USE_LEGACY_CODEPOINT` to distinct names for
  each TLS backend API. To make the names more stable and to sync them
  with autotools.
  Follow-up to 07cc50f8eb #17018
  Follow-up to 342a654ef3 #15873

- drop redundant condition while detecting QUICTLS API.
  Follow-up to 07cc50f8eb #17018

- add config-comparison exception for `HAVE_SSL_SET_QUIC_TLS_CBS`.
  Follow-up to 5eefdd71a3 #17027

- detect `wolfSSL_get_peer_certificate` like autotools does.

- detect `wolfSSL_UseALPN` like autotools does.

Closes #17082
2025-04-24 19:46:27 +02:00
Stefan Eissing
7bf576064c
c-ares: really lazy init channel
Only initialize the c-ares channel when we start resolving and not
alreads when the application sets `CURLOPT_DNS_SERVERS` and friends.

Creating an ares channel takes considerable time and when we have the
DNS information for a transfer already cached, we do not need it.

Closes #17167
2025-04-24 14:07:01 +02:00
Daniel Stenberg
437c72fbba
mbedtls: TLS 1.3 is max when mbedtls has 1.3 support
Co-authored-by: Viktor Szakats
Reported-by: kkalganov on github
Fixes #17048
Closes #17137
2025-04-24 14:02:56 +02:00
Jochen Sprickerhof
82606325e3
openssl-quic: Add missing include
uint_hash, Curl_uint_hash_init and others are used in the file.

Regression from 657aae79c0

Closes #17156
2025-04-24 08:45:35 +02:00
Stefan Eissing
5e95556fc2
multi: init_do(): check result
Calls to `Curl_init_do()` did not check on result and missed failures to
properly and completely initialize a transfer request.

The main cause of such an init failure is the need to rewind the
READFUNCTION without a SEEKFUNCTION registered. Check the failure to
"rewind" the upload data immediately make test cases 1576 and friends
fail.

Reported-by: Travis Lane
Fixes #17139
Closes #17150
2025-04-24 08:43:03 +02:00
Daniel Stenberg
39f5e7cb69
asyn-base: remove the HTTPSRR_WORKS define
It is done in asyn-ares.c since 179aeeaf22

Closes #17161
2025-04-24 08:40:52 +02:00
Niall
179aeeaf22
ares: add definition for HTTPSRR_WORKS
Closes #17157
2025-04-23 23:39:41 +02:00
Daniel Stenberg
b993f2871b
doh: make sure CURLOPT_PROTOCOLS is set a with a "long" arg
Closes #17142
2025-04-23 08:52:49 +02:00
Viktor Szakats
d60c9aec42
openssl-quic: avoid potential -Wnull-dereference, add assert
Seen with curl-for-win, OpenSSL QUIC, gcc 14.2.0, cmake unity mode.

Silences:
```
In file included from _x86-win-ucrt-bld/lib/CMakeFiles/libcurl_object.dir/Unity/unity_5_c.c:55:
In function 'cf_osslq_check_and_unblock',
    inlined from 'cf_progress_egress' at lib/vquic/curl_osslq.c:1730:12:
lib/vquic/curl_osslq.c:1581:11: error: potential null pointer dereference [-Werror=null-dereference]
 1581 |           nghttp3_conn_unblock_stream(ctx->h3.conn, stream->s.id);
      |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/vquic/curl_osslq.c:1582:34: error: potential null pointer dereference [-Werror=null-dereference]
 1582 |           stream->s.send_blocked = FALSE;
      |                                  ^
```

Co-authored-by: Daniel Stenberg
Co-authored-by: Stefan Eissing

Closes #17107
2025-04-22 16:50:12 +02:00
Stefan Eissing
657aae79c0
lib: add meta_hash to connection, eliminate hash_offt
With a meta_hash at each connection (similar to easy handle, let
multi_ev.c store its pollsets as meta data, no longer needing its own
hashes.

This eliminates the last use of Curl_hash_offt. Remove it.

Closes #17095
2025-04-22 15:57:18 +02:00
Stefan Eissing
1d66a769d7
http: fix HTTP/2 handling of TE request header using "trailers"
A "TE" request header is allowed in HTTP/2 when it only carries the
"trailers" value. RFC 9113 ch. 8.2.2. Check client supplied TE values
for the "trailers" token and only pass that one in a HTTP/2 request.

Add test_01_17 to verify.

Fixes #17122
Reported-by: epicmkirzinger on github
Closes #17128
2025-04-22 15:55:36 +02:00
Stefan Eissing
ebe6612505
vquic: unblame netbsd
it was innocent.

Follow-up to 4872dafd80

Closes #17133
2025-04-22 15:54:07 +02:00
Stefan Eissing
2a25abeaf1
connect: shutdown timer fix
Fix a bug in timeout handling for connection shutdowns that led to
default timeout of 2 seconds not being in effect.

Only set the shutdown timeout expiry when operating on a non-admin
transfers. Admin handles are only temproarily tied to a connection.

Fixes #17130
Reported-by: Rasmus Melchior Jacobsen
Closes #17135
2025-04-22 15:52:17 +02:00
Stefan Eissing
24dd825ed5
cares: fix missing lazy init for CURLOPT_DNS_SERVERS
When setting option CURLOPT_DNS_SERVERS, the ares channel was not
properly initialized and the setting failed.

Fixes #17119
Reported-by: calvin2021y on github
Closes #17127
2025-04-22 14:33:41 +02:00
Stefan Eissing
4872dafd80
vquic: init for every call to recvmsg
When calling recvmsg(), always set up the msg structures for
each call as there are OS implemenations that change members
of msg.

Fixes #17120
Reported-by: Harry Sintonen
Closes #17131
2025-04-22 13:46:36 +02:00
Daniel Stenberg
2de9a97141
vquic: consistent name for the stream struct across backends
Now known as "struct h3_stream_ctx" in all four backends.

Also as a bonus: a single definition of the H3_STREAM_CTX macro

Closes #17113
2025-04-22 10:26:04 +02:00
Daniel Stenberg
f142056e01
hostip: fix build when no async resolvers are present
Fixes #17124
Closes #17125
2025-04-22 09:18:40 +02:00
Daniel Stenberg
1db267eada
asyn-base: fix build with disabled threaded resolver
... but *with* DoH.

Fixes #17121
Closes #17123
2025-04-22 08:42:56 +02:00
Daniel Stenberg
ba07dcd27b
lib: use BIT() instead of bool in structs more
Since it makes use of bitfields on supported platforms, it saves a few
bytes memory. Might as well use it consistently.

Closes #17114
2025-04-22 08:01:08 +02:00
Viktor Szakats
929c9a7ef7
openssl-quic: fix printf mask
Fixes:
```
lib/vquic/curl_osslq.c:835:25: error: format '%zd' expects argument of type 'signed size_t', but argument 6 has type 'curl_off_t' {aka 'long long int'} [-Werror=format=]
  835 |   CURL_TRC_CF(data, cf, "[%" FMT_PRId64 "] DATA len=%zu, total=%zd",
      |                         ^~~~
  836 |               stream->s.id, buflen, stream->download_recvd);
      |                                     ~~~~~~~~~~~~~~~~~~~~~~
      |                                           |
      |                                           curl_off_t {aka long long int}
```

Closes #17106
2025-04-20 13:50:57 +02:00
Brian Chrzanowski
c0df01fd94
websocket: add option to disable auto-pong reply
This adds another bitflag on CURLOPT_WS_OPTIONS (CURLWS_NOAUTOPONG) that
disables the default and automatic PONG reply in the WebSocket layer.

Assisted-by: Calvin Ruocco

Closes #16744
2025-04-19 00:01:28 +02:00
Stefan Eissing
21fd64645b
quic: no local idle connection timeout, ngtcp2 keep-alive
Do not set a transport parameter idle timeout, meaning we have no such
thing from our side. The remote setting then applies.

In ngtcp2, set its "keep-alive" timer to prevent a possible remote idle
timeout to tear down the connection while we have active transfers on
that connection.

Closes #17057
2025-04-18 23:52:51 +02:00
Daniel Stenberg
1102ea9f4b
cf-https-connect: use the passed in dns struct pointer
... instead of digging it out from the connection struct.

Plus: simplify struct referencing in the condition.

Closes #17092
2025-04-18 23:24:18 +02:00
Daniel Stenberg
834836dc14
doh: reduce the DNS request buffer size
No point in having it larger than the largest allowed request size.

Also removed a no longer used struct.

Closes #17087
2025-04-18 23:10:29 +02:00
sftcd
d6c8907864
doh: httpsrr fix
Closes #17099
2025-04-18 23:03:31 +02:00
Stefan Eissing
909af1a43b
multi: do transfer book keeping using mid
Change multi's book keeping of transfers to no longer use lists, but a
special table and bitsets for unsigned int values.

`multi-xfers` is the `uint_tbl` where `multi_add_handle()` inserts a new
transfer which assigns it a unique identifier `mid`. Use bitsets to keep
track of transfers that are in state "process" or "pending" or
"msgsent".

Use sparse bitsets to replace `conn->easyq` and event handlings tracking
of transfers per socket. Instead of pointers, keep the mids involved.

Provide base data structures and document them in docs/internal:
* `uint_tbl`: a table of transfers with `mid` as lookup key,
   handing out a mid for adds between 0 - capacity.
* `uint_bset`: a bitset keeping unsigned ints from 0 - capacity.
* `uint_spbset`: a sparse bitset for keeping a small number of
  unsigned int values
* `uint_hash`: for associating `mid`s with a pointer.

This makes the `mid` the recommended way to refer to transfers inside
the same multi without risk of running into a UAF.

Modifying table and bitsets is safe while iterating over them. Overall
memory requirements are lower as with the double linked list apprach.

Closes #16761
2025-04-17 17:28:38 +02:00
Daniel Stenberg
02e9690c3e
tests/server/dnsd: basic DNS server for test suite
Currently the DNS server only responds to A and AAAA queries. It always
responds with a fixed response: the localhost address. Three times.

It should work fine over either IPv4 or IPv6, but I don't think it
matters much for curl testing.

The idea is to allow curl tests to use "normal" DNS hostnames (using the
normal name resolving code paths) and still use the local test servers.

This setup currently only works if curl is built with c-ares because
redirecting DNS requests to our test server when using getaddrinfo() is
not easy.

This should be extended to respond to HTTPS queries as well to allow
more testing there, as c-ares is always used for that.

Test 2102 is the first test using this.

Closes #17015
2025-04-17 09:13:24 +02:00
Daniel Stenberg
1609570c68
hostip: remove duplicate assignment
Follow-up from 56e40ae6a5

Pointed out by CodeSonar

Closes #17080
2025-04-17 09:12:29 +02:00
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