fix segfault when $r->has_request_body() is called with ready body

This commit is contained in:
Igor Sysoev 2007-12-09 19:30:30 +00:00
parent cb54061885
commit 16623e0b9c

View File

@ -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;
} }