mirror of
https://github.com/nginx/nginx.git
synced 2024-12-04 22:09:01 +08:00
fix segfault when $r->has_request_body() is called with ready body
This commit is contained in:
parent
cb54061885
commit
16623e0b9c
@ -230,6 +230,10 @@ ngx_http_perl_handle_request(ngx_http_request_t *r)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rc == NGX_DONE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (rc > 600) {
|
if (rc > 600) {
|
||||||
rc = NGX_OK;
|
rc = NGX_OK;
|
||||||
}
|
}
|
||||||
@ -627,12 +631,13 @@ static ngx_int_t
|
|||||||
ngx_http_perl_call_handler(pTHX_ ngx_http_request_t *r, HV *nginx, SV *sub,
|
ngx_http_perl_call_handler(pTHX_ ngx_http_request_t *r, HV *nginx, SV *sub,
|
||||||
ngx_str_t **args, ngx_str_t *handler, ngx_str_t *rv)
|
ngx_str_t **args, ngx_str_t *handler, ngx_str_t *rv)
|
||||||
{
|
{
|
||||||
SV *sv;
|
SV *sv;
|
||||||
int n, status;
|
int n, status;
|
||||||
char *line;
|
char *line;
|
||||||
STRLEN len, n_a;
|
STRLEN len, n_a;
|
||||||
ngx_str_t err;
|
ngx_str_t err;
|
||||||
ngx_uint_t i;
|
ngx_uint_t i;
|
||||||
|
ngx_connection_t *c;
|
||||||
|
|
||||||
dSP;
|
dSP;
|
||||||
|
|
||||||
@ -658,15 +663,26 @@ ngx_http_perl_call_handler(pTHX_ ngx_http_request_t *r, HV *nginx, SV *sub,
|
|||||||
|
|
||||||
PUTBACK;
|
PUTBACK;
|
||||||
|
|
||||||
|
c = r->connection;
|
||||||
|
|
||||||
n = call_sv(sub, G_EVAL);
|
n = call_sv(sub, G_EVAL);
|
||||||
|
|
||||||
SPAGAIN;
|
SPAGAIN;
|
||||||
|
|
||||||
|
if (c->destroyed) {
|
||||||
|
PUTBACK;
|
||||||
|
|
||||||
|
FREETMPS;
|
||||||
|
LEAVE;
|
||||||
|
|
||||||
|
return NGX_DONE;
|
||||||
|
}
|
||||||
|
|
||||||
if (n) {
|
if (n) {
|
||||||
if (rv == NULL) {
|
if (rv == NULL) {
|
||||||
status = POPi;
|
status = POPi;
|
||||||
|
|
||||||
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
|
||||||
"call_sv: %d", status);
|
"call_sv: %d", status);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -697,9 +713,8 @@ ngx_http_perl_call_handler(pTHX_ ngx_http_request_t *r, HV *nginx, SV *sub,
|
|||||||
}
|
}
|
||||||
err.len = len + 1;
|
err.len = len + 1;
|
||||||
|
|
||||||
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
|
ngx_log_error(NGX_LOG_ERR, c->log, 0,
|
||||||
"call_sv(\"%V\") failed: \"%V\"",
|
"call_sv(\"%V\") failed: \"%V\"", handler, &err);
|
||||||
handler, &err);
|
|
||||||
|
|
||||||
if (rv) {
|
if (rv) {
|
||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
@ -709,7 +724,7 @@ ngx_http_perl_call_handler(pTHX_ ngx_http_request_t *r, HV *nginx, SV *sub,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (n != 1) {
|
if (n != 1) {
|
||||||
ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
|
ngx_log_error(NGX_LOG_ALERT, c->log, 0,
|
||||||
"call_sv(\"%V\") returned %d results", handler, n);
|
"call_sv(\"%V\") returned %d results", handler, n);
|
||||||
status = NGX_OK;
|
status = NGX_OK;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user