Change 30279 by [EMAIL PROTECTED] on 2007/02/14 11:47:20
Integrate:
[ 29691]
Subject: Re: [PATCH] perlio.c repair
From: Bo Lindbergh <[EMAIL PROTECTED]>
Date: Thu, 4 Jan 2007 18:22:09 +0100
Message-Id: <[EMAIL PROTECTED]>
[ 29701]
Subject: [PATCH] ext/PerlIO/via/via.xs freeing the wrong thing
From: Bo Lindbergh <[EMAIL PROTECTED]>
Date: Fri, 5 Jan 2007 19:19:53 +0100
Message-Id: <[EMAIL PROTECTED]>
[ 29894]
Subject: [PATCH] Re: Race condition in IPC::Open3 / Mac OS?
From: Bo Lindbergh <[EMAIL PROTECTED]>
Date: Sat, 20 Jan 2007 02:39:57 +0100
Message-Id: <[EMAIL PROTECTED]>
Affected files ...
... //depot/maint-5.8/perl/ext/PerlIO/via/via.xs#12 integrate
... //depot/maint-5.8/perl/perlio.c#105 integrate
Differences ...
==== //depot/maint-5.8/perl/ext/PerlIO/via/via.xs#12 (text) ====
Index: perl/ext/PerlIO/via/via.xs
--- perl/ext/PerlIO/via/via.xs#11~25501~ 2005-09-19 13:42:24.000000000
-0700
+++ perl/ext/PerlIO/via/via.xs 2007-02-14 03:47:20.000000000 -0800
@@ -137,10 +137,10 @@
s->obj = SvREFCNT_inc(arg);
s->stash = gv_stashpvn(pkg, pkglen, FALSE);
if (!s->stash) {
+ SvREFCNT_dec(s->obj);
s->obj =
newSVpvn(Perl_form(aTHX_ "PerlIO::via::%s", pkg),
pkglen + 13);
- SvREFCNT_dec(arg);
s->stash = gv_stashpvn(SvPVX_const(s->obj), pkglen + 13, FALSE);
}
if (s->stash) {
@@ -156,8 +156,8 @@
modesv, Nullsv);
if (result) {
if (sv_isobject(result)) {
+ SvREFCNT_dec(s->obj);
s->obj = SvREFCNT_inc(result);
- SvREFCNT_dec(arg);
}
else if (SvIV(result) != 0)
return SvIV(result);
==== //depot/maint-5.8/perl/perlio.c#105 (text) ====
Index: perl/perlio.c
--- perl/perlio.c#104~30269~ 2007-02-13 13:18:26.000000000 -0800
+++ perl/perlio.c 2007-02-14 03:47:20.000000000 -0800
@@ -642,9 +642,13 @@
int i;
list = PerlIO_list_alloc(aTHX);
for (i=0; i < proto->cur; i++) {
- SV *arg = NULL;
- if (proto->array[i].arg)
- arg = PerlIO_sv_dup(aTHX_ proto->array[i].arg,param);
+ SV *arg = proto->array[i].arg;
+#ifdef sv_dup
+ if (arg && param)
+ arg = sv_dup(arg, param);
+#else
+ PERL_UNUSED_ARG(param);
+#endif
PerlIO_list_push(aTHX_ list, proto->array[i].funcs, arg);
}
}
@@ -1003,10 +1007,13 @@
PerlIO_funcs * const layer =
PerlIO_find_layer(aTHX_ s, llen, 1);
if (layer) {
+ SV *arg = NULL;
+ if (as)
+ arg = newSVpvn(as, alen);
PerlIO_list_push(aTHX_ av, layer,
- (as) ? newSVpvn(as,
- alen) :
- &PL_sv_undef);
+ (arg) ? arg : &PL_sv_undef);
+ if (arg)
+ SvREFCNT_dec(arg);
}
else {
if (ckWARN(WARN_LAYER))
@@ -1499,12 +1506,7 @@
if (layers && *layers) {
PerlIO_list_t *av;
if (incdef) {
- IV i;
- av = PerlIO_list_alloc(aTHX);
- for (i = 0; i < def->cur; i++) {
- PerlIO_list_push(aTHX_ av, def->array[i].funcs,
- def->array[i].arg);
- }
+ av = PerlIO_clone_list(aTHX_ def, NULL);
}
else {
av = def;
@@ -1548,10 +1550,13 @@
PerlIOl *l = *f;
layera = PerlIO_list_alloc(aTHX);
while (l) {
- SV * const arg = (l->tab->Getarg)
- ? (*l->tab->Getarg) (aTHX_ &l, NULL, 0)
- : &PL_sv_undef;
- PerlIO_list_push(aTHX_ layera, l->tab, arg);
+ SV *arg = NULL;
+ if (l->tab->Getarg)
+ arg = (*l->tab->Getarg) (aTHX_ &l, NULL, 0);
+ PerlIO_list_push(aTHX_ layera, l->tab,
+ (arg) ? arg : &PL_sv_undef);
+ if (arg)
+ SvREFCNT_dec(arg);
l = *PerlIONext(&l);
}
}
@@ -2223,7 +2228,9 @@
return NULL;
#ifdef sv_dup
if (param) {
- return sv_dup(arg, param);
+ arg = sv_dup(arg, param);
+ SvREFCNT_inc_simple_void_NN(arg);
+ return arg;
}
else {
return newSVsv(arg);
@@ -2247,19 +2254,15 @@
}
if (f) {
PerlIO_funcs * const self = PerlIOBase(o)->tab;
- SV *arg;
+ SV *arg = NULL;
char buf[8];
PerlIO_debug("PerlIOBase_dup %s f=%p o=%p param=%p\n",
self->name, (void*)f, (void*)o, (void*)param);
if (self->Getarg)
arg = (*self->Getarg)(aTHX_ o, param, flags);
- else {
- arg = NULL;
- }
f = PerlIO_push(aTHX_ f, self, PerlIO_modestr(o,buf), arg);
- if (arg) {
+ if (arg)
SvREFCNT_dec(arg);
- }
}
return f;
}
@@ -3405,9 +3408,15 @@
if (PerlSIO_fflush(stdio) != 0)
return EOF;
}
- c = PerlSIO_fgetc(stdio);
- if (c == EOF)
- return EOF;
+ for (;;) {
+ c = PerlSIO_fgetc(stdio);
+ if (c != EOF)
+ break;
+ if (! PerlSIO_ferror(stdio) || errno != EINTR)
+ return EOF;
+ PERL_ASYNC_CHECK();
+ SETERRNO(0,0);
+ }
#if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) ||
defined(STDIO_PTR_LVAL_SETS_CNT)))
End of Patch.