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