[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