# HG changeset patch # User Maxim Dounin # Date 1562934877 -10800 # Node ID 02cd116ebe2a80c8d16a40085a30110def8cf67f # Parent 8125552a10ca55e603aeb41f3dd65d204ba3420e Perl: protection against duplicate $r->sleep() calls. Duplicate $r->sleep() and/or $r->has_request_body() calls result in undefined behaviour (in practice, connection leaks were observed). To prevent this, croak() added in appropriate places. diff --git a/src/http/modules/perl/nginx.xs b/src/http/modules/perl/nginx.xs --- a/src/http/modules/perl/nginx.xs +++ b/src/http/modules/perl/nginx.xs @@ -400,6 +400,10 @@ has_request_body(r, next) ngx_http_perl_set_request(r, ctx); + if (ctx->next) { + croak("has_request_body(): another handler active"); + } + if (r->headers_in.content_length_n <= 0 && !r->headers_in.chunked) { XSRETURN_UNDEF; } @@ -1093,6 +1097,10 @@ sleep(r, sleep, next) ngx_http_perl_set_request(r, ctx); + if (ctx->next) { + croak("sleep(): another handler active"); + } + sleep = (ngx_msec_t) SvIV(ST(1)); ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,