Change 30094 by [EMAIL PROTECTED] on 2007/02/02 16:57:24

        Integrate:
        [ 29506]
        Subject: [PATCH] Re: [perl #41065] Out of memory!, while extending 
scalar
        From: Marcus Holland-Moritz <[EMAIL PROTECTED]>
        Date: Sun, 10 Dec 2006 22:32:32 +0100
        Message-ID: <[EMAIL PROTECTED]>
        
        [ 29574]
        Subject: [PATCH] perl.c: leak avoidance
        From: Jarkko Hietaniemi <[EMAIL PROTECTED]>
        Date: Sat, 16 Dec 2006 11:48:13 -0500
        Message-ID: <[EMAIL PROTECTED]>
        
        [ 29590]
        Subject: [PATCH] Don't destroy the Unicode system environment on Perl 
startup
        From: Jan Dubois <[EMAIL PROTECTED]>
        Date: Mon, 18 Dec 2006 16:34:33 -0800
        Message-ID: <[EMAIL PROTECTED]>
        
        [ 29614]
        syswrite() wasn't reporting a warning when writing to a filehandle
        opened only for input.

Affected files ...

... //depot/maint-5.8/perl/doop.c#50 integrate
... //depot/maint-5.8/perl/perl.c#198 integrate
... //depot/maint-5.8/perl/pp_sys.c#141 integrate
... //depot/maint-5.8/perl/t/lib/warnings/pp_sys#4 integrate

Differences ...

==== //depot/maint-5.8/perl/doop.c#50 (text) ====
Index: perl/doop.c
--- perl/doop.c#49~29993~       2007-01-26 01:15:17.000000000 -0800
+++ perl/doop.c 2007-02-02 08:57:24.000000000 -0800
@@ -714,7 +714,7 @@
 UV
 Perl_do_vecget(pTHX_ SV *sv, I32 offset, I32 size)
 {
-    STRLEN srclen, len, uoffset;
+    STRLEN srclen, len, uoffset, bitoffs = 0;
     const unsigned char *s = (const unsigned char *) SvPV_const(sv, srclen);
     UV retnum = 0;
 
@@ -726,13 +726,20 @@
     if (SvUTF8(sv))
        (void) Perl_sv_utf8_downgrade(aTHX_ sv, TRUE);
 
-    uoffset = offset*size;     /* turn into bit offset */
-    len = (uoffset + size + 7) / 8;    /* required number of bytes */
+    if (size < 8) {
+       bitoffs = ((offset%8)*size)%8;
+       uoffset = offset/(8/size);
+    }
+    else if (size > 8)
+       uoffset = offset*(size/8);
+    else
+       uoffset = offset;
+
+    len = uoffset + (bitoffs + size + 7)/8;    /* required number of bytes */
     if (len > srclen) {
        if (size <= 8)
            retnum = 0;
        else {
-           uoffset >>= 3;      /* turn into byte offset */
            if (size == 16) {
                if (uoffset >= srclen)
                    retnum = 0;
@@ -809,9 +816,8 @@
        }
     }
     else if (size < 8)
-       retnum = (s[uoffset >> 3] >> (uoffset & 7)) & ((1 << size) - 1);
+       retnum = (s[uoffset] >> bitoffs) & ((1 << size) - 1);
     else {
-       uoffset >>= 3;  /* turn into byte offset */
        if (size == 8)
            retnum = s[uoffset];
        else if (size == 16)
@@ -852,7 +858,7 @@
 void
 Perl_do_vecset(pTHX_ SV *sv)
 {
-    register I32 offset;
+    register I32 offset, bitoffs = 0;
     register I32 size;
     register unsigned char *s;
     register UV lval;
@@ -881,8 +887,14 @@
     if (size < 1 || (size & (size-1))) /* size < 1 or not a power of two */
        Perl_croak(aTHX_ "Illegal number of bits in vec");
 
-    offset *= size;                    /* turn into bit offset */
-    len = (offset + size + 7) / 8;     /* required number of bytes */
+    if (size < 8) {
+       bitoffs = ((offset%8)*size)%8;
+       offset /= 8/size;
+    }
+    else if (size > 8)
+       offset *= size/8;
+
+    len = offset + (bitoffs + size + 7)/8;     /* required number of bytes */
     if (len > targlen) {
        s = (unsigned char*)SvGROW(targ, len + 1);
        (void)memzero((char *)(s + targlen), len - targlen + 1);
@@ -891,14 +903,11 @@
 
     if (size < 8) {
        mask = (1 << size) - 1;
-       size = offset & 7;
        lval &= mask;
-       offset >>= 3;                   /* turn into byte offset */
-       s[offset] &= ~(mask << size);
-       s[offset] |= lval << size;
+       s[offset] &= ~(mask << bitoffs);
+       s[offset] |= lval << bitoffs;
     }
     else {
-       offset >>= 3;                   /* turn into byte offset */
        if (size == 8)
            s[offset  ] = (U8)( lval        & 0xff);
        else if (size == 16) {

==== //depot/maint-5.8/perl/perl.c#198 (text) ====
Index: perl/perl.c
--- perl/perl.c#197~30065~      2007-01-29 10:52:30.000000000 -0800
+++ perl/perl.c 2007-02-02 08:57:24.000000000 -0800
@@ -874,19 +874,6 @@
     PL_exitlist = NULL;
     PL_exitlistlen = 0;
 
-    if (destruct_level == 0){
-
-       DEBUG_P(debprofdump());
-
-#if defined(PERLIO_LAYERS)
-       /* No more IO - including error messages ! */
-       PerlIO_cleanup(aTHX);
-#endif
-
-       /* The exit() function will do everything that needs doing. */
-        return STATUS_EXIT;
-    }
-
     /* jettison our possibly duplicated environment */
     /* if PERL_USE_SAFE_PUTENV is defined environ will not have been copied
      * so we certainly shouldn't free it here
@@ -913,6 +900,22 @@
 #endif
 #endif /* !PERL_MICRO */
 
+    if (destruct_level == 0) {
+
+       DEBUG_P(debprofdump());
+
+#if defined(PERLIO_LAYERS)
+       /* No more IO - including error messages ! */
+       PerlIO_cleanup(aTHX);
+#endif
+
+       CopFILE_free(&PL_compiling);
+       CopSTASH_free(&PL_compiling);
+
+       /* The exit() function will do everything that needs doing. */
+        return STATUS_EXIT;
+    }
+
     /* reset so print() ends up where we expect */
     setdefout(NULL);
 
@@ -4738,6 +4741,7 @@
     }
     if ((PL_envgv = gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV))) {
        HV *hv;
+       bool env_is_not_environ;
        GvMULTI_on(PL_envgv);
        hv = GvHVn(PL_envgv);
        hv_magic(hv, NULL, PERL_MAGIC_env);
@@ -4750,7 +4754,8 @@
        */
        if (!env)
            env = environ;
-       if (env != environ
+       env_is_not_environ = env != environ;
+       if (env_is_not_environ
 #  ifdef USE_ITHREADS
            && PL_curinterp == aTHX
 #  endif
@@ -4772,7 +4777,7 @@
 #endif
            sv = newSVpv(s+1, 0);
            (void)hv_store(hv, *env, s - *env, sv, 0);
-           if (env != environ)
+           if (env_is_not_environ)
                mg_set(sv);
            if (origenv != environ) {
              /* realloc has shifted us */

==== //depot/maint-5.8/perl/pp_sys.c#141 (text) ====
Index: perl/pp_sys.c
--- perl/pp_sys.c#140~30061~    2007-01-29 09:39:20.000000000 -0800
+++ perl/pp_sys.c       2007-02-02 08:57:24.000000000 -0800
@@ -1818,10 +1818,14 @@
 
     SETERRNO(0,0);
     io = GvIO(gv);
-    if (!io || !IoIFP(io)) {
+    if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
        retval = -1;
-       if (ckWARN(WARN_CLOSED))
-           report_evil_fh(gv, io, PL_op->op_type);
+       if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
+           if (io && IoIFP(io))
+               report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
+           else
+               report_evil_fh(gv, io, PL_op->op_type);
+       }
        SETERRNO(EBADF,RMS_IFI);
        goto say_undef;
     }

==== //depot/maint-5.8/perl/t/lib/warnings/pp_sys#4 (text) ====
Index: perl/t/lib/warnings/pp_sys
--- perl/t/lib/warnings/pp_sys#3~26621~ 2006-01-03 11:20:46.000000000 -0800
+++ perl/t/lib/warnings/pp_sys  2007-02-02 08:57:24.000000000 -0800
@@ -197,6 +197,14 @@
 Filehandle STDIN opened only for input at - line 3.
 ########
 # pp_sys.c [pp_send]
+use warnings 'io' ;
+syswrite STDIN, "fred";
+no warnings 'io' ;
+syswrite STDIN, "fred";
+EXPECT
+Filehandle STDIN opened only for input at - line 3.
+########
+# pp_sys.c [pp_send]
 use warnings 'closed' ;
 close STDIN; 
 syswrite STDIN, "fred", 1;
End of Patch.

Reply via email to