Commit graph

15618 commits

Author SHA1 Message Date
Daniel Stenberg
875ea98c36
schannel: handle Curl_conn_cf_send() errors better
Avoid a resource leak in the error path.

Reported-by: Joshua Rogers

Closes #19265
2025-10-28 23:26:33 +01:00
Daniel Stenberg
9308ea22e8
cookie: remove the temporary file on (all) errors
Fixes #19267
Reported-by: Harry Sintonen
Closes #19268
2025-10-28 16:51:30 +01:00
x2018
02113a6307
Curl_resolv: explicitly set *entry to NULL at the top
Closes #19263
2025-10-28 11:39:13 +01:00
Stefan Eissing
692c7f133e
TLS: IP address verification, extend test
Change the test certificate to carry a altname 'dns:127.0.0.1' which
should *not* match in test_17_05_bad_ip_addr.

wolfSSL: since `wolfSSL_check_domain_name()` does not differentiate
between DNS and IP names, use if only for DNS names. For IP addresses,
get the peer certificate after the handshake and check that using
wolfSSL_X509_check_ip_asc().

Unfortunately, this succeeds where it should not, as wolfSSL internally
used the same check code for both cases. So, skip the test case until
wolfSSL fixes that.

Reported-by: Joshua Rogers
Closes #19252
2025-10-27 17:22:17 +01:00
Daniel Stenberg
2bb33c18a7
pingpong: change repsonse timeout to one minute
It was previously two minutes by default and sometimes one minute.
Removes a struct field.

Closes #19254
2025-10-27 16:33:30 +01:00
x2018
6c97ff8c12
socks: properly maintain the status of 'done'
Closes #19255
2025-10-27 16:31:37 +01:00
Daniel Stenberg
cdd945e486
http_proxy: fix adding custom proxy headers
Reported-by: Joshua Rogers
Fixes #19227
Closes #19239
2025-10-27 09:52:00 +01:00
TheBitBrine
a49e4e3d16
pop3: fix CAPA response termination detection
The code was checking if a line starts with '.', which would
incorrectly match capability names starting with dots. Per RFC 2449,
the terminator must be a line containing only a single dot.

RFC 2449 also explicitly excludes '.' from valid capability name
starting characters, so this is purely theoretical, but the code
should match the spec.

Changed to check for exact match: line length of 3 with '.\r' or
length 2 with '.\n' to handle both CRLF and LF-only servers.

(Mistake detected with ZeroPath)

Fixes #19228
Reported-by: Joshua Rogers
Closes #19245
2025-10-26 10:59:20 +01:00
Viktor Szakats
4f03e3fcbd
socks_gssapi: also reset buffer length after free
To mimic this behavior of the previously used `gss_release_buffer()`.

Some or all of these zero assignments may be redundant.

Follow-up to e7818999db #19018

Closes #19167
2025-10-26 01:52:41 +02:00
Daniel Stenberg
3e12ed955b
schannel: lower the maximum allowed time to block to 7 seconds
During TLS renegotiation, the schannel_recv_renegotiate() function is
allowed to block for a short while. Reduce the maximum allowed time to
block from 10 minutes down to 7 seconds.

Closes #19205
2025-10-25 17:52:29 +02:00
Viktor Szakats
a13d811044
lib: delete unused header includes
`escape.h`, `getinfo.h`, `strdup.h`.

Tested OK with full non-unity CI run.

Closes #19231
2025-10-25 00:19:00 +02:00
Viktor Szakats
71d1eec675
tidy-up: miscellaneous
- cmake/Find*: make double quotes consistent.
- drop redundant parenthesis.
- GHA/checksrc: sync a step name with others.
- whitespace.

Closes #19233
2025-10-25 00:19:00 +02:00
Viktor Szakats
543b78652a
curl_ngtcp2: fix -Wunreachable-code with H3 !verbose !unity clang
Not tested in default CI.

macOS / CM clang OpenSSL gsasl rtmp AppleIDN SecTrust +examples,
macOS / CM llvm@18 OpenSSL gsasl rtmp AppleIDN SecTrust +examples:
```
lib/vquic/curl_ngtcp2.c:530:5: error: code will never be executed [-Werror,-Wunreachable-code]
  530 |     const ngtcp2_transport_params *rp;
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
```
Ref: https://github.com/curl/curl/actions/runs/18787154442/job/53608230871?pr=19225#step:11:183

Confirmed fixed via #19225
Closes #19226
2025-10-24 22:53:26 +02:00
Viktor Szakats
3fc727751f
lib: delete unused crypto header includes
Tested OK with full non-unity CI run.

