Commit graph

16589 commits

Author SHA1 Message Date
Stefan Eissing
4ae1d7cc26
netrc: scanner refactor
Refactor the netrc scanner. Add test case for checking that the last
matched machine with unmatched login does not return the password as
success (unit1304).

Closes #21624
2026-05-18 15:18:09 +02:00
Mark Esler
8a86fa13f3
vtls_scache: include signature_algorithms in the SSL peer cache key
Curl_ssl_peer_key_make() omitted ssl->signature_algorithms, although
match_ssl_primary_config() compares the field. Two handles differing
only in CURLOPT_SSL_SIGNATURE_ALGORITHMS therefore shared a peer key and
could resume each other's sessions across a shared CURLSH SSL session
cache.

Add :SIGALGS-%s next to the other ssl_primary_config fields.

Closes #21651
2026-05-18 13:59:11 +02:00
Daniel Stenberg
e8c1023b00
connect: remove deref of freed pointer in trace call
Spotted by CodeSonar

Closes #21649
2026-05-17 14:20:19 +02:00
Daniel Stenberg
d74c0ada4e
urlapi: prevent a terminal .0x component to normalize IPv4
Extend test 1560 to verify

Follow-up to 831a151484

Spotted by Codex Security
Closes #21652
2026-05-17 14:19:26 +02:00
Daniel Stenberg
44ede0cc5a
url: remove superfluous check
This pointer is already verified to be non-NULL some 15 lines above.

Pointed out by CodeSonar
Closes #21650
2026-05-17 00:35:25 +02:00
Stefan Eissing
a0f08d6975
cf-h2-prox: fix peer leak
The unlinking of the new Curl_peer was happening too later after
the struct had been set to zero. Move the unlink to happen before
that.

Fixes #21602
Reported-by: Joshua Rogers
Closes #21627
2026-05-17 00:14:36 +02:00
Stefan Eissing
ad549c4641
unix-sockets: ignore proxy settings
Fix a recent regression: when a unix-socket is configured, all proxy
settings must be ignored. The `via_peer` had been checked correctly,
but the connections proxy bits were not cleared.

Add test_11_04 to verify.

Reported-by: Fabian Keil (libcurl mailing list)
Closes #21630
2026-05-16 18:49:46 +02:00
Viktor Szakats
c46a7913e5
setopt: fix to honor CURLOPT_PROXY_CAINFO_BLOB over Native CA
In AppleSecTrust or NativeCA-enabled builds, make sure override it when
setting a custom `CURLOPT_PROXY_CAINFO_BLOB`.

Reported-by: Joshua Rogers (Aisle Research)

Follow-up to 1730407b74 #18279
Follow-up to eefd03c572 #18703

Closes #21631
2026-05-16 11:55:59 +02:00
Viktor Szakats
3f8f725d97
schannel: enforce Extended Key Usage for custom CA roots
Reported-by: Joshua Rogers (Aisle Research)

Closes #21629
2026-05-16 11:55:59 +02:00
Daniel Stenberg
f9b9d3b141
urlapi: handle redirect without set scheme with default-scheme
Verify in test 1921

Reported-by: mulan_dh on hackerone

Closes #21632
2026-05-16 11:46:16 +02:00
Daniel Stenberg
51beed175d
cookie: trim trailing dots when checking PSL
Verified with test 1629

Closes #21636
2026-05-16 11:24:28 +02:00
Viktor Szakats
614b94eecc
tidy-up: miscellaneous
- avoid "will" in builds scripts, scripts folder, curl_easy_ssls_export.md,
  and few other files.
- badwords: add "initialise", "nul terminated", "thread safety" and
  variations.
- prefer "null-terminat", where missing (two places).
- fix "null-terminat*" missing dash.
- hostip: merge two `#if` blocks.
- tool_doswin: fix comment
  Spotted by GitHub Code Quality
  Follow-up to 9a2663322c #17572
- fix stray spaces and newlines.

Closes #21638
2026-05-16 01:56:17 +02:00
Viktor Szakats
47f411c6d8
GHA: enable -Wunused-macros in clang-tidy jobs
Also fix fallouts found.

Windows clang-tidy CI job is a little pickier than I'd prefer due to the
`_CURL_TESTS_CONCAT=ON` option used there, and all macros considered
local, thus checked by the compiler. Upside: it revealed macro usage
dynamics in tests. If too annoying, `first.h` may be opted-out from the
concat logic. Some macros may also be deleted instead of `#if 0`-ing.

