multi_done: if multiplexed, make conn->data point to another transfer
authorSeonah Moon <seonah1.moon@samsung.com>
Fri, 25 Sep 2020 08:04:59 +0000 (17:04 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Fri, 25 Sep 2020 08:05:01 +0000 (17:05 +0900)
... since the current transfer is being killed. Setting to NULL is
wrong, leaving it pointing to 'data' is wrong since that handle might be
about to get freed.

Fixes #4845
Closes #4858
Reported-by: dmitrmax on github
Change-Id: Ic03d65132e8116b0423d8b6715207d2dd04c7c5b

lib/multi.c
lib/url.c

index 6d819b4..3a393a1 100644 (file)
@@ -590,6 +590,9 @@ static CURLcode multi_done(struct Curl_easy *data,
   detach_connnection(data);
   if(CONN_INUSE(conn)) {
     /* Stop if still used. */
+    /* conn->data must not remain pointing to this transfer since it is going
+       away! Find another to own it! */
+    conn->data = conn->easyq.head->ptr;
     CONN_UNLOCK(data);
     DEBUGF(infof(data, "Connection still in use %zu, "
                  "no more multi_done now!\n",
index a228a14..ff90739 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -1192,6 +1192,8 @@ ConnectionExists(struct Curl_easy *data,
         }
       }
 
+      DEBUGASSERT(!check->data || GOOD_EASY_HANDLE(check->data));
+
       if(!canmultiplex && check->data)
         /* this request can't be multiplexed but the checked connection is
            already in use so we skip it */