Date: Friday, April 1, 2022 @ 13:53:56 Author: foutrelis Revision: 441088
archrelease: copy trunk to testing-x86_64 Added: curl/repos/testing-x86_64/ curl/repos/testing-x86_64/0001-http2-handle-DONE-called-for-the-paused-stream.patch (from rev 441087, curl/trunk/0001-http2-handle-DONE-called-for-the-paused-stream.patch) curl/repos/testing-x86_64/0002-http-close-the-stream-not-connection-on-time-conditi.patch (from rev 441087, curl/trunk/0002-http-close-the-stream-not-connection-on-time-conditi.patch) curl/repos/testing-x86_64/0003-http2-RST-the-stream-if-we-stop-it-on-our-own-will.patch (from rev 441087, curl/trunk/0003-http2-RST-the-stream-if-we-stop-it-on-our-own-will.patch) curl/repos/testing-x86_64/PKGBUILD (from rev 441087, 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 | 133 ++++++++++ 4 files changed, 253 insertions(+) Copied: curl/repos/testing-x86_64/0001-http2-handle-DONE-called-for-the-paused-stream.patch (from rev 441087, curl/trunk/0001-http2-handle-DONE-called-for-the-paused-stream.patch) =================================================================== --- testing-x86_64/0001-http2-handle-DONE-called-for-the-paused-stream.patch (rev 0) +++ testing-x86_64/0001-http2-handle-DONE-called-for-the-paused-stream.patch 2022-04-01 13:53:56 UTC (rev 441088) @@ -0,0 +1,34 @@ +From b5a9680577925a65477a666174a8e021ab418693 Mon Sep 17 00:00:00 2001 +From: Daniel Stenberg <dan...@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) Copied: curl/repos/testing-x86_64/0002-http-close-the-stream-not-connection-on-time-conditi.patch (from rev 441087, curl/trunk/0002-http-close-the-stream-not-connection-on-time-conditi.patch) =================================================================== --- testing-x86_64/0002-http-close-the-stream-not-connection-on-time-conditi.patch (rev 0) +++ testing-x86_64/0002-http-close-the-stream-not-connection-on-time-conditi.patch 2022-04-01 13:53:56 UTC (rev 441088) @@ -0,0 +1,24 @@ +From 3fa634a33742c1c585a7d43e354cc227423ffb29 Mon Sep 17 00:00:00 2001 +From: Daniel Stenberg <dan...@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 */ Copied: curl/repos/testing-x86_64/0003-http2-RST-the-stream-if-we-stop-it-on-our-own-will.patch (from rev 441087, curl/trunk/0003-http2-RST-the-stream-if-we-stop-it-on-our-own-will.patch) =================================================================== --- testing-x86_64/0003-http2-RST-the-stream-if-we-stop-it-on-our-own-will.patch (rev 0) +++ testing-x86_64/0003-http2-RST-the-stream-if-we-stop-it-on-our-own-will.patch 2022-04-01 13:53:56 UTC (rev 441088) @@ -0,0 +1,62 @@ +From fda4b81635672568efc716889d79e446bccc90ed Mon Sep 17 00:00:00 2001 +From: Daniel Stenberg <dan...@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); Copied: curl/repos/testing-x86_64/PKGBUILD (from rev 441087, curl/trunk/PKGBUILD) =================================================================== --- testing-x86_64/PKGBUILD (rev 0) +++ testing-x86_64/PKGBUILD 2022-04-01 13:53:56 UTC (rev 441088) @@ -0,0 +1,133 @@ +# Maintainer: Dave Reisner <dreis...@archlinux.org> +# Contributor: Angel Velasquez <an...@archlinux.org> +# Contributor: Eric Belanger <e...@archlinux.org> +# Contributor: Lucien Immink <l.imm...@student.fnt.hvu.nl> +# Contributor: Daniel J Griffiths <ghost1...@archlinux.us> + +pkgbase=curl +pkgname=(curl libcurl-compat libcurl-gnutls) +pkgver=7.82.0 +pkgrel=2 +pkgdesc='An URL retrieval utility and library' +arch=('x86_64') +url='https://curl.haxx.se' +license=('MIT') +options=('debug') +depends=('ca-certificates' 'brotli' 'libbrotlidec.so' 'krb5' 'libgssapi_krb5.so' + '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} + 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' + '0d883c3fc267c4c5d82078e03689db31f83292cb41f3f6fab26d05fa9cbaa77ae75cfd3bbb4f6953bbc4bc9760c54b49bdfdae219cd48af92312abbb1ba70ec6' + '422df75880b107a5c457d25ca1488166f5e61cc2876ad0193a742ad6cf4cae5363b0c7bd00cbaf9f49a5e5d503159cb2d2fd3d602abf3935dc3f77f14e9027dc' + '394f27e8721c23b82924064df8f72aa33f6e5064d0a3798a59543fd7d9660939437f1a6f45f03370d517edf5d4a218a9d41b4d62e7498d4f520f026da68007b1') +validpgpkeys=('27EDEAF22F3ABCEB50DB9A125CC908FDB71E12C2') # Daniel Stenberg + +_configure_options=( + --prefix='/usr' + --mandir='/usr/share/man' + --disable-ldap + --disable-ldaps + --disable-manual + --enable-ipv6 + --enable-threaded-resolver + --with-gssapi + --with-libssh2 + --with-openssl + --with-random='/dev/urandom' + --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} + + # build curl + cd "${srcdir}"/build-curl + + "${srcdir}/${pkgbase}-${pkgver}"/configure \ + "${_configure_options[@]}" \ + --enable-versioned-symbols + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + + # build libcurl-compat + cd "${srcdir}"/build-curl-compat + + "${srcdir}/${pkgbase}-${pkgver}"/configure \ + "${_configure_options[@]}" \ + --disable-versioned-symbols + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make -C lib + + # build libcurl-gnutls + cd "${srcdir}"/build-curl-gnutls + + "${srcdir}/${pkgbase}-${pkgver}"/configure \ + "${_configure_options[@]}" \ + --disable-versioned-symbols \ + --without-ssl \ + --with-gnutls='/usr' + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make -C lib +} + +package_curl() { + cd build-curl + + make DESTDIR="${pkgdir}" install + make DESTDIR="${pkgdir}" install -C scripts + + cd "${srcdir}/${pkgname}-${pkgver}" + + # license + install -Dt "${pkgdir}/usr/share/licenses/$pkgname" -m0644 COPYING +} + +package_libcurl-compat() { + pkgdesc='An URL retrieval library (without versioned symbols)' + depends=('curl' 'openssl') + + cd "${srcdir}"/build-curl-compat + + make -C lib DESTDIR="${pkgdir}" install + + mv "${pkgdir}"/usr/lib/libcurl{,-compat}.so.4.7.0 + rm "${pkgdir}"/usr/lib/libcurl.{a,so}* + for version in 3 4.0.0 4.1.0 4.2.0 4.3.0 4.4.0 4.5.0 4.6.0; do + ln -s libcurl-compat.so.4.7.0 "${pkgdir}"/usr/lib/libcurl.so.${version} + done + + install -dm 0755 "${pkgdir}"/usr/share/licenses + ln -s curl "${pkgdir}"/usr/share/licenses/libcurl-compat +} + +package_libcurl-gnutls() { + pkgdesc='An URL retrieval library (without versioned symbols and linked against gnutls)' + depends=('curl' 'gnutls') + + cd "${srcdir}"/build-curl-gnutls + + make -C lib DESTDIR="${pkgdir}" install + + mv "${pkgdir}"/usr/lib/libcurl{,-gnutls}.so.4.7.0 + rm "${pkgdir}"/usr/lib/libcurl.{a,so}* + for version in 3 4 4.0.0 4.1.0 4.2.0 4.3.0 4.4.0 4.5.0 4.6.0; do + ln -s libcurl-gnutls.so.4.7.0 "${pkgdir}"/usr/lib/libcurl-gnutls.so.${version} + done + + install -dm 0755 "${pkgdir}"/usr/share/licenses + ln -s curl "${pkgdir}"/usr/share/licenses/libcurl-gnutls +}