Blame SOURCES/0022-curl-7.61.1-CVE-2020-8231.patch

6c1422
From 7a26092a9e21f1e0dc3cad69a580a7e2c7822ad0 Mon Sep 17 00:00:00 2001
6c1422
From: Daniel Stenberg <daniel@haxx.se>
6c1422
Date: Sun, 16 Aug 2020 11:34:35 +0200
6c1422
Subject: [PATCH] Curl_easy: remember last connection by id, not by pointer
6c1422
6c1422
CVE-2020-8231
6c1422
6c1422
Bug: https://curl.haxx.se/docs/CVE-2020-8231.html
6c1422
6c1422
Reported-by: Marc Aldorasi
6c1422
Closes #5824
6c1422
6c1422
Upstream-commit: 3c9e021f86872baae412a427e807fbfa2f3e8a22
6c1422
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
6c1422
---
6c1422
 lib/connect.c | 19 ++++++++++---------
6c1422
 lib/easy.c    |  3 +--
6c1422
 lib/multi.c   |  5 +++--
6c1422
 lib/url.c     |  2 +-
6c1422
 lib/urldata.h |  2 +-
6c1422
 5 files changed, 16 insertions(+), 15 deletions(-)
6c1422
6c1422
diff --git a/lib/connect.c b/lib/connect.c
6c1422
index 41f2202..f724646 100644
6c1422
--- a/lib/connect.c
6c1422
+++ b/lib/connect.c
6c1422
@@ -1214,15 +1214,15 @@ CURLcode Curl_connecthost(struct connectdata *conn,  /* context */
6c1422
 }
6c1422
 
6c1422
 struct connfind {
6c1422
-  struct connectdata *tofind;
6c1422
-  bool found;
6c1422
+  long id_tofind;
6c1422
+  struct connectdata *found;
6c1422
 };
6c1422
 
6c1422
 static int conn_is_conn(struct connectdata *conn, void *param)
6c1422
 {
6c1422
   struct connfind *f = (struct connfind *)param;
6c1422
-  if(conn == f->tofind) {
6c1422
-    f->found = TRUE;
6c1422
+  if(conn->connection_id == f->id_tofind) {
6c1422
+    f->found = conn;
6c1422
     return 1;
6c1422
   }
6c1422
   return 0;
6c1422
@@ -1244,21 +1244,22 @@ curl_socket_t Curl_getconnectinfo(struct Curl_easy *data,
6c1422
    * - that is associated with a multi handle, and whose connection
6c1422
    *   was detached with CURLOPT_CONNECT_ONLY
6c1422
    */
6c1422
-  if(data->state.lastconnect && (data->multi_easy || data->multi)) {
6c1422
-    struct connectdata *c = data->state.lastconnect;
6c1422
+  if((data->state.lastconnect_id != -1) && (data->multi_easy || data->multi)) {
6c1422
+    struct connectdata *c;
6c1422
     struct connfind find;
6c1422
-    find.tofind = data->state.lastconnect;
6c1422
-    find.found = FALSE;
6c1422
+    find.id_tofind = data->state.lastconnect_id;
6c1422
+    find.found = NULL;
6c1422
 
6c1422
     Curl_conncache_foreach(data, data->multi_easy?
6c1422
                            &data->multi_easy->conn_cache:
6c1422
                            &data->multi->conn_cache, &find, conn_is_conn);
6c1422
 
6c1422
     if(!find.found) {
6c1422
-      data->state.lastconnect = NULL;
6c1422
+      data->state.lastconnect_id = -1;
6c1422
       return CURL_SOCKET_BAD;
6c1422
     }
6c1422
 
6c1422
+    c = find.found;
6c1422
     if(connp) {
6c1422
       /* only store this if the caller cares for it */
6c1422
       *connp = c;
6c1422
diff --git a/lib/easy.c b/lib/easy.c
6c1422
index 027d0be..fe61cdd 100644
6c1422
--- a/lib/easy.c
6c1422
+++ b/lib/easy.c
6c1422
@@ -919,8 +919,7 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
6c1422
 
6c1422
   /* the connection cache is setup on demand */
6c1422
   outcurl->state.conn_cache = NULL;
6c1422
-
6c1422
-  outcurl->state.lastconnect = NULL;
6c1422
+  outcurl->state.lastconnect_id = -1;
6c1422
 
6c1422
   outcurl->progress.flags    = data->progress.flags;
6c1422
   outcurl->progress.callback = data->progress.callback;
6c1422
diff --git a/lib/multi.c b/lib/multi.c
6c1422
index 0caf943..0f57fd5 100644
6c1422
--- a/lib/multi.c
6c1422
+++ b/lib/multi.c
6c1422
@@ -427,6 +427,7 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
6c1422
     data->state.conn_cache = &data->share->conn_cache;
6c1422
   else
6c1422
     data->state.conn_cache = &multi->conn_cache;
6c1422
+  data->state.lastconnect_id = -1;
6c1422
 
6c1422
 #ifdef USE_LIBPSL
6c1422
   /* Do the same for PSL. */
6c1422
@@ -644,11 +645,11 @@ static CURLcode multi_done(struct connectdata **connp,
6c1422
     /* the connection is no longer in use by this transfer */
6c1422
     if(Curl_conncache_return_conn(conn)) {
6c1422
       /* remember the most recently used connection */
6c1422
-      data->state.lastconnect = conn;
6c1422
+      data->state.lastconnect_id = conn->connection_id;
6c1422
       infof(data, "%s\n", buffer);
6c1422
     }
6c1422
     else
6c1422
-      data->state.lastconnect = NULL;
6c1422
+      data->state.lastconnect_id = -1;
6c1422
   }
6c1422
 
6c1422
   *connp = NULL; /* to make the caller of this function better detect that
6c1422
diff --git a/lib/url.c b/lib/url.c
6c1422
index dcc6cc8..d65d17d 100644
6c1422
--- a/lib/url.c
6c1422
+++ b/lib/url.c
6c1422
@@ -592,7 +592,7 @@ CURLcode Curl_open(struct Curl_easy **curl)
6c1422
       Curl_initinfo(data);
6c1422
 
6c1422
       /* most recent connection is not yet defined */
6c1422
-      data->state.lastconnect = NULL;
6c1422
+      data->state.lastconnect_id = -1;
6c1422
 
6c1422
       data->progress.flags |= PGRS_HIDE;
6c1422
       data->state.current_speed = -1; /* init to negative == impossible */
6c1422
diff --git a/lib/urldata.h b/lib/urldata.h
6c1422
index 67db3b2..4b70cc5 100644
6c1422
--- a/lib/urldata.h
6c1422
+++ b/lib/urldata.h
6c1422
@@ -1219,7 +1219,7 @@ struct UrlState {
6c1422
   /* buffers to store authentication data in, as parsed from input options */
6c1422
   struct curltime keeps_speed; /* for the progress meter really */
6c1422
 
6c1422
-  struct connectdata *lastconnect; /* The last connection, NULL if undefined */
6c1422
+  long lastconnect_id; /* The last connection, -1 if undefined */
6c1422
 
6c1422
   char *headerbuff; /* allocated buffer to store headers in */
6c1422
   size_t headersize;   /* size of the allocation */
6c1422
-- 
6c1422
2.25.4
6c1422