Follow-up to e0e56e9ae4 #21550
Follow-up to 5fa5cb3825 #20593

Closes #21554
2026-05-16 01:17:41 +02:00
jeffhuang
a15483c4ca
url: compare full origin when setting credentials
Closes #21575
2026-05-16 01:14:29 +02:00
Stefan Eissing
91dcf4e610
url: url_match_destination fix
Match origin/via_peer also for non-SSL schemes.

Closes #21573
2026-05-16 01:11:06 +02:00
Sergio Correia
61d59c9e39
x509asn1: fix DH public key parameter extraction
The dh(g) parameter was read from param->beg instead of from the
cursor p returned by parsing dh(p). This caused dh(g) to always
report the same value as dh(p) when inspecting DH certificates
via CURLOPT_CERTINFO on non-OpenSSL backends.

The DSA branch correctly advances the cursor; the DH branch lost
this during what appears to be a copy-paste.

Add unit1676 to verify that dh(p) and dh(g) report distinct values
using a hand-crafted minimal DER certificate.

Assisted by: Claude Opus 4.6
Signed-off-by: Sergio Correia <scorreia@redhat.com>
Closes #21595
2026-05-16 01:06:56 +02:00
Daniel Stenberg
d6571f7a70
setopt: more careful cleanup of the HSTS cache
Reported-by: Joshua Rogers
Closes #21615
2026-05-16 01:04:54 +02:00
Stefan Eissing
12d6d8e26f
cf-h2-proxy: drop interim responses
Any 1xx response before the CONNECT final one can be dropped as no one
uses those in the HTTP/2 proxy filter. This eliminates a potential
memory exhaustion by the famous malicious server on the internet.

Closes #21626
2026-05-16 01:01:18 +02:00
Viktor Szakats
066478f634
src: add curlx_memzero() to clear buffers securely
To safely zero memory, introduce `curlx_memzero()`, and map it to
`memset_s()` (C11) or `memset_explicit()` (C23) if auto-detected, or
`explicit_bzero()` or `explicit_memset()` for platforms opted-in, or
fall back to a local workaround if all unavailable. On Windows, always
use `SecureZeroMemory()`, or `SecureZeroMemory2()` with Visual Studio
and Windows SDK 10.0.26100.0+.

Details above are experimental and may change if they cause issues.

Also add macros/functions that zero memory before freeing a buffer:
- `curlx_safefreezero()`: for buffers with size.
- `curlx_safefreezeroz()`: for null-terminated buffers.
- `curlx_freezero()`: for buffers with size.
- `curlx_freezeroz()`: for null-terminated buffers.

`curlx_memzero()` must not be passed a NULL pointer because in some
implementations it is undefined behavior.

Also:
- curl_sha512_256: Replace hard-wired `explicit_memset()` call with new
  `curlx_memzero()`.

Refs:
https://en.cppreference.com/c/string/byte/memset
https://man7.org/linux/man-pages/man3/explicit_bzero.3.html
https://man.freebsd.org/cgi/man.cgi?query=explicit_bzero
https://man.netbsd.org/NetBSD-7.2/explicit_memset.3
https://learn.microsoft.com/previous-versions/windows/desktop/legacy/aa366877(v=vs.85)
https://learn.microsoft.com/windows/win32/memory/winbase-securezeromemory2
https://learn.microsoft.com/cpp/overview/compiler-versions
https://learn.microsoft.com/windows/apps/windows-sdk/downloads
https://jtsoya539.github.io/windows-sdk-versions/

Credits-to: Daniel Gustafsson
Credits-to: Will Cosgrove and co-authors in libssh2
Ref: #13589 (original attempt)
Ref: #21588

Closes #21598
2026-05-16 00:26:46 +02:00
Daniel Stenberg
831a151484
urlapi: consume trailing dots after IPv4 numerical addresses
If the hostname is specified as an IPv4 numerical address and it is
followed by a single dot, acccept that as a valid IPv4 and remove the
dot when normalizing.

This prevents otherwise legitimate IPv4 hostnames to have trailing dots.
Seems to match what browsers do.

Extended test 1560 to verify.

Closes #21635
2026-05-15 23:38:50 +02:00
Daniel Stenberg
a15cfeb100
cookie: compare path case sensitively
Verify with test 1645

