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.

Reply via email to