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.