Reported-by: Joshua Rogers
Closes #21616
2026-05-15 13:37:52 +02:00
Daniel Stenberg
71430e87fd
strparse: make curlx_str_until() accept zero for 'max'
When asked to parse for a string with max zero bytes, it will always
return error and no longer trigger an assert. This saves the caller from
having to check for this condition.

Closes #21600
2026-05-15 13:28:03 +02:00
Viktor Szakats
de28c9cfad
rustls: drop two wrong leftover casts to ssize_t
While both source and target types are already `size_t`.

Spotted by GitHub Code Quality

Follow-up to b7c676d13f #17593

Closes #21625
2026-05-15 12:16:02 +02:00
Viktor Szakats
4780e509aa
tidy-up: prefer "initialize" with a 'z'
To match the majority of usage in source.

Closes #21618
2026-05-15 11:49:06 +02:00
Viktor Szakats
3da249e1f0
gsasl: fix potential double free
Also:
- require libgsasl 1.6.0+ (2010-12-14) for a `gsasl_finish()` that
  handles a NULL argument.
  Ref: b550032df8

Reported-by: Joshua Rogers (Aisle Research)

Closes #21609
2026-05-15 11:49:06 +02:00
Viktor Szakats
eb9b253d66
libssh: add support for SHA256 host public keys
Reported-by: Joshua Rogers
Fixes #21605

Closes #21607
2026-05-15 11:49:06 +02:00
Daniel Stenberg
9135294115
urlapi: deny hostnames with more than one trailing dot
Or consisting of just a single dot.

Such names cannot be resolved with DNS.

While they *can* still be resolved with /etc/hosts or --resolve tricks,
they easily cause internal problems because their trailing dots.

Let's not allow them anymore.

Closes #21622
2026-05-15 11:44:20 +02:00
Joshua Rogers
88bb7f885f
rustls: error on CURLOPT_CRLFILE with native CA store
Closes #21614
2026-05-15 10:25:55 +02:00
Viktor Szakats
976eb1d50d
windows: update MS SDK versions in comments
To make them more accurate.

Also:
- show Visual Studio version, where missing.
- ease the formatting.
- schannel_int.h: clang-tidy fallback code.

Used: `rg -l --sort=path CERT_FIND_HAS_PRIVATE_KEY`

Closes #21621
2026-05-15 03:41:33 +02:00
Viktor Szakats
cc5eb4aba9
docs: fix a couple of typos
Spotted by GitHub Code Quality

Closes #21617
2026-05-15 01:37:38 +02:00
Viktor Szakats
5a869edb0f
creds: drop redundant CURL_UNCONST()s
Follow-up to 8f71d0fde5 #21548

Closes #21612
2026-05-15 01:37:38 +02:00
Viktor Szakats
27936d411a
lib: make __STDC_VERSION__ literals L (where missing) 2026-05-14 18:35:49 +02:00
Viktor Szakats
1a69c3a9c0
cmake: unfold a line 2026-05-14 16:33:23 +02:00
Daniel Stenberg
81f950dd90
strparse: split a multi-line assert into many separate ones
This way we can better tell exactly which condition that triggers. Like
in fuzzer logs.

Closes #21599
2026-05-13 23:47:39 +02:00
Viktor Szakats
616e8ea6d8
cookie: constify struct pointers
Closes #21589
2026-05-13 17:52:49 +02:00
Viktor Szakats
96dbcf6921
llist: constify struct pointers
Closes #21590
2026-05-13 17:40:42 +02:00
Daniel Stenberg
675a9b0189
urlapi: change more lowercase percent-encoded to uppercase
For consistency with other code, prefer uppercase.

Verified by test 1628
Reported-by: Fabian Keil
URL: https://curl.se/mail/lib-2026-05/0006.html
Closes #21592
2026-05-13 16:47:05 +02:00
Stefan Eissing
7f7e4e3e68
creds: create on service name only
Fix creation of creds object for transfer when only a sasl service
name is configured by the application.

Follow-up to 5e99b73cf4

Closes #21591
2026-05-13 16:37:15 +02:00
Daniel Stenberg
b079595f2e
url: keep the question mark for empty queries
Reported-by: Bill Mill
Fixes #21544

Verified by test 1721