Closes #19225
2025-10-24 22:53:26 +02:00
Viktor Szakats
833da09b53
vtls: drop duplicate CURL_SHA256_DIGEST_LENGTH definition
Closes #19224
2025-10-24 19:16:53 +02:00
Viktor Szakats
207a74206b
mbedtls: fix building with sha-256 missing from PSA
Fixing:
```
lib/vtls/mbedtls.c:1505:10: error: call to undeclared function 'Curl_sha256it'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
 1505 |   return Curl_sha256it(sha256sum, input, inputlen);
      |          ^
1 error generated.
```

with mbedTLS configuration:
```
tf-psa-crypto/scripts/config.py unset PSA_WANT_ALG_SHA_256
tf-psa-crypto/scripts/config.py unset PSA_WANT_ALG_TLS12_ECJPAKE_TO_PMS
tf-psa-crypto/scripts/config.py unset MBEDTLS_LMS_C
```

Follow-up to 3a305831d1 #19077

Closes #19223
2025-10-24 19:14:28 +02:00
Viktor Szakats
c96b7c4636
des: merge curl_des into curl_ntlm_core.c
`curl_des.c` contained a single, short, function
`Curl_des_set_odd_parity()`, called from `curl_ntlm_core.c` alone.

Move it there, and define it only when needed.

Follow-up to 300876a7a6
Follow-up to 8cc70db2db

Closes #19209
2025-10-24 12:39:27 +02:00
Viktor Szakats
4a6fbd5e1d
NTLM: disable if DES support missing from OpenSSL or mbedTLS
Make autotools and cmake detect DES support in OpenSSL and mbedTLS.
Forward feature macros to C and omit NTLM from the feature preview list.
Use the feature macros in source. This ensure that `-V` output matches
the preview.

OpenSSL doesn't support DES when built with `no-des` or `no-deprecated`.
mbedTLS 4.x no longer supports it, and it's possible to disable it in
<4 with `scripts/config.py unset MBEDTLS_DES_C`.

Before this patch this worked for
mbedTLS 4 only, and with a regression for pending PR #16973.

Also:

- drop NTLM feature check from `curl_setup.h` in favour of autotools/
  cmake feature macros. This makes `curl_setup.h` no longer need
  to include an mbedTLS header, which in turn makes tests/server build
  without depending on mbedTLS.
  Fixing, in #16973:
  ```
  In file included from tests/server/first.h:40,
                   from bld/tests/server/servers.c:3:
  lib/curl_setup.h:741:10: fatal error: mbedtls/version.h: No such file or directory
    741 | #include <mbedtls/version.h>
        |          ^~~~~~~~~~~~~~~~~~~
  ```
  Ref: https://github.com/curl/curl/actions/runs/18689537893/job/53291322012?pr=16973
  Ref: #19181 (initial fix idea)
  Follow-up to 3a305831d1 #19077

- move back mbedTLS header include and version check from
  `curl_setup.h` to each source which consumes mbedTLS.

- GHA/http3-linux: drop workaround that disabled NTLM for
  `no-deprecated` OpenSSL builds.
  Follow-up to 006977859d #12384

- curl_ntlm_core: drop pointless macro `CURL_NTLM_NOT_SUPPORTED`.
  Follow-up to 006977859d #12384

Closes #19206
2025-10-24 12:12:20 +02:00
Viktor Szakats
1de4a9a5fb
mbedtls: fix building with <3.6.1
```
lib/vtls/mbedtls.c:786:3: error: call to undeclared function 'mbedtls_ssl_conf_tls13_enable_signal_new_session_tickets'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
  786 |   mbedtls_ssl_conf_tls13_enable_signal_new_session_tickets(&backend->config,
      |   ^
lib/vtls/mbedtls.c:787:5: error: use of undeclared identifier 'MBEDTLS_SSL_TLS1_3_SIGNAL_NEW_SESSION_TICKETS_ENABLED'; did you mean 'MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET_FLUSH'?
  787 |     MBEDTLS_SSL_TLS1_3_SIGNAL_NEW_SESSION_TICKETS_ENABLED);
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |     MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET_FLUSH
dep/mbedtls-3.4.0/_pkg/include/mbedtls/ssl.h:700:5: note: 'MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET_FLUSH' declared here
  700 |     MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET_FLUSH,
      |     ^
2 errors generated.
```

Regression from d63e40f8e6 #18271 (8.16.0)

Closes #19208
2025-10-24 12:12:20 +02:00
Daniel Stenberg
576f9f7c07
cfilters: check return code from Curl_pollset_set_out_only()
I added WARN_UNUSED_RESULT to two of the cfilter functions to make this
mistake harder to slip in next time.

