comparison src/http/ngx_http_parse.c @ 9240:f3df785649ae

Request body: limited chunk extensions and trailer headers. Previously, arbitrary amounts of chunk extensions and trailer headers were accepted and skipped. Despite being under limit_conn / limit_req limits (if configured), this can be a DoS vector, so it is now limited by the client_max_body_size limit. Reported by Bartek Nowotarski.
author Maxim Dounin <mdounin@mdounin.ru>
date Sat, 30 Mar 2024 05:09:35 +0300
parents dacad3a9c7b8
children ddcedfa3a809
comparison
equal deleted inserted replaced
9239:b2e16e8639c8 9240:f3df785649ae
2255 case CR: 2255 case CR:
2256 state = sw_chunk_extension_almost_done; 2256 state = sw_chunk_extension_almost_done;
2257 break; 2257 break;
2258 case LF: 2258 case LF:
2259 state = sw_chunk_data; 2259 state = sw_chunk_data;
2260 break;
2261 default:
2262 ctx->skipped++;
2260 } 2263 }
2261 break; 2264 break;
2262 2265
2263 case sw_chunk_extension_almost_done: 2266 case sw_chunk_extension_almost_done:
2264 if (ch == LF) { 2267 if (ch == LF) {
2296 case CR: 2299 case CR:
2297 state = sw_last_chunk_extension_almost_done; 2300 state = sw_last_chunk_extension_almost_done;
2298 break; 2301 break;
2299 case LF: 2302 case LF:
2300 state = sw_trailer; 2303 state = sw_trailer;
2304 break;
2305 default:
2306 ctx->skipped++;
2301 } 2307 }
2302 break; 2308 break;
2303 2309
2304 case sw_last_chunk_extension_almost_done: 2310 case sw_last_chunk_extension_almost_done:
2305 if (ch == LF) { 2311 if (ch == LF) {
2331 case CR: 2337 case CR:
2332 state = sw_trailer_header_almost_done; 2338 state = sw_trailer_header_almost_done;
2333 break; 2339 break;
2334 case LF: 2340 case LF:
2335 state = sw_trailer; 2341 state = sw_trailer;
2342 break;
2343 default:
2344 ctx->skipped++;
2336 } 2345 }
2337 break; 2346 break;
2338 2347
2339 case sw_trailer_header_almost_done: 2348 case sw_trailer_header_almost_done:
2340 if (ch == LF) { 2349 if (ch == LF) {