Commit graph

39499 commits

Author SHA1 Message Date
Viktor Szakats
ca96fd5190
scorecard: fix max_upload init value in ul_parallel()
"In `ul_parallel`, `max_parallel` is computed using
`self._download_parallel` instead of `self._upload_parallel`. This
causes the upload parallelism to incorrectly follow the download
parallel setting. It should use `self._upload_parallel` to be consistent
with how `uploads()` computes `max_parallel`."

Reported by GitHub Code Quality

Follow-up to 30ef79ed93 #17295

Closes #22421
2026-07-28 22:22:50 +02:00
Viktor Szakats
387b4c5e4c
dnsd: fix bounds check in read_https_alpn_part()
"The check `i > 256` permits `i == 256` to pass through. When `i` is
then cast to `uint8_t` in `blob_add(b, (uint8_t)i)`, the value wraps to
0, silently encoding a zero-length ALPN entry instead of rejecting it.
The condition should be `i > 255` (or equivalently `i >= 256`) to
correctly reject any length that does not fit in a single byte."

Reported by GitHub Code Quality

Follow-up to 86f1e5b3f6 #21299

Closes #22420
2026-07-28 22:22:50 +02:00
Dan Fandrich
e2fa29c402 CI: improve labeler matches 2026-07-28 13:20:04 -07:00
Viktor Szakats
1386135d1c
schannel: fix error check logic in get_client_cert() file reader
Reported by GitHub Code Quality
Follow-up to 0fdf965126 #5193

Closes #22415
2026-07-28 19:29:34 +02:00
Viktor Szakats
75404bda1a
curl_gssapi: document/update feature availability
- update `GSS_C_DELEG_POLICY_FLAG` comment to include Apple GSS, add
  date, and amend MIT Kerberos version to 1.7+ (was: 1.8+)
  Ref: 45875a4d7b
  Ref: 1635de38a8

- document `HAVE_GSS_SET_NEG_MECHS`/`gss_set_neg_mechs()`.
  Ref: 079eed2cf7
  It's also committed to Heimdal, but not present in a release
  as of 7.8.0 (current latest).
  Ref: 735039dbdc

Follow-up to a8881e5e1d #21315 #22410
Follow-up to d169ad68fa #22052

Closes #22419
2026-07-28 19:20:41 +02:00
Dan Fandrich
5e75aedab2 tests: bump ruff version to 0.60.0
This version enables many more warnings by default.

Closes #22396
2026-07-28 08:52:01 -07:00
Dan Fandrich
3de2777421 tests: target Python 3.8 as the minimum Python version
This version is already two releases out of support, but is "only" 7
years old so is probably still being used in the real world. Document
this version along with some other testing dependencies.  Remove code
support for earlier versions. Disable ruff checks that need a newer
version.
2026-07-28 08:52:01 -07:00
Dan Fandrich
e13362c20a tests: address mutable class vars and naive datetime in Python code
Mark Python mutable class variables with ClassVar, to denote that the
danger this can cause has been considered.  Since any change made to
these in any object affects all other objects, this can cause locality
errors. However, as used in the test suite, they are are never modified
and so they are annotated as being intended.

Always set a timezone in datetime objects, as mixing naive and
timezone-aware object can cause errors.

These fix ruff rules DTZ005, RUF012.
2026-07-28 08:52:01 -07:00
Dan Fandrich
b151a0bb90 tests: use simpler constructions in Python code
* call super() without arguments
* mark an unused variable as such
* simplify by using dict getter for default values
* use writelines() when possible
* use dedent to simplify some text formatting
* avoid items() on dict in a loop when unnecessary
* replace most Python format() calls with f-strings
* use capture_output in subprocess.run

This fixes ruff rules FLY002, FURB122, PERF102, RUF059, SIM401, UP008,
UP022, UP030.
2026-07-28 08:52:01 -07:00
Dan Fandrich
3901c16933 tests: simplify by removing unneeded Python code
* combine separate if statements
* remove an unneeded encode() call
* remove unneeded returns
* simplify code when returning early

