# HG changeset patch # User Maxim Dounin # Date 1338807634 0 # Node ID b9ea486e543f48eda194495ef1ca17448cc0e9ce # Parent 979e0f5b196d135703ecb00566b0a0aa89d7e29b Merge of r4617: fastcgi padding fix. Fastcgi: fixed padding handling on fixed-size records. Padding was incorrectly ignored on end request, empty stdout and stderr fastcgi records. This resulted in protocol desynchronization if fastcgi application used these records with padding for some reason. Reported by Ilia Vinokurov. diff --git a/src/http/modules/ngx_http_fastcgi_module.c b/src/http/modules/ngx_http_fastcgi_module.c --- a/src/http/modules/ngx_http_fastcgi_module.c +++ b/src/http/modules/ngx_http_fastcgi_module.c @@ -1356,7 +1356,11 @@ ngx_http_fastcgi_process_header(ngx_http } } else { - f->state = ngx_http_fastcgi_st_version; + if (f->padding) { + f->state = ngx_http_fastcgi_st_padding; + } else { + f->state = ngx_http_fastcgi_st_version; + } } continue; @@ -1689,7 +1693,12 @@ ngx_http_fastcgi_input_filter(ngx_event_ } if (f->type == NGX_HTTP_FASTCGI_STDOUT && f->length == 0) { - f->state = ngx_http_fastcgi_st_version; + + if (f->padding) { + f->state = ngx_http_fastcgi_st_padding; + } else { + f->state = ngx_http_fastcgi_st_version; + } if (!flcf->keep_conn) { p->upstream_done = 1; @@ -1702,7 +1711,13 @@ ngx_http_fastcgi_input_filter(ngx_event_ } if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) { - f->state = ngx_http_fastcgi_st_version; + + if (f->padding) { + f->state = ngx_http_fastcgi_st_padding; + } else { + f->state = ngx_http_fastcgi_st_version; + } + p->upstream_done = 1; if (flcf->keep_conn) { @@ -1775,7 +1790,11 @@ ngx_http_fastcgi_input_filter(ngx_event_ } } else { - f->state = ngx_http_fastcgi_st_version; + if (f->padding) { + f->state = ngx_http_fastcgi_st_padding; + } else { + f->state = ngx_http_fastcgi_st_version; + } } continue;