Skip to content

Commit

Permalink
Perl: disabled unrelated calls from variable handlers.
Browse files Browse the repository at this point in the history
Variable handlers are not expected to send anything to the client, cannot
sleep or read body, and are not expected to modify the request.  Added
appropriate protection to prevent accidental foot shooting.
  • Loading branch information
mdounin committed Jul 12, 2019
1 parent 1988783 commit cae2e68
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 0 deletions.
44 changes: 44 additions & 0 deletions src/http/modules/perl/nginx.xs
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,10 @@ status(r, code)

ngx_http_perl_set_request(r, ctx);

if (ctx->variable) {
croak("status(): cannot be used in variable handler");
}

r->headers_out.status = SvIV(ST(1));

ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
Expand All @@ -133,6 +137,10 @@ send_http_header(r, ...)
croak("send_http_header(): called after error");
}

if (ctx->variable) {
croak("send_http_header(): cannot be used in variable handler");
}

if (r->headers_out.status == 0) {
r->headers_out.status = NGX_HTTP_OK;
}
Expand Down Expand Up @@ -400,6 +408,10 @@ has_request_body(r, next)

ngx_http_perl_set_request(r, ctx);

if (ctx->variable) {
croak("has_request_body(): cannot be used in variable handler");
}

if (ctx->next) {
croak("has_request_body(): another handler active");
}
Expand Down Expand Up @@ -526,6 +538,10 @@ discard_request_body(r)

ngx_http_perl_set_request(r, ctx);

if (ctx->variable) {
croak("discard_request_body(): cannot be used in variable handler");
}

rc = ngx_http_discard_request_body(r);

if (rc != NGX_OK) {
Expand All @@ -551,6 +567,10 @@ header_out(r, key, value)
croak("header_out(): called after error");
}

if (ctx->variable) {
croak("header_out(): cannot be used in variable handler");
}

key = ST(1);
value = ST(2);

Expand Down Expand Up @@ -640,6 +660,10 @@ print(r, ...)
croak("print(): called after error");
}

if (ctx->variable) {
croak("print(): cannot be used in variable handler");
}

if (items == 2) {

/*
Expand Down Expand Up @@ -750,6 +774,10 @@ sendfile(r, filename, offset = -1, bytes = 0)
croak("sendfile(): called after error");
}

if (ctx->variable) {
croak("sendfile(): cannot be used in variable handler");
}

filename = SvPV_nolen(ST(1));

if (filename == NULL) {
Expand Down Expand Up @@ -852,6 +880,10 @@ flush(r)
croak("flush(): called after error");
}

if (ctx->variable) {
croak("flush(): cannot be used in variable handler");
}

b = ngx_calloc_buf(r->pool);
if (b == NULL) {
ctx->error = 1;
Expand Down Expand Up @@ -883,6 +915,10 @@ internal_redirect(r, uri)

ngx_http_perl_set_request(r, ctx);

if (ctx->variable) {
croak("internal_redirect(): cannot be used in variable handler");
}

uri = ST(1);

if (ngx_http_perl_sv2str(aTHX_ r, &ctx->redirect_uri, uri) != NGX_OK) {
Expand Down Expand Up @@ -911,6 +947,10 @@ allow_ranges(r)

ngx_http_perl_set_request(r, ctx);

if (ctx->variable) {
croak("allow_ranges(): cannot be used in variable handler");
}

r->allow_ranges = 1;


Expand Down Expand Up @@ -1097,6 +1137,10 @@ sleep(r, sleep, next)

ngx_http_perl_set_request(r, ctx);

if (ctx->variable) {
croak("sleep(): cannot be used in variable handler");
}

if (ctx->next) {
croak("sleep(): another handler active");
}
Expand Down
5 changes: 5 additions & 0 deletions src/http/modules/perl/ngx_http_perl_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,7 @@ ngx_http_perl_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,

ngx_int_t rc;
ngx_str_t value;
ngx_uint_t saved;
ngx_http_perl_ctx_t *ctx;
ngx_http_perl_main_conf_t *pmcf;

Expand All @@ -321,6 +322,9 @@ ngx_http_perl_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
ctx->request = r;
}

saved = ctx->variable;
ctx->variable = 1;

pmcf = ngx_http_get_module_main_conf(r, ngx_http_perl_module);

value.data = NULL;
Expand All @@ -347,6 +351,7 @@ ngx_http_perl_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
v->not_found = 1;
}

ctx->variable = saved;
ctx->filename.data = NULL;
ctx->redirect_uri.len = 0;

Expand Down
1 change: 1 addition & 0 deletions src/http/modules/perl/ngx_http_perl_module.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ typedef struct {

unsigned done:1;
unsigned error:1;
unsigned variable:1;

ngx_array_t *variables; /* array of ngx_http_perl_var_t */

Expand Down

0 comments on commit cae2e68

Please sign in to comment.