This fixes ruff rules SIM102, SIM114, UP012, PLR1711.
2026-07-28 08:52:01 -07:00
Dan Fandrich
4eb691e89c tests: change whitespace and comments in Python test code
* remove an unneeded ruff warning disable
* remove coding: utf-8 from Python code; PEP 3120 makes UTF-8 the
  default encoding
* remove unusable shebang lines from Python code
* remove empty print strings
* disable warnings when file objects are stored; these instances can't
  be handled with context managers
* use more consistent whitespace in Python code, fixing flake8 warnings
* set the executable bit on scorecard.py, making it easier to run

These fix ruff rules EXE001, FURB105, UP009, SIM115.
2026-07-28 08:52:01 -07:00
Dan Fandrich
c39193a589 tests: improve exception handling in Python test code
* Explicitly set "check" in subprocess.run() to raise an exception
  automatically, where it was done manually before
* Use contextlib.suppress to ignore exceptions
* Use custom exceptions for test errors for clarity and flexibility.
* Replace IOError with OSError

This fixes ruff rules BLE001, PLW1510, S110, TRY201, TRY203, TRY002,
UP024.
2026-07-28 08:52:01 -07:00
Viktor Szakats
e1450d8fda
tidy-up: use more static, sizeof(), char[], double-const
- make `const` data `static`, where missing and possible.
- replace `strlen()` on literal or const strings with `sizeof()`.
  While the latter is optimized by popular C compiler, e.g. MSVC only
  does it with `/O2`.
- replace magic numbers with `sizeof()`, where missing.
- introduce `CURL_CSTRLEN()` macro for `sizeof(char[]) - 1`.
- use `CURL_CSTRLEN()` macro.
- move `const` before integer types, where missing.
- replace `char *var` with `var[]`, where missing and possible.
- use double const, where missing.
  `static const char *` -> `static const char * const`.
- lib1514: constify pointers.
- unit3205: drop redundant cast, avoid another one.
- unit1666: map `OID()` macro to identical `STRCONST()`.

Closes #22406
2026-07-28 13:53:11 +02:00
Daniel Stenberg
573a6ec16b
urlapi: improved return codes
- add CURLUE_BACKSLASH that can be returned when a backslash was used
  where a forward one probably was intended.

- make CURLUE_NO_HOST higher priority than port number errors for URLs
  without hostname. Like in "http://::1"

- shortened some URL parser error strings

Extend test 1560 to verify.

Reported-by: kit-ty-kate on github
Fixes #22337
Closes #22408
2026-07-28 13:37:28 +02:00
Daniel Stenberg
c7328740ec
lib2405: adjust for non-threaded builds
- Attempt to fix the flakiness set in 9726fc8259
- Reduce macro use

Closes #22414
2026-07-28 13:30:26 +02:00
Daniel Stenberg
27a4557c9e
EXPERIMENTAL.md: We do not accept vuln reports for experimental features
Closes #22411
2026-07-28 09:20:28 +02:00
Matthew John Cheetham
a8881e5e1d spnego: block NTLM fallback in SPNEGO negotiation
- Switch the Windows SSPI identity struct to SEC_WINNT_AUTH_IDENTITY_EX
  to use !ntlm in PackageList to prevent NTLM from being offered.

- For GSS filter out NTLMSSP OID, and restrict via gss_set_neg_mechs()
  to prevent NTLM from being offered.

- Extend the GSS-API debug stub layer to support the NTLM blocking logic
  without a real Kerberos environment.

- Update test 2057 to check that negotiate auth is silently skipped with
  no Authorization header when only NTLM stub credentials are available.

- Add SPNEGO NTLM blocking test 2093 which verifies that Kerberos
  credentials still succeed when NTLM is blocked within SPNEGO.

- Suppress tests valgrind leak for MIT krb5 gss_display_status, since
  the leak is in the library and not in curl.

