Perl: fixed IO-Object duplication bug.

This commit is contained in:
Alexander Borisov
2018-02-08 16:28:52 +03:00
parent 31f72401d9
commit 433eadc2e9

View File

@@ -259,25 +259,16 @@ nxt_perl_psgi_layer_stream_arg(pTHX_ PerlIO * f,
CLONE_PARAMS *param, int flags)
{
SV *var;
nxt_perl_psgi_io_arg_t *arg;
nxt_perl_psgi_layer_stream_t *unit_stream;
unit_stream = PerlIOSelf(f, nxt_perl_psgi_layer_stream_t);
arg = (nxt_perl_psgi_io_arg_t *) (intptr_t) SvIV(SvRV(unit_stream->var));
var = unit_stream->var;
if (flags & PERLIO_DUP_CLONE) {
var = PerlIO_sv_dup(aTHX_ var, param);
} else if (flags & PERLIO_DUP_FD) {
var = newSV_type(SVt_RV);
if (var == NULL) {
return NULL;
}
sv_setptrref(var, arg);
var = newSVsv(var);
} else {
var = SvREFCNT_inc(var);
@@ -291,27 +282,12 @@ static PerlIO *
nxt_perl_psgi_layer_stream_dup(pTHX_ PerlIO *f, PerlIO *o,
CLONE_PARAMS *param, int flags)
{
SV *var;
nxt_perl_psgi_layer_stream_t *os, *fs;
nxt_perl_psgi_layer_stream_t *fs;
os = PerlIOSelf(o, nxt_perl_psgi_layer_stream_t);
fs = NULL;
var = os->var;
os->var = newSV_type(SVt_RV);
f = PerlIOBase_dup(aTHX_ f, o, param, flags);
if (f != NULL) {
fs = PerlIOSelf(f, nxt_perl_psgi_layer_stream_t);
/* The "var" has been set by an implicit push and must be replaced. */
SvREFCNT_dec(fs->var);
}
SvREFCNT_dec(os->var);
os->var = var;
if (f != NULL) {
fs->var = nxt_perl_psgi_layer_stream_arg(aTHX_ o, param, flags);
}