[arch-commits] Commit in curl/trunk (2 files)

Jan Steffens heftig at archlinux.org
Sat Feb 16 14:21:03 UTC 2019


    Date: Saturday, February 16, 2019 @ 14:21:02
  Author: heftig
Revision: 346362

7.64.0-6: Follow-up fix for bad patch

Added:
  curl/trunk/0001-connection_check-restore-original-conn-data-after-th.patch
Modified:
  curl/trunk/PKGBUILD

-----------------------------------------------------------------+
 0001-connection_check-restore-original-conn-data-after-th.patch |   77 ++++++++++
 PKGBUILD                                                        |    5 
 2 files changed, 81 insertions(+), 1 deletion(-)

Added: 0001-connection_check-restore-original-conn-data-after-th.patch
===================================================================
--- 0001-connection_check-restore-original-conn-data-after-th.patch	                        (rev 0)
+++ 0001-connection_check-restore-original-conn-data-after-th.patch	2019-02-16 14:21:02 UTC (rev 346362)
@@ -0,0 +1,77 @@
+From 4015fae044ce52a639c9358e22a9e948f287c89f Mon Sep 17 00:00:00 2001
+Message-Id: <4015fae044ce52a639c9358e22a9e948f287c89f.1550326608.git.jan.steffens at gmail.com>
+From: Jay Satiro <raysatiro at yahoo.com>
+Date: Mon, 11 Feb 2019 23:00:00 -0500
+Subject: [PATCH] connection_check: restore original conn->data after the check
+
+- Save the original conn->data before it's changed to the specified
+  data transfer for the connection check and then restore it afterwards.
+
+This is a follow-up to 38d8e1b 2019-02-11.
+
+History:
+
+It was discovered a month ago that before checking whether to extract a
+dead connection that that connection should be associated with a "live"
+transfer for the check (ie original conn->data ignored and set to the
+passed in data). A fix was landed in 54b201b which did that and also
+cleared conn->data after the check. The original conn->data was not
+restored, so presumably it was thought that a valid conn->data was no
+longer needed.
+
+Several days later it was discovered that a valid conn->data was needed
+after the check and follow-up fix was landed in bbae24c which partially
+reverted the original fix and attempted to limit the scope of when
+conn->data was changed to only when pruning dead connections. In that
+case conn->data was not cleared and the original conn->data not
+restored.
+
+A month later it was discovered that the original fix was somewhat
+correct; a "live" transfer is needed for the check in all cases
+because original conn->data could be null which could cause a bad deref
+at arbitrary points in the check. A fix was landed in 38d8e1b which
+expanded the scope to all cases. conn->data was not cleared and the
+original conn->data not restored.
+
+A day later it was discovered that not restoring the original conn->data
+may lead to busy loops in applications that use the event interface, and
+given this observation it's a pretty safe assumption that there is some
+code path that still needs the original conn->data. This commit is the
+follow-up fix for that, it restores the original conn->data after the
+connection check.
+
+Assisted-by: tholin at users.noreply.github.com
+Reported-by: tholin at users.noreply.github.com
+
+Fixes https://github.com/curl/curl/issues/3542
+Closes #3559
+---
+ lib/url.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/lib/url.c b/lib/url.c
+index bc47685db..46c8fb5fb 100644
+--- a/lib/url.c
++++ b/lib/url.c
+@@ -964,8 +964,10 @@ static bool extract_if_dead(struct connectdata *conn,
+       /* The protocol has a special method for checking the state of the
+          connection. Use it to check if the connection is dead. */
+       unsigned int state;
++      struct Curl_easy *olddata = conn->data;
+       conn->data = data; /* use this transfer for now */
+       state = conn->handler->connection_check(conn, CONNCHECK_ISDEAD);
++      conn->data = olddata;
+       dead = (state & CONNRESULT_DEAD);
+     }
+     else {
+@@ -994,7 +996,6 @@ struct prunedead {
+ static int call_extract_if_dead(struct connectdata *conn, void *param)
+ {
+   struct prunedead *p = (struct prunedead *)param;
+-  conn->data = p->data; /* transfer to use for this check */
+   if(extract_if_dead(conn, p->data)) {
+     /* stop the iteration here, pass back the connection that was extracted */
+     p->extracted = conn;
+-- 
+2.20.1
+

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2019-02-16 11:57:48 UTC (rev 346361)
+++ PKGBUILD	2019-02-16 14:21:02 UTC (rev 346362)
@@ -6,7 +6,7 @@
 
 pkgname=curl
 pkgver=7.64.0
-pkgrel=5
+pkgrel=6
 pkgdesc="An URL retrieval utility and library"
 arch=('x86_64')
 url="https://curl.haxx.se"
@@ -17,10 +17,12 @@
 options=('strip' 'debug')
 source=("https://curl.haxx.se/download/$pkgname-$pkgver.tar.gz"{,.asc}
         "0001-connection_check-set-data-to-the-transfer-doing-the-.patch"
+        "0001-connection_check-restore-original-conn-data-after-th.patch"
         "0001-multi-remove-verbose-Expire-in-messages.patch")
 sha512sums=('ea0e68f9cbf2eb4f235d8506962dcc7709f769ef3526c0e4c130fdaf7186a1a13b303c6ce919cb9125bbf7c64ddf4f8efb3d9269b906f856e6d7b3def027fb81'
             'SKIP'
             'e9fdd70ec6798f48080582e4cb554fc4cd247075c293c66dcf8b27cab151def1c709c306e4dc8a1439b9843f31fe51248b5d6c7f5183e4af65819a084fddcb1f'
+            'adcbf6309e5d69ede876966790dd504da3097a9e03fedf77d44e10fddcb24a5eaa29b4c9229c813d54bd0c2141211e46b50ca58d89608f7c391434e469316cbd'
             'f09b63c36bd958c35bf6e3885efe46fea75fa2780510cac66220bfc1d771de9040560586e0672dac5eb7db7acf67051cf74e56518a8ada6f691c6d8f9dc84fa4')
 validpgpkeys=('27EDEAF22F3ABCEB50DB9A125CC908FDB71E12C2') # Daniel Stenberg
 
@@ -32,6 +34,7 @@
   # Crash in cargo:
   # https://github.com/curl/curl/issues/3541
   patch -Np1 < ../0001-connection_check-set-data-to-the-transfer-doing-the-.patch
+  patch -Np1 < ../0001-connection_check-restore-original-conn-data-after-th.patch
 }
 
 build() {



More information about the arch-commits mailing list