To suppress the tests valgrind leak, the wildcard '...' bridges over an
anonymous frame inside libgssapi_krb5.so that valgrind reports as '???'.

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
Aided-by: Johannes Schindelin

Closes https://github.com/curl/curl/pull/21315
Closes https://github.com/curl/curl/pull/22410
2026-07-27 17:28:52 -04:00
Stefan Eissing
c9ead9bd1c
conncache: conn upkeep/alive: move and enhance
- move `Curl_conn_seems_dead()` into conncache.c
- move `Curl_conn_upkeep()` into conncache.c
- when upkeep gives an error on a connection not in use,
  terminate it

Closes #21806
2026-07-27 23:26:57 +02:00
Viktor Szakats
c5ad90bf9a
typecheck-gcc: allow passing char[] as callback data
E.g. `TEST_DATA_STRING` in test 655.

Cherry-picked from #22406

Closes #22409
2026-07-27 18:54:14 +02:00
Stefan Eissing
4eb4b0d080
vquic: use ngtcp2 v1.25.0 new close2 callback
Forward only the app error code from the receiving side to the h3 layer.

This only takes effect when building against ngtcp2 v1.25.0 or higher.

Fixes #22270

Closes #22356
2026-07-27 11:36:56 +02:00
renovate[bot]
ed3508b1ee
GHA: update dependency ngtcp2/ngtcp2 to v1.25.0
Closes #22398
2026-07-27 10:26:59 +02:00
Viktor Szakats
6350eb01ed
cf-ngtcp2-cmn: de-duplicate ngtcp2_conn_client_new() call code
Closes #22401
2026-07-27 10:17:15 +02:00
Viktor Szakats
7484874fdf
cmake: verify if options are listed in INSTALL-CMAKE.md
Also:
- add one debug option to pass the test.

Ref: https://github.com/curl/curl/discussions/14885#discussioncomment-10632311

Closes #22404
2026-07-27 10:16:43 +02:00
Viktor Szakats
f9dc57a149
pytest: update two H3 tests for nghttp3 1.18.0+
Fixing:
```
FAILED ../../tests/http/test_02_download.py::TestDownload::test_02_36_looong_urls[65536-h3] -
  AssertionError: expected exit code 0, got 56
FAILED ../../tests/http/test_14_auth.py::TestAuth::test_14_05_basic_large_pw[h3] -
  AssertionError: expected exit code 0, got 56
```
Ref: https://github.com/curl/curl/actions/runs/30207198835/job/89807247058?pr=22400

Refs:
https://github.com/ngtcp2/nghttp3/pull/539
a587264544

Bug: https://github.com/curl/curl/pull/22397#issuecomment-5084927935

Closes #22402
2026-07-27 10:16:43 +02:00
Viktor Szakats
e90c4397c8
vquic: silence -Wmissing-field-initializers for nghttp3/ngtcp2 callback tables
To avoid a breakage in CI and curl-for-win builds on upstream updates
extending the callback lists. Each such breakage needed patching curl,
rolling these patches into curl-for-win, and doing it in near real-time,
to keep CI and builds working (and still causing some red CI jobs).

Bring calmness here by suppressing the warnings and allowing time to
extend the callback tables as/if needed and at a convenient moment.

Closes #22400
2026-07-27 10:16:43 +02:00
Daniel Stenberg
17855dd447
RELEASE-NOTES: synced 2026-07-27 09:40:05 +02:00
Viktor Szakats
16d49ac659
GHA/windows: bump stunnel to 5.79
Closes #22403
2026-07-27 01:49:40 +02:00
Viktor Szakats
6f39c854c8
runtests: fix mode="warn" tests passing unconditionally, fix test 1752
Fix test 1712 to pass curl C by setting `COLUMNS` to the highest
accepted value, and adjust expected results. To avoid envs with varying
lengths of `LOGDIR` affect the outcome.