Closes #21584
2026-05-13 14:34:54 +02:00
Daniel Stenberg
11df1251e5
snpego_sspi: preserve distinction btw policy-only and uncond delegation
CURLOPT_GSSAPI_DELEGATION exposes distinct modes:
CURLGSSAPI_DELEGATION_POLICY_FLAG is documented as delegating only when
OK-AS-DELEGATE policy permits it, while CURLGSSAPI_DELEGATION_FLAG is
unconditional. The new SSPI implementation checks for either bit and
sets ISC_REQ_DELEGATE, so a caller requesting policy-limited delegation
is put on the same SSPI path as unconditional delegation.

In addition, curl's existing protection that avoids reusing a connection
when the GSS delegation setting differs was guarded only by HAVE_GSSAPI;
SSPI-only builds now have an effective delegation option, but the
connection's delegation setting was neither copied nor compared. This
would cause Windows SSPI Negotiate/Kerberos authentication to delegate
credentials contrary to the caller's selected policy or reuse an
already-delegated authenticated connection for a transfer that requested
no delegation.

Follow-up to cc6777d939

Reported by Codex Security
Closes #21583
2026-05-13 14:34:08 +02:00
Stefan Eissing
5e99b73cf4
creds: add sasl service name
The SASL service name, used in authentication, is part of curl's credentials
when authenticating to a server/proxy. Make it part of `struct Curl_creds`.

Change code to use `creds` to obtain a service name. By tying creds used
to the connection, connection reuse is also only allowed when the service
name matches.

Closes #21585
2026-05-13 14:04:17 +02:00
Viktor Szakats
eca309c2a1
ldap: fix to not leak attribute on OOM (WinLDAP)
Reported-by: Andrew Nesbitt

Closes #21576
2026-05-13 00:43:27 +02:00
Viktor Szakats
02dca1eb86
src: fix comment typos
Found by GitHub Code Quality

Closes #21570
2026-05-12 17:14:38 +02:00
Viktor Szakats
2538dc04e3
curl_ntlm_core: propagate DES CryptEncrypt() error
Spotted by GitHub Code Quality

Closes #21569
2026-05-12 17:14:38 +02:00
Stefan Eissing
8f71d0fde5
creds: hold credentials
Authorizdation credentials are kept in `struct Curl_creds`. This contains:

* `user`: the username, maybe the empty string
* `passwd`: the password, maybe the empty string
* `sasl_authzid`: the SASL authz value, maybe the empty string
* `oauth_bearer`: the OAUTH bearer token, maybe the empty string
* `source`: where the credentials from from
* `refcount`: a reference counter to link/unkink creds

A `creds` with all values empty is equivalent to NULL, e.g. no `creds`
instance. With reference counting, `creds` can be linked/unlinked
in several places.

See docs/internals/CREDENTIALS.md for use.

Closes #21548
2026-05-12 16:05:15 +02:00
Viktor Szakats
82216163b1
curl_ntlm_core: fix nettle 4+ builds in certain MultiSSL combos
Also rename macro to resemble other backends.

Reported by Codex Security

Fixes #21562
Follow-up to 01f08dc4eb #21557

Closes #21566
2026-05-12 14:21:25 +02:00
Daniel Stenberg
cb4395b403
rtsp: bump buf after rtsp_filter_rtp()
Reported-by: Andrew Nesbit
Closes #21563
2026-05-12 12:39:06 +02:00
Song X. Gao
cc6777d939
spnego_sspi: honor CURLOPT_GSSAPI_DELEGATION for Windows SSPI
Make CURLOPT_GSSAPI_DELEGATION effective on Windows builds that use SSPI
(instead of a native GSS-API implementation), so Kerberos delegation can
be requested during SPNEGO/Negotiate authentication.

Closes #21528
2026-05-12 10:27:29 +02:00
Daniel Stenberg
2256162fa7
tftp: stricter option name checks
Previously, the use of checkprefix() alone allowed the code to match not
only on "blksize" but also (mistakenly) on "blksizeFOO" etc.

Reported-by: Andrew Nesbit
Closes #21560
2026-05-12 10:26:20 +02:00
Stefan Eissing
2a2104f3cf
event: fix wakeup consumption
The events on a multi wakeup socketpair were only consumed via
curl_multi_poll()/curl_multi_wait() but not in event based processing on
a curl_multi_socket() call. That led to busy loops as reported in

Fixes #21547
Reported-by: Earnestly on github
Closes #21549
2026-05-12 08:11:31 +02:00