diff --git a/ftp/curl/Makefile b/ftp/curl/Makefile index d86c815b98e7..0eebfd2224dd 100644 --- a/ftp/curl/Makefile +++ b/ftp/curl/Makefile @@ -1,173 +1,174 @@ PORTNAME= curl PORTVERSION= 8.10.0 +PORTREVISION= 1 CATEGORIES= ftp net www MASTER_SITES= https://curl.se/download/ \ https://github.com/curl/curl/releases/download/curl-${PORTVERSION:S|.|_|g}/ MAINTAINER= sunpoet@FreeBSD.org COMMENT= Command line tool and library for transferring data with URLs WWW= https://curl.se/ \ https://github.com/curl/curl LICENSE= MIT LICENSE_FILE= ${WRKSRC}/COPYING USES= cpe libtool localbase pathfix perl5 shebangfix tar:xz USE_PERL5= build CONFIGURE_ARGS= --disable-werror \ --enable-dateparse \ --enable-dnsshuffle \ --enable-headers-api \ --enable-hsts \ --enable-http-auth \ --enable-mime \ --enable-netrc \ --enable-openssl-auto-load-config \ --enable-progress-meter \ --with-zsh-functions-dir=${LOCALBASE}/share/zsh/site-functions \ --without-ca-bundle \ --without-ca-path \ --without-fish-functions-dir CONFIGURE_ENV= LOCALBASE=${LOCALBASE} \ ac_cv_func_SSLv2_client_method=no GNU_CONFIGURE= yes INSTALL_TARGET= install-strip TEST_TARGET= test USE_LDCONFIG= yes CPE_VENDOR= haxx SHEBANG_FILES= */*.pl OPTIONS_DEFINE= ALTSVC BROTLI COOKIES CURL_DEBUG DEBUG DOCS EXAMPLES IDN IPV6 NTLM PROXY PSL STATIC TLS_SRP ZSTD OPTIONS_GROUP= PROTOCOL OPTIONS_RADIO= SSL OPTIONS_SINGLE= GSSAPI RESOLV OPTIONS_GROUP_PROTOCOL= DICT FTP GOPHER HTTP HTTP2 IMAP LDAP LDAPS LIBSSH LIBSSH2 MQTT POP3 RTSP SMB SMTP TELNET TFTP WEBSOCKET OPTIONS_RADIO_SSL= GNUTLS OPENSSL WOLFSSL OPTIONS_SINGLE_GSSAPI= GSSAPI_BASE GSSAPI_HEIMDAL GSSAPI_MIT GSSAPI_NONE OPTIONS_SINGLE_RESOLV= CARES THREADED_RESOLVER OPTIONS_DEFAULT=ALTSVC COOKIES GSSAPI_${${SSL_DEFAULT} == base :?BASE :NONE} DICT FTP GOPHER HTTP HTTP2 IMAP LIBSSH2 NTLM OPENSSL POP3 PROXY PSL RTSP SMTP STATIC TELNET TFTP THREADED_RESOLVER TLS_SRP OPTIONS_SUB= yes ALTSVC_DESC= HTTP Alternative Services support COOKIES_DESC= Cookies support CURL_DEBUG_DESC=cURL debug memory tracking DICT_DESC= DICT (RFC 2229) support HTTP_DESC= HTTP/HTTPS support HTTP2_DESC= HTTP/2 support (requires HTTP) HTTP2_IMPLIES= HTTP IMAP_DESC= IMAP/IMAPS support LDAPS_IMPLIES= LDAP LDAPS_DESC= LDAP protocol over SSL support (requires GNUTLS/OPENSSL/WOLFSSL) LIBSSH_DESC= SCP/SFTP support via libssh (requires OPENSSL) LIBSSH_IMPLIES= OPENSSL LIBSSH2_DESC= SCP/SFTP support via libssh2 (requires OPENSSL) LIBSSH2_IMPLIES=OPENSSL MQTT_DESC= MQTT support POP3_DESC= POP3/POP3S support PROXY_IMPLIES= HTTP RESOLV_DESC= DNS resolving options RTSP_IMPLIES= HTTP SMB_DESC= SMB/CIFS support SMTP_DESC= SMTP/SMTPS support THREADED_RESOLVER_DESC= Threaded DNS resolver TLS_SRP_DESC= TLS-SRP (Secure Remote Password) support WEBSOCKET_DESC= WebSocket support (experimental) ALTSVC_CONFIGURE_ENABLE=alt-svc BROTLI_CONFIGURE_WITH= brotli BROTLI_LIB_DEPENDS= libbrotlidec.so:archivers/brotli CARES_CONFIGURE_ENABLE= ares CARES_LIB_DEPENDS= libcares.so:dns/c-ares CARES_USES= pkgconfig COOKIES_CONFIGURE_ENABLE= cookies CURL_DEBUG_CONFIGURE_ENABLE= curldebug DEBUG_CONFIGURE_ENABLE= debug DICT_CONFIGURE_ENABLE= dict FTP_CONFIGURE_ENABLE= ftp GNUTLS_CONFIGURE_ON= --with-ca-fallback GNUTLS_CONFIGURE_WITH= gnutls GNUTLS_LIB_DEPENDS= libgnutls.so:security/gnutls \ libnettle.so:security/nettle GOPHER_CONFIGURE_ENABLE=gopher GSSAPI_BASE_CONFIGURE_ON= --with-gssapi=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS} GSSAPI_BASE_CPPFLAGS= ${GSSAPICPPFLAGS} GSSAPI_BASE_LDFLAGS= ${GSSAPILDFLAGS} GSSAPI_BASE_LIBS= ${GSSAPILIBS} GSSAPI_BASE_USES= gssapi GSSAPI_HEIMDAL_CONFIGURE_ON= --with-gssapi=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS} GSSAPI_HEIMDAL_CPPFLAGS=${GSSAPICPPFLAGS} GSSAPI_HEIMDAL_LDFLAGS= ${GSSAPILDFLAGS} GSSAPI_HEIMDAL_LIBS= ${GSSAPILIBS} GSSAPI_HEIMDAL_USES= gssapi:heimdal GSSAPI_MIT_CONFIGURE_ON=--with-gssapi=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS} GSSAPI_MIT_CPPFLAGS= ${GSSAPICPPFLAGS} GSSAPI_MIT_LDFLAGS= ${GSSAPILDFLAGS} GSSAPI_MIT_LIBS= ${GSSAPILIBS} GSSAPI_MIT_USES= gssapi:mit GSSAPI_NONE_CONFIGURE_ON= --without-gssapi HTTP_CONFIGURE_ENABLE= http HTTP2_CONFIGURE_WITH= nghttp2 HTTP2_LIB_DEPENDS= libnghttp2.so:www/libnghttp2 HTTP2_USES= pkgconfig IDN_CONFIGURE_WITH= libidn2 IDN_LIB_DEPENDS= libidn2.so:dns/libidn2 IMAP_CONFIGURE_ENABLE= imap IPV6_CONFIGURE_ENABLE= ipv6 LDAP_CONFIGURE_ENABLE= ldap LDAP_USES= ldap LDAPS_CONFIGURE_ENABLE= ldaps LIBSSH_CONFIGURE_WITH= libssh LIBSSH_LIB_DEPENDS= libssh.so:security/libssh LIBSSH2_CONFIGURE_WITH= libssh2 LIBSSH2_LIB_DEPENDS= libssh2.so:security/libssh2 MQTT_CONFIGURE_ENABLE= mqtt NTLM_CONFIGURE_ENABLE= ntlm OPENSSL_CONFIGURE_ON= --with-ca-fallback OPENSSL_CONFIGURE_WITH= openssl=${OPENSSLBASE} OPENSSL_CPPFLAGS= -I${OPENSSLINC} OPENSSL_LDFLAGS= -L${OPENSSLLIB} OPENSSL_USES= ssl POP3_CONFIGURE_ENABLE= pop3 PROXY_CONFIGURE_ENABLE= proxy PSL_CONFIGURE_WITH= libpsl PSL_LIB_DEPENDS= libpsl.so:dns/libpsl RTSP_CONFIGURE_ENABLE= rtsp SMB_CONFIGURE_ENABLE= smb SMTP_CONFIGURE_ENABLE= smtp STATIC_CONFIGURE_ENABLE=static TELNET_CONFIGURE_ENABLE=telnet TFTP_CONFIGURE_ENABLE= tftp THREADED_RESOLVER_CONFIGURE_ENABLE= pthreads threaded-resolver TLS_SRP_CONFIGURE_ENABLE= tls-srp WEBSOCKET_CONFIGURE_ENABLE= websockets WOLFSSL_CONFIGURE_WITH= wolfssl WOLFSSL_LIB_DEPENDS= libwolfssl.so:security/wolfssl ZSTD_CONFIGURE_WITH= zstd ZSTD_LIB_DEPENDS= libzstd.so:archivers/zstd .include .if ((!${PORT_OPTIONS:MGNUTLS} && !${PORT_OPTIONS:MOPENSSL}) || (${PORT_OPTIONS:MOPENSSL} && ${SSL_DEFAULT:Mlibressl*})) && ${PORT_OPTIONS:MTLS_SRP} IGNORE= only supports TLS-SRP with either OpenSSL or GnuTLS .endif .if ${PORT_OPTIONS:MLDAPS} && !${PORT_OPTIONS:MGNUTLS} && !${PORT_OPTIONS:MOPENSSL} && !${PORT_OPTIONS:MWOLFSSL} IGNORE= only supports LDAPS with GNUTLS/OPENSSL/WOLFSSL enabled .endif post-install: ${INSTALL_DATA} ${WRKSRC}/docs/libcurl/libcurl.m4 ${STAGEDIR}${PREFIX}/share/aclocal/ post-install-DOCS-on: ${MKDIR} ${STAGEDIR}${DOCSDIR}/ ${STAGEDIR}${DOCSDIR}/internals/ ${STAGEDIR}${DOCSDIR}/libcurl/ cd ${WRKSRC}/docs/ && ${INSTALL_DATA} FAQ INSTALL KNOWN_BUGS THANKS TODO options-in-versions *.md ${STAGEDIR}${DOCSDIR}/ ${INSTALL_DATA} ${WRKSRC}/docs/internals/*.md ${STAGEDIR}${DOCSDIR}/internals/ cd ${WRKSRC}/docs/libcurl/ && ${INSTALL_DATA} ABI.md libcurl.m4 *.pl symbols-in-versions ${STAGEDIR}${DOCSDIR}/libcurl/ post-install-EXAMPLES-on: ${MKDIR} ${STAGEDIR}${EXAMPLESDIR}/ cd ${WRKSRC}/docs/examples/ && ${INSTALL_DATA} Makefile.example Makefile.mk README.md *.c *.cpp ${STAGEDIR}${EXAMPLESDIR}/ .include diff --git a/ftp/curl/files/patch-git-01-70d3a9b6aa69ffdd9435e168463cfabd21e17cd1 b/ftp/curl/files/patch-git-01-70d3a9b6aa69ffdd9435e168463cfabd21e17cd1 new file mode 100644 index 000000000000..aab6f77b6221 --- /dev/null +++ b/ftp/curl/files/patch-git-01-70d3a9b6aa69ffdd9435e168463cfabd21e17cd1 @@ -0,0 +1,124 @@ +From 70d3a9b6aa69ffdd9435e168463cfabd21e17cd1 Mon Sep 17 00:00:00 2001 +From: Stefan Eissing +Date: Thu, 12 Sep 2024 10:03:33 +0200 +Subject: [PATCH] http2: when uploading data from stdin, fix eos forwarding + +When uploading data from stdin ('-T -'), and the EOS was only detected +on a 0-length read, the EOS was not forwarded to the filters. This led +HTTP/2 to hang on not forwarding this to the server. + +Added test_07_14 to reproduce and verify. + +Fixes #14870 +Reported-by: nekopsykose on github +Closes #14877 +--- + lib/http2.c | 9 ++++----- + lib/request.c | 35 +++++++++++++++++++++++----------- + lib/request.h | 1 + + lib/transfer.c | 4 ++-- + tests/http/test_07_upload.py | 37 ++++++++++++++++++++++++++++++++++++ + 5 files changed, 68 insertions(+), 18 deletions(-) + +diff --git a/lib/http2.c b/lib/http2.c +index bc50a2f7a7fe43..df3e6f0df38fbf 100644 +--- lib/http2.c ++++ lib/http2.c +@@ -1679,12 +1679,11 @@ static ssize_t req_body_read_callback(nghttp2_session *session, + CURL_TRC_CF(data_s, cf, "[%d] req_body_read(len=%zu) eos=%d -> %zd, %d", + stream_id, length, stream->body_eos, nread, result); + +- if(nread == 0) +- return NGHTTP2_ERR_DEFERRED; +- if(stream->body_eos && Curl_bufq_is_empty(&stream->sendbuf)) ++ if(stream->body_eos && Curl_bufq_is_empty(&stream->sendbuf)) { + *data_flags = NGHTTP2_DATA_FLAG_EOF; +- +- return nread; ++ return nread; ++ } ++ return (nread == 0)? NGHTTP2_ERR_DEFERRED : nread; + } + + #if !defined(CURL_DISABLE_VERBOSE_STRINGS) +diff --git a/lib/request.c b/lib/request.c +index fb75e5577cdbb2..6b2784c3ff08e6 100644 +--- lib/request.c ++++ lib/request.c +@@ -214,15 +214,19 @@ static CURLcode xfer_send(struct Curl_easy *data, + eos = TRUE; + } + result = Curl_xfer_send(data, buf, blen, eos, pnwritten); +- if(!result && *pnwritten) { +- if(hds_len) +- Curl_debug(data, CURLINFO_HEADER_OUT, (char *)buf, +- CURLMIN(hds_len, *pnwritten)); +- if(*pnwritten > hds_len) { +- size_t body_len = *pnwritten - hds_len; +- Curl_debug(data, CURLINFO_DATA_OUT, (char *)buf + hds_len, body_len); +- data->req.writebytecount += body_len; +- Curl_pgrsSetUploadCounter(data, data->req.writebytecount); ++ if(!result) { ++ if(eos && (blen == *pnwritten)) ++ data->req.eos_sent = TRUE; ++ if(*pnwritten) { ++ if(hds_len) ++ Curl_debug(data, CURLINFO_HEADER_OUT, (char *)buf, ++ CURLMIN(hds_len, *pnwritten)); ++ if(*pnwritten > hds_len) { ++ size_t body_len = *pnwritten - hds_len; ++ Curl_debug(data, CURLINFO_DATA_OUT, (char *)buf + hds_len, body_len); ++ data->req.writebytecount += body_len; ++ Curl_pgrsSetUploadCounter(data, data->req.writebytecount); ++ } + } + } + return result; +@@ -304,8 +308,17 @@ static CURLcode req_flush(struct Curl_easy *data) + return Curl_xfer_flush(data); + } + +- if(!data->req.upload_done && data->req.eos_read && +- Curl_bufq_is_empty(&data->req.sendbuf)) { ++ if(data->req.eos_read && !data->req.eos_sent) { ++ char tmp; ++ size_t nwritten; ++ result = xfer_send(data, &tmp, 0, 0, &nwritten); ++ if(result) ++ return result; ++ DEBUGASSERT(data->req.eos_sent); ++ } ++ ++ if(!data->req.upload_done && data->req.eos_read && data->req.eos_sent) { ++ DEBUGASSERT(Curl_bufq_is_empty(&data->req.sendbuf)); + if(data->req.shutdown) { + bool done; + result = Curl_xfer_send_shutdown(data, &done); +diff --git a/lib/request.h b/lib/request.h +index fb3f9f116815cd..c53c3eb5ae7e7f 100644 +--- lib/request.h ++++ lib/request.h +@@ -130,6 +130,7 @@ struct SingleRequest { + BIT(download_done); /* set to TRUE when download is complete */ + BIT(eos_written); /* iff EOS has been written to client */ + BIT(eos_read); /* iff EOS has been read from the client */ ++ BIT(eos_sent); /* iff EOS has been sent to the server */ + BIT(rewind_read); /* iff reader needs rewind at next start */ + BIT(upload_done); /* set to TRUE when all request data has been sent */ + BIT(upload_aborted); /* set to TRUE when upload was aborted. Will also +diff --git a/lib/transfer.c b/lib/transfer.c +index 0f42b3f2b4ddd6..ab8fd724314e4e 100644 +--- lib/transfer.c ++++ lib/transfer.c +@@ -1253,8 +1253,8 @@ CURLcode Curl_xfer_send(struct Curl_easy *data, + else if(!result && *pnwritten) + data->info.request_size += *pnwritten; + +- DEBUGF(infof(data, "Curl_xfer_send(len=%zu) -> %d, %zu", +- blen, result, *pnwritten)); ++ DEBUGF(infof(data, "Curl_xfer_send(len=%zu, eos=%d) -> %d, %zu", ++ blen, eos, result, *pnwritten)); + return result; + } + + diff --git a/ftp/curl/files/patch-git-02-bef0acaf212a71c782e0b8e8e6c772cc46040356 b/ftp/curl/files/patch-git-02-bef0acaf212a71c782e0b8e8e6c772cc46040356 new file mode 100644 index 000000000000..ed3a5a0958bd --- /dev/null +++ b/ftp/curl/files/patch-git-02-bef0acaf212a71c782e0b8e8e6c772cc46040356 @@ -0,0 +1,48 @@ +From bef0acaf212a71c782e0b8e8e6c772cc46040356 Mon Sep 17 00:00:00 2001 +From: Stefan Eissing +Date: Fri, 13 Sep 2024 09:58:16 +0200 +Subject: [PATCH] request: correctly reset the eos_sent flag + +Add test cases + +Bug: https://marc.info/?l=git&m=172620452502747&w=2 +Reported-by: Patrick Steinhardt +Closes #14895 +--- + lib/request.c | 5 + + tests/http/clients/.gitignore | 3 +- + tests/http/clients/Makefile.inc | 3 +- + .../clients/{h2-download.c => hx-download.c} | 0 + tests/http/clients/hx-upload.c | 568 ++++++++++++++++++ + tests/http/test_02_download.py | 12 +- + tests/http/test_07_upload.py | 61 ++ + tests/http/test_19_shutdown.py | 2 +- + 8 files changed, 645 insertions(+), 9 deletions(-) + rename tests/http/clients/{h2-download.c => hx-download.c} (100%) + create mode 100644 tests/http/clients/hx-upload.c + +diff --git a/lib/request.c b/lib/request.c +index 6b2784c3ff08e6..1ddbdc9d0f1680 100644 +--- lib/request.c ++++ lib/request.c +@@ -52,7 +52,11 @@ CURLcode Curl_req_soft_reset(struct SingleRequest *req, + + req->done = FALSE; + req->upload_done = FALSE; ++ req->upload_aborted = FALSE; + req->download_done = FALSE; ++ req->eos_written = FALSE; ++ req->eos_read = FALSE; ++ req->eos_sent = FALSE; + req->ignorebody = FALSE; + req->shutdown = FALSE; + req->bytecount = 0; +@@ -146,6 +150,7 @@ void Curl_req_hard_reset(struct SingleRequest *req, struct Curl_easy *data) + req->download_done = FALSE; + req->eos_written = FALSE; + req->eos_read = FALSE; ++ req->eos_sent = FALSE; + req->upload_done = FALSE; + req->upload_aborted = FALSE; + req->ignorebody = FALSE; +