Pointed out by CodeSonar

Closes #19211
2025-10-24 11:11:40 +02:00
Daniel Stenberg
48d314f262
connect: for CONNECT_ONLY, CURLOPT_TIMEOUT does not apply
Since using CONNECT_ONLY is by defintion only a connect, we make the
timeleft function return 0 after the connection is done so that it does
not - surprisingly - timeout later.

Fixes #18991
Reported-by: Pavel P
Closes #19204
2025-10-23 22:53:15 +02:00
Daniel Stenberg
3692cd837e
schannel: replace a run-time condition with an assert
For detecting a bad function argument that probably also would cause a
compiler warning.

Closes #19203
2025-10-23 22:52:02 +02:00
Viktor Szakats
3ac38a6b80
md4: drop mbedtls implementation (not available in mbedtls v3+)
Follow-up to 01a2308236 #18254

Closes #19202
2025-10-23 16:47:19 +02:00
Daniel Stenberg
0d1d35fa34
http: only accept ';' as a separator for custom headers
When parsing incoming headers, they need to have a plain normal colon.

Previously out of convenience we used the same parser function for both
cases (incoming + custom set headers via the API) which made the
function too liberal for incoming HTTP traffic.

Closes #19200
2025-10-23 14:18:11 +02:00
Theo Buehler
2edce44065
vtls: remove call to PKCS12_PBE_add()
Curl is one of the last callers of PKCS12_PBE_add(). It has been a noop
since OpenSSL 0.9.8k (2006) stubbed it out when moving the built-in PBE
algorithms to a static table:
b8f702a0af

Closes #19201
2025-10-23 14:13:26 +02:00
Daniel Stenberg
9752d5fe0b
netrc: when the cached file is discarded, unmark it as loaded
Pointed out by ZeroPath

Closes #19199
2025-10-23 13:05:25 +02:00
Stefan Eissing
a330117bb0
smtp: fix EOB handling
SMTP automatically appends a \n.\n to an upload if there is not already
one at the end of the input. The implementation had a bug where this did
not happen, depending on read size and buffering.

Change test 900 to reproduce the failure. The bug only happened for mail
body input of known length, where EOS was known on the last chunk read.
Change test 900 to use an input file and make it large enough.

Fixes #18798
Closes #19193
Reported-by: madoe on github
2025-10-23 13:03:10 +02:00
Stefan Eissing
0a79a599a9
transfer: fix retry for empty downloads on reuse
When a reused connection did transfer 0 bytes, it assumed the transfer
had failed and needed a retry. Add a check for data->red.done, so we can
successfully accept the transfer of a 0-length file via SFTP.

Add test case 1583 to verfiy.

Fix SFTP disconnect debug trace when there was nothing to
disconnect (like when reusing a connection).

Fixes #19165
Reported-by: Alexander Blach
Closes #19189
2025-10-23 13:01:35 +02:00
Daniel Stenberg
d922db880c
ntlm: improved error path on bad incoming NTLM TYPE3 message
No leaks

Reported-by: Tim Becker
Closes #19198
2025-10-23 10:19:51 +02:00
x2018
6032b8f2a2
vtls: unify the error handling in ssl_cf_connect().
Check preference at first, then init peer and do connect. Also fixes
CF_DATA_RESTORE.

Closes #19196
2025-10-23 08:23:44 +02:00
x2018
28ebaf86ce
cw-out: unify the error handling pattern in cw_out_do_write
to proper set the error status and release resource

Closes #19195
2025-10-23 08:17:55 +02:00
Daniel Stenberg
9e15b07638
openssl: only try engine/provider if a certificate file/name is provided
Bug: https://issues.oss-fuzz.com/issues/435278402

Closes #19197
2025-10-23 07:54:34 +02:00
Daniel Stenberg
d51d19bd06
ftp: remove the retr_size_saved struct field
It was basically a duplicate of data->req.size already

Closes #19194
2025-10-22 23:43:39 +02:00
Daniel Stenberg
a8f16da712
ftp: remove the state_saved struct field
It was not necessary. Its only purpose was to know if an upload is done,
and that information is already available elsewhere.

Closes #19192
2025-10-22 22:52:36 +02:00
Daniel Stenberg
4d93592a26
ftp: reduce size of some struct fields
Closes #19191
2025-10-22 15:55:05 +02:00
Daniel Stenberg
61156f7921
ftp: remove 'newhost' and 'newport' from the ftp_conn struct
They are only needed locally, no need to keep them around.

