mirror of
https://git.FreeBSD.org/ports.git
synced 2024-11-18 00:10:04 +00:00
ftp/curl: Fix HTTP2
Partially backport upstream commits 70d3a9b6aa69ffdd9435e168463cfabd21e17cd1 and bef0acaf212a71c782e0b8e8e6c772cc46040356 References: https://github.com/curl/curl/issues/1492370d3a9b6aa
bef0acaf21
Approved by: portmgr (blanket, runtime fix)
This commit is contained in:
parent
3a0287b8a0
commit
0b731dee23
@ -1,5 +1,6 @@
|
||||
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}/
|
||||
|
@ -0,0 +1,124 @@
|
||||
From 70d3a9b6aa69ffdd9435e168463cfabd21e17cd1 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Eissing <stefan@eissing.org>
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,48 @@
|
||||
From bef0acaf212a71c782e0b8e8e6c772cc46040356 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Eissing <stefan@eissing.org>
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user