• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1From 119fb187192a9ea13dc90d9d20c215fc82799ab9 Mon Sep 17 00:00:00 2001
2From: Patrick Monnerat <patrick@monnerat.net>
3Date: Mon, 13 Feb 2023 08:33:09 +0100
4Subject: [PATCH] content_encoding: do not reset stage counter for each header
5
6Test 418 verifies
7
8Closes #10492
9
10Conflict: remove tests/data/test387
11Reference: https://github.com/curl/curl/commit/119fb187192a9ea13dc
12---
13 lib/content_encoding.c  |   7 +-
14 lib/urldata.h           |   1 +
15 tests/data/Makefile.inc |   2 +-
16 tests/data/test418      | 152 ++++++++++++++++++++++++++++++++++++++++
17 4 files changed, 157 insertions(+), 5 deletions(-)
18 create mode 100644 tests/data/test418
19
20diff --git a/lib/content_encoding.c b/lib/content_encoding.c
21index e78cd1c..c870df2 100644
22--- a/lib/content_encoding.c
23+++ b/lib/content_encoding.c
24@@ -1034,7 +1034,6 @@ CURLcode Curl_build_unencoding_stack(struct Curl_easy *data,
25                                      const char *enclist, int maybechunked)
26 {
27   struct SingleRequest *k = &data->req;
28-  int counter = 0;
29
30   do {
31     const char *name;
32@@ -1069,9 +1068,9 @@ CURLcode Curl_build_unencoding_stack(struct Curl_easy *data,
33       if(!encoding)
34         encoding = &error_encoding;  /* Defer error at stack use. */
35
36-      if(++counter >= MAX_ENCODE_STACK) {
37-        failf(data, "Reject response due to %u content encodings",
38-              counter);
39+      if(k->writer_stack_depth++ >= MAX_ENCODE_STACK) {
40+        failf(data, "Reject response due to more than %u content encodings",
41+              MAX_ENCODE_STACK);
42         return CURLE_BAD_CONTENT_ENCODING;
43       }
44       /* Stack the unencoding stage. */
45diff --git a/lib/urldata.h b/lib/urldata.h
46index 5c178cc..8c270b8 100644
47--- a/lib/urldata.h
48+++ b/lib/urldata.h
49@@ -706,6 +706,7 @@ struct SingleRequest {
50   struct dohdata *doh; /* DoH specific data for this request */
51 #endif
52   unsigned char setcookies;
53+  unsigned char writer_stack_depth; /* Unencoding stack depth. */
54   BIT(header);        /* incoming data has HTTP header */
55   BIT(content_range); /* set TRUE if Content-Range: was found */
56   BIT(upload_done);   /* set to TRUE when doing chunked transfer-encoding
57diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc
58index 879d846..660ee28 100644
59--- a/tests/data/Makefile.inc
60+++ b/tests/data/Makefile.inc
61@@ -66,7 +66,7 @@ test392 test393 test394 test395 test396 test397 \
62 \
63 test400 test401 test402 test403 test404 test405 test406 test407 test408 \
64 test409 test410 \
65-\
66+test418 \
67 test430 test431 test432 test433 test434 test435 test445 test446\
68 \
69 test490 test491 test492 test493 test494 \
70diff --git a/tests/data/test418 b/tests/data/test418
71new file mode 100644
72index 0000000..50e974e
73--- /dev/null
74+++ b/tests/data/test418
75@@ -0,0 +1,152 @@
76+<testcase>
77+<info>
78+<keywords>
79+HTTP
80+gzip
81+</keywords>
82+</info>
83+
84+#
85+# Server-side
86+<reply>
87+<data nocheck="yes">
88+HTTP/1.1 200 OK
89+Transfer-Encoding: gzip
90+Transfer-Encoding: gzip
91+Transfer-Encoding: gzip
92+Transfer-Encoding: gzip
93+Transfer-Encoding: gzip
94+Transfer-Encoding: gzip
95+Transfer-Encoding: gzip
96+Transfer-Encoding: gzip
97+Transfer-Encoding: gzip
98+Transfer-Encoding: gzip
99+Transfer-Encoding: gzip
100+Transfer-Encoding: gzip
101+Transfer-Encoding: gzip
102+Transfer-Encoding: gzip
103+Transfer-Encoding: gzip
104+Transfer-Encoding: gzip
105+Transfer-Encoding: gzip
106+Transfer-Encoding: gzip
107+Transfer-Encoding: gzip
108+Transfer-Encoding: gzip
109+Transfer-Encoding: gzip
110+Transfer-Encoding: gzip
111+Transfer-Encoding: gzip
112+Transfer-Encoding: gzip
113+Transfer-Encoding: gzip
114+Transfer-Encoding: gzip
115+Transfer-Encoding: gzip
116+Transfer-Encoding: gzip
117+Transfer-Encoding: gzip
118+Transfer-Encoding: gzip
119+Transfer-Encoding: gzip
120+Transfer-Encoding: gzip
121+Transfer-Encoding: gzip
122+Transfer-Encoding: gzip
123+Transfer-Encoding: gzip
124+Transfer-Encoding: gzip
125+Transfer-Encoding: gzip
126+Transfer-Encoding: gzip
127+Transfer-Encoding: gzip
128+Transfer-Encoding: gzip
129+Transfer-Encoding: gzip
130+Transfer-Encoding: gzip
131+Transfer-Encoding: gzip
132+Transfer-Encoding: gzip
133+Transfer-Encoding: gzip
134+Transfer-Encoding: gzip
135+Transfer-Encoding: gzip
136+Transfer-Encoding: gzip
137+Transfer-Encoding: gzip
138+Transfer-Encoding: gzip
139+Transfer-Encoding: gzip
140+Transfer-Encoding: gzip
141+Transfer-Encoding: gzip
142+Transfer-Encoding: gzip
143+Transfer-Encoding: gzip
144+Transfer-Encoding: gzip
145+Transfer-Encoding: gzip
146+Transfer-Encoding: gzip
147+Transfer-Encoding: gzip
148+Transfer-Encoding: gzip
149+Transfer-Encoding: gzip
150+Transfer-Encoding: gzip
151+Transfer-Encoding: gzip
152+Transfer-Encoding: gzip
153+Transfer-Encoding: gzip
154+Transfer-Encoding: gzip
155+Transfer-Encoding: gzip
156+Transfer-Encoding: gzip
157+Transfer-Encoding: gzip
158+Transfer-Encoding: gzip
159+Transfer-Encoding: gzip
160+Transfer-Encoding: gzip
161+Transfer-Encoding: gzip
162+Transfer-Encoding: gzip
163+Transfer-Encoding: gzip
164+Transfer-Encoding: gzip
165+Transfer-Encoding: gzip
166+Transfer-Encoding: gzip
167+Transfer-Encoding: gzip
168+Transfer-Encoding: gzip
169+Transfer-Encoding: gzip
170+Transfer-Encoding: gzip
171+Transfer-Encoding: gzip
172+Transfer-Encoding: gzip
173+Transfer-Encoding: gzip
174+Transfer-Encoding: gzip
175+Transfer-Encoding: gzip
176+Transfer-Encoding: gzip
177+Transfer-Encoding: gzip
178+Transfer-Encoding: gzip
179+Transfer-Encoding: gzip
180+Transfer-Encoding: gzip
181+Transfer-Encoding: gzip
182+Transfer-Encoding: gzip
183+Transfer-Encoding: gzip
184+Transfer-Encoding: gzip
185+Transfer-Encoding: gzip
186+Transfer-Encoding: gzip
187+Transfer-Encoding: gzip
188+Transfer-Encoding: gzip
189+
190+-foo-
191+</data>
192+</reply>
193+
194+#
195+# Client-side
196+<client>
197+<server>
198+http
199+</server>
200+ <name>
201+Response with multiple Transfer-Encoding headers
202+ </name>
203+ <command>
204+http://%HOSTIP:%HTTPPORT/%TESTNUMBER -sS
205+</command>
206+</client>
207+
208+#
209+# Verify data after the test has been "shot"
210+<verify>
211+<protocol crlf="yes">
212+GET /%TESTNUMBER HTTP/1.1
213+Host: %HOSTIP:%HTTPPORT
214+User-Agent: curl/%VERSION
215+Accept: */*
216+
217+</protocol>
218+
219+# CURLE_BAD_CONTENT_ENCODING is 61
220+<errorcode>
221+61
222+</errorcode>
223+<stderr mode="text">
224+curl: (61) Reject response due to more than 5 content encodings
225+</stderr>
226+</verify>
227+</testcase>
228--
2292.33.0
230
231