Closes #19190
2025-10-22 14:13:19 +02:00
Daniel Stenberg
fb6a4802d7
imap: parse and use UIDVALIDITY as a number
Instead of a string. Saves a malloc, adds earlier format check.

RFC 3501 section 2.3.1.1 documents the value as a 32-bit value.

Closes #19188
2025-10-22 14:12:07 +02:00
Stefan Eissing
bb78c45407
vquic: fix recvmsg loop for max_pkts
The parameter `max_pkts` was not checked in the recvmsg() implementation
of vquic_recv_packets() as the packter counter was never increased. This
led to the loop running until an EAGAIN was encountered. Which, in any
real case scenario, does no harm as long as libcurl is ingesting packets
faster than a server is able to send them.

However on a slow device and a fast network this could happen and allow
a denial of serice.

Not a real regression as the vulnerable code has never been released.
libcurl 8.16.0 does not have this bug.

Closes #19186
2025-10-22 11:40:47 +02:00
Stefan Eissing
fcae0733a7
gnutls: fix re-handshake comments
With GnuTLS, a GNUTLS_E_REHANDSHAKE can be a renegotiate in TLSv1.2 or a
key update in TLSv1.3. This had been made non-blocking in
a1850ad7de but the comment warning about a
blocking call was not updated.

Closes #19187
2025-10-22 11:40:00 +02:00
Stefan Eissing
9c313b61b4
ftp: check errors on remote ip for data connection
Obtaining the remote ip of the control connection to be used for the
data connection can fail. Check that and fail the transfer when that
does not work.

Triggered by an OSS-Fuzz issue.
Closes #19185
2025-10-22 10:58:21 +02:00
x2018
68e63a7997
curl_path: add curlx_dyn_free() on an error path
Follow-up to 976333dd40

Closes #19183
2025-10-22 09:37:54 +02:00
Daniel Stenberg
7295546447
hostip: fix infof() output for non-ipv6 builds using IPv6 address
Pointed out by ZeroPath

Closes #19184
2025-10-22 08:41:19 +02:00
x2018
7d5d0645e5
http: unify error handling in Curl_http()
Closes #19182
2025-10-21 23:19:39 +02:00
Daniel Stenberg
48df7b29d9
cookie: only count accepted cookies in Curl_cookie_add
The counter used to stop accepting cookies after a certain amount has
been received in a single response would previously also count some
cookies that were not actually accepted as they were discarded after the
counter was increased.

Starting now, the counter is increased only for cookies that were
accepted.

Pointed out by ZeroPath
Closes #19157
2025-10-21 16:33:32 +02:00
Stefan Eissing
40f7cd2bdd
mime: fix unpausing of readers
When unpausing a transfer, check if the reader pause state differs
in addition to the "keepon" flags.

Reported-by: 包布丁
Fixes #18848
Closes #19178
2025-10-21 16:30:47 +02:00
Daniel Stenberg
76d2852550
hmac: free memory properly on errors
If one of the hmac init calls fail, Curl_HMAC_init previously would
return without first freeing the allocated HMAC_context.

Fixes #19176
Reported-by: WangDaLei on github
Closes #19177
2025-10-21 16:24:21 +02:00
Stefan Eissing
dbff3eec45
cf-socket: give information when unable to open socket
Give ERRNO explanation in a failf() when unable to open a socket.
Helps in finding out what the issue preventing your curl to work
really is. Just had a wrong ulimit after a sys update.

Closes #19158
2025-10-20 15:21:47 +02:00
Stefan Eissing
4be9db7bc8
http: accept duplicate location with same value
When a server sends a Location: header repeat with the same location,
ignore the repeats silently.

Follow-up to 9596c4a258
Closes #19159
2025-10-20 14:48:20 +02:00
Viktor Szakats
e7818999db
socks_gssapi: replace gss_release_buffer() with curl free for buffers owned by libcurl
Before this patch, this code used to call `gss_release_buffer()` on
objects with buffers allocated via curl's allocator.
`gss_release_buffer()` calls system (or Win32) free on these buffers,
which may mismatch with curl's allocator. To fix it, align these calls
with the pattern used in vauth modules, by replacing
`gss_release_buffer()` with curl free to release the buffers.

Use `Curl_safefree()` to set the freed pointer to NULL, as
`gss_release_buffer()` did.

Also: use object length var when allocating.

Reported-by: Joshua Rogers

Closes #19018
2025-10-20 14:23:46 +02:00
Daniel Stenberg
1876ed6296
cf-socket: make set_local_ip void, and remove failf()
No callers of this function checked the return code, meaning failures
are not lethal == using failf was wrong, and it can just as well return
void.

Closes #19137
2025-10-20 10:57:48 +02:00