Perl: Fix a crash in the language module.
User @bes-internal reported a Perl module crasher on GitHub. This was due to a Perl application sending back two responses, for each response we would call down into XS_NGINX__Unit__Sandbox_cb(), the first time pctx->req would point to a valid nxt_unit_request_info_t, the second time pctx->req would be NULL. Add an invalid responses check which covers this case. Closes: <https://github.com/nginx/unit/issues/841> Reviewed-by: Alejandro Colomar <alx@nginx.com> Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
This commit is contained in:
@@ -267,8 +267,11 @@ XS(XS_NGINX__Unit__Sandbox_cb)
|
|||||||
XSRETURN_EMPTY;
|
XSRETURN_EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pctx = CvXSUBANY(cv).any_ptr;
|
||||||
|
|
||||||
if (nxt_slow_path(SvOK(ST(0)) == 0 || SvROK(ST(0)) == 0
|
if (nxt_slow_path(SvOK(ST(0)) == 0 || SvROK(ST(0)) == 0
|
||||||
|| SvTYPE(SvRV(ST(0))) != SVt_PVAV))
|
|| SvTYPE(SvRV(ST(0))) != SVt_PVAV
|
||||||
|
|| pctx->req == NULL))
|
||||||
{
|
{
|
||||||
nxt_perl_psgi_cb_request_done(CvXSUBANY(cv).any_ptr, NXT_UNIT_ERROR);
|
nxt_perl_psgi_cb_request_done(CvXSUBANY(cv).any_ptr, NXT_UNIT_ERROR);
|
||||||
|
|
||||||
@@ -278,8 +281,6 @@ XS(XS_NGINX__Unit__Sandbox_cb)
|
|||||||
XSRETURN_EMPTY;
|
XSRETURN_EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
pctx = CvXSUBANY(cv).any_ptr;
|
|
||||||
|
|
||||||
rc = nxt_perl_psgi_result_array(PERL_GET_CONTEXT, ST(0), pctx->req);
|
rc = nxt_perl_psgi_result_array(PERL_GET_CONTEXT, ST(0), pctx->req);
|
||||||
if (nxt_slow_path(rc != NXT_UNIT_OK)) {
|
if (nxt_slow_path(rc != NXT_UNIT_OK)) {
|
||||||
nxt_perl_psgi_cb_request_done(CvXSUBANY(cv).any_ptr, NXT_UNIT_ERROR);
|
nxt_perl_psgi_cb_request_done(CvXSUBANY(cv).any_ptr, NXT_UNIT_ERROR);
|
||||||
|
|||||||
Reference in New Issue
Block a user