Apply the same fix to test 459, though it wasn't affected in curl CI.

Also sync up test 433 `COLUMNS` value with these two tests for
consistency.

Ref: #22381
Follow-up to 8e3a2a64d1 #20666

Closes #22388
2026-07-26 22:50:50 +02:00
Daniel Stenberg
acf4498381
http: fix httpsig with auth-redir
Do not let unrelated credentials from a redirected URL bypass the
cross-host auth boundary

Verified by test 5023 to 5025

Follow-up to a55731050e

Closes #22395
2026-07-26 22:45:30 +02:00
renovate[bot]
6b1ff5407e
GHA/http3-linux: update dependency ngtcp2/nghttp3 to v1.18.0
Closes #22397
2026-07-26 16:43:35 +02:00
Viktor Szakats
e416e2948b
vquic: initialize new callback slot for nghttp3 v1.18.0+
Closes #22399
2026-07-26 16:43:18 +02:00
Viktor Szakats
b2a5369e70
runtests: allow comments in setenv section, merge sections in test433
Closes #22389
2026-07-26 16:43:18 +02:00
Viktor Szakats
12532713d6
build: tidy up httpsig options
- say 'experimental'.
- cmake: add to documentation.
- cmake: alpha-sort.

Follow-up to a55731050e #22386

Closes #22391
2026-07-26 16:43:18 +02:00
Daniel Stenberg
c5d683b961
tool_getparam: clear the --httpsig-key argument
To hide it somewhat from process listings.

Closes #22394
2026-07-25 23:35:18 +02:00
Daniel Stenberg
163f0cbc8b
cd2nroff: fix backslashes for 4-space indent lines
They were previously only properly escaped for ~~~ quotes. Spotted for
the CURLOPT_HTTPSIG_KEY man page.

Closes #22393
2026-07-25 22:59:55 +02:00
Daniel Stenberg
9bcc64c39b
curl: make --httpsig-key take a key OR a file name for key
Verified by test 5022

Closes #22392
2026-07-25 22:10:30 +02:00
Sameeh Jubran
a55731050e
httpsig: add RFC 9421 HTTP Message Signatures support
Add support for signing outgoing HTTP requests per RFC 9421 using
Ed25519 or HMAC-SHA256 algorithms.

New libcurl options:
 - CURLOPT_HTTPSIG: signing algorithm ("ed25519" or "hmac-sha256")
 - CURLOPT_HTTPSIG_KEY: path to hex-encoded key file
 - CURLOPT_HTTPSIG_KEYID: key identifier for Signature-Input
 - CURLOPT_HTTPSIG_HEADERS: space-separated components to sign

New CLI flags: --httpsig, --httpsig-key, --httpsig-keyid,
--httpsig-headers

The crypto layer follows the sha256.c multi-backend pattern with
implementations for OpenSSL (EVP_DigestSign) and wolfSSL
(wc_ed25519_sign_msg). HMAC-SHA256 uses the existing Curl_hmacit()
infrastructure which works on all backends.

Verified by test 5000 to 5021

Assisted-by: Daniel Stenberg
Signed-off-by: Sameeh Jubran <sameeh@wolfssl.com>
Closes #22386
Closes #21239
2026-07-25 16:25:37 +02:00
Viktor Szakats
ebc5212dac
tidy-up: drop redundant includes
`sys/types.h` and `sys/socket.h` (non-Win32). They are included via
`curl/curl.h` and `curl_setup.h`.

This drops `HAVE_SYS_TYPES_H` guards from the codebase. It's safe
because `sys/types.h` (POSIX) is already required unconditionally by
`curl/curl.h`. It remains used in feature checks by both autotools and
cmake; to be reviewed in a future step.

Closes #22374
2026-07-25 11:37:12 +02:00
Viktor Szakats
c4dcdb8388
spacecheck: cap number of lines per file
To prevent merging large text files by accident.

