8.21.0Desktop
Added 3
- curl: named globs in output filename for upload glob references
- HTTP/3: add proxy CONNECT and MASQUE CONNECT-UDP support (ngtcp2 QUIC)
- libssh: add support for SHA256 host public keys
Changed 1
- http2: remove stream dependency tracking
Fixed 15
- cfilters: fix busy loop on blocked transfers
- chunked: reject invalid bytes in trailer
- cf-socket: set scope_id for IPv6 link-local addresses
- cookie: check __Secure- and __Host- case sensitively when read from file
- cookie: compare path case sensitively
- cookie: reject control octets in file-loaded cookies
- curl_ntlm_core: fix nettle 4+ builds in certain MultiSSL combos
- digest: flush proxy state on proxy or credential change
- doh: cap the maximum TTL to 24 hours
- event: fix wakeup consumption
- ftp: avoid accessing EPSV response one byte past the NULL
- gsasl: fix potential double free
- http-proxy: verify CONNECT response headers
- http: reject spurious CR bytes in headers
- AmigaOS: fix build fallouts, re-add to CI
Removed 1
- lib: drop support for CURLAUTH_DIGEST_IE
curl / Docs / Releases / Changes in 8.21.0 Related: Daily Snapshots Source repo Release log Pending Release 🠰 8.20.0 all changes pending release
Changes in 8.21.0 - June 24 2026
8.21.0 8.21.0 Changes:
- curl: named globs in output filename for upload glob references
- HTTP/3: add proxy CONNECT and MASQUE CONNECT-UDP support (ngtcp2 QUIC)
- http2: remove stream dependency tracking
- lib: drop support for CURLAUTH_DIGEST_IE
- libssh: add support for SHA256 host public keys
- tool_urlglob: add named globs Bugfixes:
- _ENVIRONMENT.md. Windows does case insensitive env variables
- _URL.md: remove the zone-id mention
- AmigaOS: curl_setup.h avoid explicit_bzero with clib2
- AmigaOS: fix build fallouts, re-add to CI
- asyn-thrdd: add IPv6 guards
- asyn-thrdd: fix result processing without wakeup socketpair
- autotools: mbedtls detection fixes
- BINDINGS: Update Hollywood link
- BUFQ.md: re-sync with source code
- build: enable
-Wlogical-oppicky warning for GCC 4.4+ - build: omit zlib pkg-config reference for Android
- cf-h2-prox: fix peer leak
- cf-h2-proxy: drop interim responses
- cf-https-connect: do not engage on proxy origin
- cf-ip-happy.c: minor comment typo
- cf-ip-happy: update documentation
- cf-socket: make Curl_addr2string static
- cf-socket: set scope_id for IPv6 link-local addresses
- cf-socket: store errno from do_connect in ctx->error
- cfilters: fix busy loop on blocked transfers
- chunked: reject invalid bytes in trailer
- CIPHERS.md: fix the example that uses only TLS 1.3
- cmake/FindGSS: drop "MIT Unknown" version value, related tidy ups
- cmake/FindGSS: drop CMake <3.16 compatibility logic
- cmake/FindGSS: fix comment, adjust custom flavor property name
- cmake/FindGSS: prioritize MIT over GNU in pkg-config detection
- cmake: auto-select static nghttp2/nghttp3/ngtcp2 Config
- cmake: export/forward
NGTCP2_CRYPTO_BACKEND - cmake: fix three issues generating lib options in config files
- cmake: fix zstd CMake config name
- cmake: opt in
MSVC_VERSION1951 to picky warnings - cmake: quote
COMPONENTSstring incurl-config.in.cmake - cmake: simplify
LINK_ONLYimported target extraction - config2setopts: use default protocol properly
- connect: remove deref of freed pointer in trace call
- content_encoding: fix limit failure message
- content_encoding: fix non-last chunked rejection
- content_encoding: timeout during slow decoding
- cookie: check __Secure- and __Host- case sensitively when read from file
- cookie: compare path case sensitively
- cookie: reject control octets in file-loaded cookies
- cookie: simplify strstore(), remove outdated comment
- cookie: tailmatch the domains for secure override
- cookie: trim trailing dots when checking PSL
- creds: add sasl service name
- creds: create with empty user+pass
- creds: mask OAuth bearer token in trace logs
- creds: remove two unused functions
- curl_easy_pause.md: rephrase the stream cache when pause clause
- curl_easy_setopt.md: change options when no transfer runs
- curl_formdata: fix to pass long where missing, document
CURLFORM_NAMELENGTH - curl_multi_assign.md: clarify lifetime
- curl_ntlm_core: fix nettle 4+ builds in certain MultiSSL combos
- curl_ntlm_core: propagate DES
CryptEncrypt()error - curl_sha512_256: fix result code on error
- CURLINFO_CONTENT_LENGTH_UPLOAD_T.md: expand
- CURLMOPT_SOCKETFUNCTION.md: this sends all file descriptors
- CURLOPT_CHUNK_BGN_FUNCTION: target is there for symlinks only
- CURLOPT_DISALLOW_USERNAME_IN_URL: is for CURLOPT_URL only
- CURLOPT_DOH_URL.md: does not inherit proxy options
- CURLOPT_ECH.md: simplify the description language
- CURLOPT_HAPROXYPROTOCOL.md: only sent for newly setup connections
- CURLOPT_MAXFILESIZE: clarify this also works for on-going transfers
- CURLOPT_PINNEDPUBLICKEY.md: does not apply for other origins
- CURLOPT_PORT.md: use stronger language
- CURLOPT_SHARE: warn about early remove
- CURLOPT_SSH_HOSTKEYFUNCTION.md: for new connections only
- CURLOPT_WRITEFUNCTION.md: mention redirects
- CURLOPT_WRITEFUNCTION.md: remove stray reference to HSTS
- delta: harden external command invocations
- digest: escape control codes too
- digest: flush proxy state on proxy or credential change
- digest: flush state on origin or credential change
- dns-httpsrr-lookup: use origin, not peer
- dnscache: remove Curl_dns_entry_link
- docs/libcurl: fix the version for curl_multi_socket_action
- docs: end "...can be used several times..." sentences with period
- docs: fix --follow doc typo
- docs: fix a couple of typos
- docs: fix grammar and wording in FAQ
- docs: fix odd wording in CONTRIBUTE.md
- docs: note CURLOPT_PINNEDPUBLICKEY has no effect on legacy LDAP backend
- docs: returned header size reflects HTTP/1-style format
- doh: cap the maximum TTL to 24 hours
- doh: stricter HTTPS RNAME parsing
- ECH: cleanups
- event: fix wakeup consumption
- ftp: avoid accessing EPSV response one byte past the NULL
- ftp: remove 2 Curl_resolv_blocking() calls
- ftp: remove bits.ftp_use_control_ssl
- ftplistparser: clear strings.target if not symlink
- gnutls: allow building with nettle 4.0
- gnutls: fix more nettle 4+ compatibility issues
- gnutls: require 3.7.2 for earlydata
- gsasl: fix potential double free
- gtls: fix ignored return and uninitialized status in OCSP check
- gtls: fix some typos
- gtls: minor fixes and improvements
- gtls: use the correct return code in trace output
- gtls: verify OCSP response signature in gtls_verify_ocsp_status
- h3-proxy: fix callback return values, and a typo in tests
- hostip: remove unused MAX_HOSTCACHE_LEN and MAX_DNS_CACHE_SIZE
- hsts.md: mention multiple curl invokes effect
- hsts: duplicate live HSTS data in curl_easy_duphandle
- http-proxy: verify CONNECT response headers
- HTTP3.md: update quiche build
- http: don't pass on set cookies to new origins
- http: prefer chunked encoding over Content-Length: 0
- http: reject spurious CR bytes in headers
- http_digest: return better error
- idn: replace header guards with forward declaration
- INSTALL-CMAKE.md: document CMake environment variables
- INTERNALS.md: document minimum nghttp3 and ngtcp2 versions
- KNOWN_BUGS.md: remove fixed GnuTLS <-> OpenSSL incompat bug
- KNOWN_BUGS: remove stale Threads::Threads entry
- krb5_sspi: fix error message on
DecryptMessage()fail - ldap: base64 encode binary LDIF values with WinLDAP
- ldap: fix minor leak on write callback error
- ldap: fix to not leak
attributeon OOM (WinLDAP) - ldap: switch off chasing referrals
- lib678: fix to not be perma-skipped
- lib: make
__STDC_VERSION__literalsL(where missing) - lib: transfer origin and proxy handling
- lib: two minor typos
- libcurl-easy.md: minor clarifications
- libssh2: do not use deprecated macros when unavailable
- libssh2: drop stray double-negative from
strncmp()result - libssh2: fix to return error code on missing parameter
- libssh2: replace macro names with non-misspelled alternatives
- libssh2: save non-standard port to
known_hosts - libssh2: sync version check with INTERNALS.md
- libssh2: use non-deprecated
libssh2_knownhost_addc() - libssh: map SSH_KNOWN_HOSTS_OTHER to CURLKHMATCH_MISMATCH
- m4: drop redundant conditions in TLS library detections
- Makefile.am: drop test1190 listed twice
- managen: apply minor fixes and improvements
- mbedtls: null-terminate the private key blob
- mk-unity.pl:
#include, and not concatenate input headers - mqtt: return error on truncated Remaining Length
- mqtt: validate PINGRESP and DISCONNECT have remaining_length == 0
- multi: handle pause in multi socket callback
- multi: remove a stale comment
- multi: silence gcc 16
-Wnull-dereference, bump CI job to test - multi: xfers_really_alive
- netrc: remember and check filename loaded
- netrc: scanner refactor
- ngtcp2: fail handshake directly
- openssl: do not mix OpenSSL int result with
CURLcodevariable - os400sys: fix theoretical length overflows
- peer.h: fix typo in comment
- pingpong: reject nul byte in server response line
- progress: fix CURLINFO time reporting
- psl: require libpsl 0.16.0 (2016-12-10) or greater
- pytest: pass
--disableto curl - pytest: re-enable test test_05_01 and test_05_02 for quiche 0.29.0+
- pythonlint.sh: make it fail on error, fix ruff warnings in pytest
- quic: count zero length packets against max
- ratelimits: use minimal burst rate
- RELEASE-PROCEDURE.md: update coming release dates
- resolve: mention in error that IP address is expected
- rtsp: bump buf after rtsp_filter_rtp()
- runner.pm: apply minor correctness fix
- runner.pm: set
CURL_TESTNUMforprecheckcommands - runtests: fix tests for curl builds with embedded CA bundle
- rustls: error on CURLOPT_CRLFILE with native CA store
- schannel: check
schannel_sha256sum()success, and more - schannel: enforce Extended Key Usage for custom CA roots
- schannel: error on TLS 1.3-only with cipher list
- schannel: fix https proxy for client cert and certinfo
- schannel: fix revoke_best_effort setting for proxy
- schannel: use fopen instead CreateFile
- schannel_verify: avoid out of blob access
- schannel_verify: simplify CryptQueryObject use
- scripts: catch Credits-to contributors
- SECURITY-ADVISORY.md: expand
- setopt: changing the proxy port is also a proxy change
- setopt: clear proxy auth properly on NULL
- setopt: clear the "custom" CA booleans when set to NULL
- setopt: CURLOPT_MAXCONNECTS set to 0 restores default value
- setopt: defref the old referer when setting a new
- setopt: fix to honor
CURLOPT_PROXY_CAINFO_BLOBover Native CA - setopt: gate a few proxy TLS options by checking backend support
- setopt: more careful cleanup of the HSTS cache
- setopt: return error if received
curl_blob->datais NULL - show-headers.md: mention bold headers and --no-styled-output
- sigv4: URL encode the username in the header
- smb: constify
strchr()result variable - smb: integer overflow proof a size check
- smbserver: update internal id generation for Python 3
- socket: introduce
SOCK_EAGAIN()and use it - socket: use name
sockerrfor socket error variables - socks_sspi: invalid response length is a fatal error
- socks_sspi: store socks5_gssapi_enctype
- spnego_sspi: honor CURLOPT_GSSAPI_DELEGATION for Windows SSPI
- spnego_sspi: preserve distinction btw policy-only and uncond delegation
- src: fix comment typos
- src: sync nghttp2 versions checks with current requirements
- ssl native_ca_store: always reinit
- SSLCERTS: document 8.19.0 default Native CA builds (Windows)
- sspi: clear SSPI credentials on AcquireCredentialsHandle failure
- sspi: free libcurl allocated memory with curlx_free
- telnet: drop an
intcast no longer necessary - telnet: drop redundant interim variables
- telnet: fix error message typos
- telnet: fix old copy-paste typo in variable name
- telnet: honor CURLOPT_TIMEOUT in send_telnet_data()
- test1588: use %TESTNUMBER, not hard-coded number
- test1981: explicitly set the locale
- tests: add
cookiesfeature to some tests - tests: add an assert to avoid IPC blocking
- tests: add the "--resolve" keyword to tests that lack it
- tests: fix unit1636 with --disable-progress-meter
- tftp: avoid the timeout calc if the timeout is crazy
- tftp: stricter option name checks
- tidy-up: add space around operators, where missing
- tidy-up: apply clang-format fixes
- tidy-up: drop stray casts for allocated pointers
- tidy-up: miscellaneous
- tls: fix incomplete mTLS config in conn reuse and session cache
- tls: wolfssl: fixes for PQC key shares
- tool: warn when --ssl and --ftp-ssl-control override each other
- tool_formparse.c: fix two minor comment typos
- tool_formparse: polish error message + make two functions static
- tool_formparse: tool2curlparts is no longer recursive
- tool_help: rectify a bad assert
- tool_operhlp: avoid NULL to %s
- tool_urlglob: avoid overflow at end of range
- tool_urlglob: better 'Duplicate glob name' position
- tool_urlglob: make globbing error reported for correct position …