[arch-commits] Commit in curl/trunk (4 files)
Evangelos Foutras
foutrelis at gemini.archlinux.org
Fri Apr 1 13:53:51 UTC 2022
Date: Friday, April 1, 2022 @ 13:53:50
Author: foutrelis
Revision: 441087
upgpkg: curl 7.82.0-2: simulated 304 http2 fixes (FS#74202)
Added:
curl/trunk/0001-http2-handle-DONE-called-for-the-paused-stream.patch
curl/trunk/0002-http-close-the-stream-not-connection-on-time-conditi.patch
curl/trunk/0003-http2-RST-the-stream-if-we-stop-it-on-our-own-will.patch
Modified:
curl/trunk/PKGBUILD
-----------------------------------------------------------------+
0001-http2-handle-DONE-called-for-the-paused-stream.patch | 34 +++++
0002-http-close-the-stream-not-connection-on-time-conditi.patch | 24 +++
0003-http2-RST-the-stream-if-we-stop-it-on-our-own-will.patch | 62 ++++++++++
PKGBUILD | 20 ++-
4 files changed, 137 insertions(+), 3 deletions(-)
Added: 0001-http2-handle-DONE-called-for-the-paused-stream.patch
===================================================================
--- 0001-http2-handle-DONE-called-for-the-paused-stream.patch (rev 0)
+++ 0001-http2-handle-DONE-called-for-the-paused-stream.patch 2022-04-01 13:53:50 UTC (rev 441087)
@@ -0,0 +1,34 @@
+From b5a9680577925a65477a666174a8e021ab418693 Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg <daniel at haxx.se>
+Date: Fri, 1 Apr 2022 13:22:58 +0200
+Subject: [PATCH 1/3] http2: handle DONE called for the paused stream
+
+As it could otherwise stall all streams on the connection
+
+Reported-by: Evangelos Foutras
+Fixes #8626
+Closes #8664
+---
+ lib/http2.c | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+diff --git a/lib/http2.c b/lib/http2.c
+index 82a993930..34daaf17c 100644
+--- a/lib/http2.c
++++ b/lib/http2.c
+@@ -1240,11 +1240,10 @@ void Curl_http2_done(struct Curl_easy *data, bool premature)
+ if(!nghttp2_submit_rst_stream(httpc->h2, NGHTTP2_FLAG_NONE,
+ http->stream_id, NGHTTP2_STREAM_CLOSED))
+ (void)nghttp2_session_send(httpc->h2);
+-
+- if(http->stream_id == httpc->pause_stream_id) {
+- H2BUGF(infof(data, "stopped the pause stream!"));
+- httpc->pause_stream_id = 0;
+- }
++ }
++ if(http->stream_id == httpc->pause_stream_id) {
++ H2BUGF(infof(data, "DONE the pause stream!"));
++ httpc->pause_stream_id = 0;
+ }
+
+ if(data->state.drain)
Added: 0002-http-close-the-stream-not-connection-on-time-conditi.patch
===================================================================
--- 0002-http-close-the-stream-not-connection-on-time-conditi.patch (rev 0)
+++ 0002-http-close-the-stream-not-connection-on-time-conditi.patch 2022-04-01 13:53:50 UTC (rev 441087)
@@ -0,0 +1,24 @@
+From 3fa634a33742c1c585a7d43e354cc227423ffb29 Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg <daniel at haxx.se>
+Date: Fri, 1 Apr 2022 13:22:58 +0200
+Subject: [PATCH 2/3] http: close the stream (not connection) on time condition
+ abort
+
+Closes #8664
+---
+ lib/http.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/http.c b/lib/http.c
+index 6445f98f8..63cc748e8 100644
+--- a/lib/http.c
++++ b/lib/http.c
+@@ -2955,7 +2955,7 @@ CURLcode Curl_http_firstwrite(struct Curl_easy *data,
+ infof(data, "Simulate a HTTP 304 response!");
+ /* we abort the transfer before it is completed == we ruin the
+ re-use ability. Close the connection */
+- connclose(conn, "Simulated 304 handling");
++ streamclose(conn, "Simulated 304 handling");
+ return CURLE_OK;
+ }
+ } /* we have a time condition */
Added: 0003-http2-RST-the-stream-if-we-stop-it-on-our-own-will.patch
===================================================================
--- 0003-http2-RST-the-stream-if-we-stop-it-on-our-own-will.patch (rev 0)
+++ 0003-http2-RST-the-stream-if-we-stop-it-on-our-own-will.patch 2022-04-01 13:53:50 UTC (rev 441087)
@@ -0,0 +1,62 @@
+From fda4b81635672568efc716889d79e446bccc90ed Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg <daniel at haxx.se>
+Date: Fri, 1 Apr 2022 13:23:04 +0200
+Subject: [PATCH 3/3] http2: RST the stream if we stop it on our own will
+
+For the "simulated 304" case the done-call isn't considered "premature"
+but since the server didn't close the stream it needs to be reset to
+stop delivering data.
+
+Closes #8664
+---
+ lib/http2.c | 24 +++++++++++++++---------
+ 1 file changed, 15 insertions(+), 9 deletions(-)
+
+diff --git a/lib/http2.c b/lib/http2.c
+index 34daaf17c..34031f17c 100644
+--- a/lib/http2.c
++++ b/lib/http2.c
+@@ -825,10 +825,14 @@ static int on_data_chunk_recv(nghttp2_session *session, uint8_t flags,
+
+ /* get the stream from the hash based on Stream ID */
+ data_s = nghttp2_session_get_stream_user_data(session, stream_id);
+- if(!data_s)
+- /* Receiving a Stream ID not in the hash should not happen, this is an
+- internal error more than anything else! */
+- return NGHTTP2_ERR_CALLBACK_FAILURE;
++ if(!data_s) {
++ /* Receiving a Stream ID not in the hash should not happen - unless
++ we have aborted a transfer artificially and there were more data
++ in the pipeline. Silently ignore. */
++ H2BUGF(fprintf(stderr, "Data for stream %u but it doesn't exist\n",
++ stream_id));
++ return 0;
++ }
+
+ stream = data_s->req.p.http;
+ if(!stream)
+@@ -1234,17 +1238,19 @@ void Curl_http2_done(struct Curl_easy *data, bool premature)
+ !httpc->h2) /* not HTTP/2 ? */
+ return;
+
+- if(premature) {
++ /* do this before the reset handling, as that might clear ->stream_id */
++ if(http->stream_id == httpc->pause_stream_id) {
++ H2BUGF(infof(data, "DONE the pause stream (%x)", http->stream_id));
++ httpc->pause_stream_id = 0;
++ }
++ if(premature || (!http->closed && http->stream_id)) {
+ /* RST_STREAM */
+ set_transfer(httpc, data); /* set the transfer */
++ H2BUGF(infof(data, "RST stream %x", http->stream_id));
+ if(!nghttp2_submit_rst_stream(httpc->h2, NGHTTP2_FLAG_NONE,
+ http->stream_id, NGHTTP2_STREAM_CLOSED))
+ (void)nghttp2_session_send(httpc->h2);
+ }
+- if(http->stream_id == httpc->pause_stream_id) {
+- H2BUGF(infof(data, "DONE the pause stream!"));
+- httpc->pause_stream_id = 0;
+- }
+
+ if(data->state.drain)
+ drained_transfer(data, httpc);
Modified: PKGBUILD
===================================================================
--- PKGBUILD 2022-04-01 12:09:43 UTC (rev 441086)
+++ PKGBUILD 2022-04-01 13:53:50 UTC (rev 441087)
@@ -7,7 +7,7 @@
pkgbase=curl
pkgname=(curl libcurl-compat libcurl-gnutls)
pkgver=7.82.0
-pkgrel=1
+pkgrel=2
pkgdesc='An URL retrieval utility and library'
arch=('x86_64')
url='https://curl.haxx.se'
@@ -17,9 +17,15 @@
'libidn2' 'libidn2.so' 'libnghttp2' 'libpsl' 'libpsl.so' 'libssh2' 'libssh2.so'
'openssl' 'zlib' 'zstd' 'libzstd.so')
provides=('libcurl.so')
-source=("https://curl.haxx.se/download/${pkgname}-${pkgver}.tar.gz"{,.asc})
+source=("https://curl.haxx.se/download/${pkgname}-${pkgver}.tar.gz"{,.asc}
+ 0001-http2-handle-DONE-called-for-the-paused-stream.patch
+ 0002-http-close-the-stream-not-connection-on-time-conditi.patch
+ 0003-http2-RST-the-stream-if-we-stop-it-on-our-own-will.patch)
sha512sums=('d4c4a785876e0d1ba1c1adbe65528d56a8b81fc03ff724e87819cfe51aca60f8a7bf2ac9384f30c3a6bbd28669b2bd3e9a6794737243c836c4902d085a72c474'
- 'SKIP')
+ 'SKIP'
+ '0d883c3fc267c4c5d82078e03689db31f83292cb41f3f6fab26d05fa9cbaa77ae75cfd3bbb4f6953bbc4bc9760c54b49bdfdae219cd48af92312abbb1ba70ec6'
+ '422df75880b107a5c457d25ca1488166f5e61cc2876ad0193a742ad6cf4cae5363b0c7bd00cbaf9f49a5e5d503159cb2d2fd3d602abf3935dc3f77f14e9027dc'
+ '394f27e8721c23b82924064df8f72aa33f6e5064d0a3798a59543fd7d9660939437f1a6f45f03370d517edf5d4a218a9d41b4d62e7498d4f520f026da68007b1')
validpgpkeys=('27EDEAF22F3ABCEB50DB9A125CC908FDB71E12C2') # Daniel Stenberg
_configure_options=(
@@ -37,6 +43,14 @@
--with-ca-bundle='/etc/ssl/certs/ca-certificates.crt'
)
+prepare() {
+ cd "${srcdir}/${pkgbase}-${pkgver}"
+ # https://github.com/curl/curl/issues/8626
+ patch -Np1 -i ../0001-http2-handle-DONE-called-for-the-paused-stream.patch
+ patch -Np1 -i ../0002-http-close-the-stream-not-connection-on-time-conditi.patch
+ patch -Np1 -i ../0003-http2-RST-the-stream-if-we-stop-it-on-our-own-will.patch
+}
+
build() {
mkdir build-curl{,-compat,-gnutls}
More information about the arch-commits
mailing list