summaryrefslogtreecommitdiffstats
path: root/meta/recipes-support/curl/curl/CVE-2023-38546.patch
blob: 30ef2fd038077891f2d338c3dddcadf21802048f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
From 7b67721f12cbe6ed1a41e7332f3b5a7186a5e23f Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Thu, 14 Sep 2023 23:28:32 +0200
Subject: [PATCH] cookie: remove unnecessary struct fields
To: libcurl development <curl-library@cool.haxx.se>

Plus: reduce the hash table size from 256 to 63. It seems unlikely to
make much of a speed difference for most use cases but saves 1.5KB of
data per instance.

Closes #11862

This patch taken from Debian's 7.64.0-4+deb10u7 package which applied with
only a little fuzz.

CVE: CVE-2023-38546
Upstream-Status: Backport [61275672b46d9abb32857404]
Signed-off-by: Mike Crowe <mac@mcrowe.com>
---
 lib/cookie.c | 13 +------------
 lib/cookie.h |  7 ++-----
 lib/easy.c   |  4 +---
 3 files changed, 4 insertions(+), 20 deletions(-)

diff --git a/lib/cookie.c b/lib/cookie.c
index 68054e1c4..a378f28e1 100644
--- a/lib/cookie.c
+++ b/lib/cookie.c
@@ -114,7 +114,6 @@ static void freecookie(struct Cookie *co)
   free(co->name);
   free(co->value);
   free(co->maxage);
-  free(co->version);
   free(co);
 }
 
@@ -641,11 +640,7 @@ Curl_cookie_add(struct Curl_easy *data,
           }
         }
         else if(strcasecompare("version", name)) {
-          strstore(&co->version, whatptr);
-          if(!co->version) {
-            badcookie = TRUE;
-            break;
-          }
+          /* just ignore */
         }
         else if(strcasecompare("max-age", name)) {
           /* Defined in RFC2109:
@@ -1042,7 +1037,6 @@ Curl_cookie_add(struct Curl_easy *data,
         free(clist->path);
         free(clist->spath);
         free(clist->expirestr);
-        free(clist->version);
         free(clist->maxage);
 
         *clist = *co;  /* then store all the new data */
@@ -1111,9 +1105,6 @@ struct CookieInfo *Curl_cookie_init(struct Curl_easy *data,
     c = calloc(1, sizeof(struct CookieInfo));
     if(!c)
       return NULL; /* failed to get memory */
-    c->filename = strdup(file?file:"none"); /* copy the name just in case */
-    if(!c->filename)
-      goto fail; /* failed to get memory */
   }
   else {
     /* we got an already existing one, use that */
@@ -1241,7 +1232,6 @@ static struct Cookie *dup_cookie(struct Cookie *src)
     CLONE(name);
     CLONE(value);
     CLONE(maxage);
-    CLONE(version);
     d->expires = src->expires;
     d->tailmatch = src->tailmatch;
     d->secure = src->secure;
@@ -1457,7 +1447,6 @@ void Curl_cookie_cleanup(struct CookieInfo *c)
 {
   if(c) {
     unsigned int i;
-    free(c->filename);
     for(i = 0; i < COOKIE_HASH_SIZE; i++)
       Curl_cookie_freelist(c->cookies[i]);
     free(c); /* free the base struct as well */
diff --git a/lib/cookie.h b/lib/cookie.h
index b3865e601..2e667cda0 100644
--- a/lib/cookie.h
+++ b/lib/cookie.h
@@ -36,8 +36,6 @@ struct Cookie {
   char *expirestr;   /* the plain text version */
   bool tailmatch;    /* whether we do tail-matching of the domain name */
 
-  /* RFC 2109 keywords. Version=1 means 2109-compliant cookie sending */
-  char *version;     /* Version = <value> */
   char *maxage;      /* Max-Age = <value> */
 
   bool secure;       /* whether the 'secure' keyword was used */
@@ -54,15 +52,14 @@ struct Cookie {
 #define COOKIE_PREFIX__SECURE (1<<0)
 #define COOKIE_PREFIX__HOST (1<<1)
 
-#define COOKIE_HASH_SIZE 256
+#define COOKIE_HASH_SIZE 63
 
 struct CookieInfo {
   /* linked list of cookies we know of */
   struct Cookie *cookies[COOKIE_HASH_SIZE];
 
-  char *filename;  /* file we read from/write to */
   bool running;    /* state info, for cookie adding information */
-  long numcookies; /* number of cookies in the "jar" */
+  int numcookies;  /* number of cookies in the "jar" */
   bool newsession; /* new session, discard session cookies on load */
   int lastct;      /* last creation-time used in the jar */
 };
diff --git a/lib/easy.c b/lib/easy.c
index b648e80c1..cdca0fb03 100644
--- a/lib/easy.c
+++ b/lib/easy.c
@@ -840,9 +840,7 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
   if(data->cookies) {
     /* If cookies are enabled in the parent handle, we enable them
        in the clone as well! */
-    outcurl->cookies = Curl_cookie_init(data,
-                                        data->cookies->filename,
-                                        outcurl->cookies,
+    outcurl->cookies = Curl_cookie_init(data, NULL, outcurl->cookies,
                                         data->set.cookiesession);
     if(!outcurl->cookies)
       goto fail;
-- 
2.39.2