Set the cap at 10k lines. The current line number top list is:
```
    5577 configure.ac
    5561 lib/vtls/openssl.c
    5077 lib/http.c
    4517 lib/ftp.c
    4284 lib/multi.c
```

Closes #22387
2026-07-25 11:33:55 +02:00
Stefan Eissing
e093c67f1c
connect: connection close tweaks
- connclose/streamclose/connkeep() remove description string that was
  never used anywhere. Add trace statements where reasons for closing
  were not already traced and maybe not obvious.
- multi_remove_handle: only lookup former connection in pool when
  transfer is set to connect only
- test1554: adapt expectations now that pool is less often locked

Closes #22379
2026-07-24 22:59:46 +02:00
Stefan Eissing
a954d87f0b
httpsrr: DoH with HTTPS, fix response handling
Fix handling of DoH response that only asks for HTTPS records.

Add test 2117 for checking that a HTTPS-RR resolve is processed,
even though the actual answer is invalid.

Closes #22372
2026-07-24 22:58:51 +02:00
Stefan Eissing
474ebb5247
api-guard: check lock on session cache
Add a property to easy/multi API calls that prohibit calling
the function when the involved SSL session cache is under lock
by the current thread.

Checks are only in effect when pthreads/Windows threads are
available.

Closes #22367
2026-07-24 22:57:58 +02:00
AlanKingPL
20c7877dcb terminal: Enhance terminal size detection for multiple outputs
- Get the terminal size from STDOUT or STDERR when the terminal size of
  STDIN is not available.

Closes https://github.com/curl/curl/pull/22276
2026-07-24 11:46:54 -04:00
Stefan Eissing
a479459ea3
http: fix non-tunneling proxy hostname use
Make sure hostname used in URL to proxy is IDN decoded form, but keep
the original hostname in case it was ipv6.

Fixes #22382
Reported-by: RMMoreton on github
Closes #22385
2026-07-24 16:27:41 +02:00
Graham Campbell
c8860532dd tests: fix the FTP check for unexpected RST
- In vsftpd ignore unrelated RST by matching tcpdump RSTs to the data
  connection port pair.

Prior to this change an unrelated RST on a recycled ephemeral port
could cause test failure.

Closes https://github.com/curl/curl/pull/22305
2026-07-24 04:31:09 -04:00
Stefan Eissing
545cdd4b50
asyn-thrdd: retry link-local ipv6 if missing scope id
When the threaded resolver gets AAAA results that carry a link-local
address without scope-id, it now re-queues a query with AF_UNSPEC and
strips ipv4 addresses from that result. Whatever the resulting addresses
and scope-ids are, this becomes the result of the resolve.

Fixes #22330
Reported-by: Bartel Sielski
Closes #22368
2026-07-23 22:26:43 +02:00
Alhuda Khan
489a4c1b48
ctype: exclude control bytes from ISPRINT and ISGRAPH
Closes #22371
2026-07-23 22:25:06 +02:00
Ross Burton
090056522b
configure: only check in the watt library if WATT_ROOT is set
Only look for gethostbyname in libwatt in $WATT_ROOT/lib if WATT_ROOT
has actually been set. This avoids configure trying to search in /lib,
which won't every succeed and can cause problems in cross builds which
check that host paths are not being searched.

Closes #22380
2026-07-23 22:04:15 +02:00
Viktor Szakats
8734b08883
tidy-up: miscellaneous
- CMake/CurlTests.c: sync indent with rest of file and most of code.
- cmake: sync term in `_CURL_PREFILL` description with rest of code.
- curl_setup.h: document function relying on `_CRT_SECURE_NO_WARNINGS`.
- tests/http/scorecard.py: typo in message.
- 'Quiche' -> 'quiche'.
- fix comment and formatting nits.

Closes #22378
2026-07-23 14:19:23 +02:00
Viktor Szakats
932e63aab9
md5: replace magic numbers with MD5_DIGEST_LEN
Closes #22377
2026-07-23 12:56:18 +02:00