From dcb3b7e641b0b41efa52504cd710dce325c35325 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Aug 01 2019 17:01:11 +0000 Subject: import perl-5.24.4-404.module+el8.1.0+2926+ce7246ad --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9ea7b54 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/perl-5.24.4.tar.bz2 diff --git a/.perl.metadata b/.perl.metadata new file mode 100644 index 0000000..dc47064 --- /dev/null +++ b/.perl.metadata @@ -0,0 +1 @@ +0606bb25bfe3e00e3e54fe858bd7247a104c3772 SOURCES/perl-5.24.4.tar.bz2 diff --git a/SOURCES/Compress-Raw-Zlib-2.071-Adapt-to-zlib-1.2.11.patch b/SOURCES/Compress-Raw-Zlib-2.071-Adapt-to-zlib-1.2.11.patch new file mode 100644 index 0000000..c08dd17 --- /dev/null +++ b/SOURCES/Compress-Raw-Zlib-2.071-Adapt-to-zlib-1.2.11.patch @@ -0,0 +1,367 @@ +From 0c7af9e6cb05b436505e7f46ef49dcb6f791f30a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Fri, 17 Feb 2017 11:00:21 +0100 +Subject: [PATCH] Adapt to zlib-1.2.11 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This is a fix ported from Compress-Raw-Zlib-2.072 that restores +compatibility with zlib-1.2.11. + +CPAN RT#119762 + +Signed-off-by: Petr Písař +--- + Zlib.xs | 220 +++++++++++++++++++++++++++++++++++++++++++++++-------------- + t/02zlib.t | 11 +++- + 2 files changed, 178 insertions(+), 53 deletions(-) + +diff --git a/Zlib.xs b/Zlib.xs +index d379f78..83d1423 100644 +--- a/Zlib.xs ++++ b/Zlib.xs +@@ -74,6 +74,10 @@ + # define AT_LEAST_ZLIB_1_2_8 + #endif + ++#if defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1290 ++# define AT_LEAST_ZLIB_1_2_9 ++#endif ++ + #ifdef USE_PPPORT_H + # define NEED_sv_2pvbyte + # define NEED_sv_2pv_nolen +@@ -134,12 +138,13 @@ typedef struct di_stream { + uLong dict_adler ; + int last_error ; + bool zip_mode ; +-#define SETP_BYTE ++/* #define SETP_BYTE */ + #ifdef SETP_BYTE ++ /* SETP_BYTE only works with zlib up to 1.2.8 */ + bool deflateParams_out_valid ; + Bytef deflateParams_out_byte; + #else +-#define deflateParams_BUFFER_SIZE 0x4000 ++#define deflateParams_BUFFER_SIZE 0x40000 + uLong deflateParams_out_length; + Bytef* deflateParams_out_buffer; + #endif +@@ -636,6 +641,103 @@ char * string ; + return sv ; + } + ++#if 0 ++int ++flushToBuffer(di_stream* s, int flush) ++{ ++ dTHX; ++ int ret ; ++ z_stream * strm = &s->stream; ++ ++ Bytef* output = s->deflateParams_out_buffer ; ++ ++ strm->next_in = NULL; ++ strm->avail_in = 0; ++ ++ uLong total_output = 0; ++ uLong have = 0; ++ ++ do ++ { ++ if (output) ++ output = (unsigned char *)saferealloc(output, total_output + s->bufsize); ++ else ++ output = (unsigned char *)safemalloc(s->bufsize); ++ ++ strm->next_out = output + total_output; ++ strm->avail_out = s->bufsize; ++ ++ ret = deflate(strm, flush); /* no bad return value */ ++ //assert(ret != Z_STREAM_ERROR); /* state not clobbered */ ++ if(ret == Z_STREAM_ERROR) ++ { ++ safefree(output); ++ return ret; ++ } ++ have = s->bufsize - strm->avail_out; ++ total_output += have; ++ ++ //fprintf(stderr, "FLUSH %s %d, return %d\n", flush_flags[flush], have, ret); ++ ++ } while (strm->avail_out == 0); ++ ++ s->deflateParams_out_buffer = output; ++ s->deflateParams_out_length = total_output; ++ ++ return Z_OK; ++} ++#endif ++ ++#ifndef SETP_BYTE ++int ++flushParams(di_stream* s) ++{ ++ dTHX; ++ int ret ; ++ z_stream * strm = &s->stream; ++ ++ strm->next_in = NULL; ++ strm->avail_in = 0; ++ ++ Bytef* output = s->deflateParams_out_buffer ; ++ uLong total_output = s->deflateParams_out_length; ++ ++ uLong have = 0; ++ ++ do ++ { ++ if (output) ++ output = (unsigned char *)saferealloc(output, total_output + s->bufsize); ++ else ++ output = (unsigned char *)safemalloc(s->bufsize); ++ ++ strm->next_out = output + total_output; ++ strm->avail_out = s->bufsize; ++ ++ ret = deflateParams(&(s->stream), s->Level, s->Strategy); ++ /* fprintf(stderr, "deflateParams %d %s %lu\n", ret, ++ GetErrorString(ret), s->bufsize - strm->avail_out); */ ++ ++ if (ret == Z_STREAM_ERROR) ++ break; ++ ++ have = s->bufsize - strm->avail_out; ++ total_output += have; ++ ++ ++ } while (ret == Z_BUF_ERROR) ; ++ ++ if(ret == Z_STREAM_ERROR) ++ safefree(output); ++ else ++ { ++ s->deflateParams_out_buffer = output; ++ s->deflateParams_out_length = total_output; ++ } ++ ++ return ret; ++} ++#endif /* ! SETP_BYTE */ + + #include "constants.h" + +@@ -991,20 +1093,24 @@ deflate (s, buf, output) + /* Check for saved output from deflateParams */ + if (s->deflateParams_out_length) { + uLong plen = s->deflateParams_out_length ; +- /* printf("Copy %d bytes saved data\n", plen);*/ ++ /* printf("Copy %lu bytes saved data\n", plen); */ + if (s->stream.avail_out < plen) { +- /*printf("GROW from %d to %d\n", s->stream.avail_out, +- SvLEN(output) + plen - s->stream.avail_out); */ +- Sv_Grow(output, SvLEN(output) + plen - s->stream.avail_out) ; ++ /* printf("GROW from %d to %lu\n", s->stream.avail_out, ++ SvLEN(output) + plen - s->stream.avail_out); */ ++ s->stream.next_out = (Bytef*) Sv_Grow(output, SvLEN(output) + plen - s->stream.avail_out) ; ++ s->stream.next_out += cur_length; + } + +- Copy(s->stream.next_out, s->deflateParams_out_buffer, plen, Bytef) ; +- cur_length = cur_length + plen; ++ Copy(s->deflateParams_out_buffer, s->stream.next_out, plen, Bytef) ; ++ cur_length += plen; + SvCUR_set(output, cur_length); +- s->stream.next_out += plen ; +- s->stream.avail_out = SvLEN(output) - cur_length ; +- increment = s->stream.avail_out; +- s->deflateParams_out_length = 0; ++ s->stream.next_out += plen ; ++ s->stream.avail_out = SvLEN(output) - cur_length ; ++ increment = s->stream.avail_out; ++ ++ s->deflateParams_out_length = 0; ++ Safefree(s->deflateParams_out_buffer); ++ s->deflateParams_out_buffer = NULL; + } + #endif + RETVAL = Z_OK ; +@@ -1027,6 +1133,12 @@ deflate (s, buf, output) + } + + RETVAL = deflate(&(s->stream), Z_NO_FLUSH); ++ if (RETVAL != Z_STREAM_ERROR) { ++ int done = increment - s->stream.avail_out ; ++ /* printf("std DEFLATEr returned %d '%s' avail in %d, out %d wrote %d\n", RETVAL, ++ GetErrorString(RETVAL), s->stream.avail_in, ++s->stream.avail_out, done); */ ++ } + + if (trace) { + printf("DEFLATE returned %d %s, avail in %d, out %d\n", RETVAL, +@@ -1080,7 +1192,6 @@ flush(s, output, f=Z_FINISH) + CODE: + bufinc = s->bufsize; + +- s->stream.avail_in = 0; /* should be zero already anyway */ + + /* retrieve the output buffer */ + output = deRef_l(output, "flush") ; +@@ -1108,20 +1219,24 @@ flush(s, output, f=Z_FINISH) + /* Check for saved output from deflateParams */ + if (s->deflateParams_out_length) { + uLong plen = s->deflateParams_out_length ; +- /* printf("Copy %d bytes saved data\n", plen); */ ++ /* printf("Copy %lu bytes saved data\n", plen); */ + if (s->stream.avail_out < plen) { +- /* printf("GROW from %d to %d\n", s->stream.avail_out, ++ /* printf("GROW from %d to %lu\n", s->stream.avail_out, + SvLEN(output) + plen - s->stream.avail_out); */ +- Sv_Grow(output, SvLEN(output) + plen - s->stream.avail_out) ; ++ s->stream.next_out = (Bytef*) Sv_Grow(output, SvLEN(output) + plen - s->stream.avail_out) ; ++ s->stream.next_out += cur_length; + } + +- Copy(s->stream.next_out, s->deflateParams_out_buffer, plen, Bytef) ; +- cur_length = cur_length + plen; ++ Copy(s->deflateParams_out_buffer, s->stream.next_out, plen, Bytef) ; ++ cur_length += plen; + SvCUR_set(output, cur_length); +- s->stream.next_out += plen ; +- s->stream.avail_out = SvLEN(output) - cur_length ; +- increment = s->stream.avail_out; +- s->deflateParams_out_length = 0; ++ s->stream.next_out += plen ; ++ s->stream.avail_out = SvLEN(output) - cur_length ; ++ increment = s->stream.avail_out; ++ ++ s->deflateParams_out_length = 0; ++ Safefree(s->deflateParams_out_buffer); ++ s->deflateParams_out_buffer = NULL; + } + #endif + +@@ -1145,9 +1260,15 @@ flush(s, output, f=Z_FINISH) + } + + RETVAL = deflate(&(s->stream), f); ++ if (RETVAL != Z_STREAM_ERROR) { ++ int done = availableout - s->stream.avail_out ; ++ /* printf("flush DEFLATEr returned %d '%s' avail in %d, out %d wrote %d\n", RETVAL, ++ GetErrorString(RETVAL), s->stream.avail_in, ++s->stream.avail_out, done); */ ++ } + + if (trace) { +- printf("flush DEFLATE returned %d %s, avail in %d, out %d\n", RETVAL, ++ printf("flush DEFLATE returned %d '%s', avail in %d, out %d\n", RETVAL, + GetErrorString(RETVAL), s->stream.avail_in, s->stream.avail_out); + DispStream(s, "AFTER"); + } +@@ -1184,41 +1305,38 @@ _deflateParams(s, flags, level, strategy, bufsize) + int level + int strategy + uLong bufsize ++ bool changed = FALSE; + CODE: +- /* printf("_deflateParams(Flags %d Level %d Strategy %d Bufsize %d)\n", flags, level, strategy, bufsize); +- printf("Before -- Level %d, Strategy %d, Bufsize %d\n", s->Level, s->Strategy, s->bufsize); */ +- if (flags & 1) +- s->Level = level ; +- if (flags & 2) +- s->Strategy = strategy ; +- if (flags & 4) { ++ /* printf("_deflateParams(Flags %d Level %d Strategy %d Bufsize %d)\n", flags, level, strategy, bufsize); ++ printf("Before -- Level %d, Strategy %d, Bufsize %d\n", s->Level, s->Strategy, s->bufsize); */ ++ if (flags & 1 && level != s->Level) { ++ s->Level = level ; ++ changed = TRUE; ++ } ++ if (flags & 2 && strategy != s->Strategy) { ++ s->Strategy = strategy ; ++ changed = TRUE; ++ } ++ if (flags & 4) + s->bufsize = bufsize; +- } +- /* printf("After -- Level %d, Strategy %d, Bufsize %d\n", s->Level, s->Strategy, s->bufsize);*/ ++ if (changed) { + #ifdef SETP_BYTE +- s->stream.avail_in = 0; +- s->stream.next_out = &(s->deflateParams_out_byte) ; +- s->stream.avail_out = 1; +- RETVAL = deflateParams(&(s->stream), s->Level, s->Strategy); +- s->deflateParams_out_valid = +- (RETVAL == Z_OK && s->stream.avail_out == 0) ; +- /* printf("RETVAL %d, avail out %d, byte %c\n", RETVAL, s->stream.avail_out, s->deflateParams_out_byte); */ ++ s->stream.avail_in = 0; ++ s->stream.next_out = &(s->deflateParams_out_byte) ; ++ s->stream.avail_out = 1; ++ RETVAL = deflateParams(&(s->stream), s->Level, s->Strategy); ++ s->deflateParams_out_valid = ++ (RETVAL == Z_OK && s->stream.avail_out == 0) ; + #else +- /* printf("Level %d Strategy %d, Prev Len %d\n", ++ /* printf("Level %d Strategy %d, Prev Len %d\n", + s->Level, s->Strategy, s->deflateParams_out_length); */ +- s->stream.avail_in = 0; +- if (s->deflateParams_out_buffer == NULL) +- s->deflateParams_out_buffer = safemalloc(deflateParams_BUFFER_SIZE); +- s->stream.next_out = s->deflateParams_out_buffer ; +- s->stream.avail_out = deflateParams_BUFFER_SIZE; +- +- RETVAL = deflateParams(&(s->stream), s->Level, s->Strategy); +- s->deflateParams_out_length = deflateParams_BUFFER_SIZE - s->stream.avail_out; +- /* printf("RETVAL %d, length out %d, avail %d\n", +- RETVAL, s->deflateParams_out_length, s->stream.avail_out ); */ ++ RETVAL = flushParams(s); + #endif ++ } ++ else ++ RETVAL = Z_OK; + OUTPUT: +- RETVAL ++ RETVAL + + + int +diff --git a/t/02zlib.t b/t/02zlib.t +index 2c9aad6..5d024a9 100644 +--- a/t/02zlib.t ++++ b/t/02zlib.t +@@ -27,7 +27,7 @@ BEGIN + $count = 232 ; + } + elsif ($] >= 5.006) { +- $count = 317 ; ++ $count = 320 ; + } + else { + $count = 275 ; +@@ -559,6 +559,13 @@ SKIP: + is $x->get_Level(), Z_BEST_SPEED; + is $x->get_Strategy(), Z_HUFFMAN_ONLY; + ++ # change both Level & Strategy again without any calls to deflate ++ $status = $x->deflateParams(-Level => Z_DEFAULT_COMPRESSION, -Strategy => Z_DEFAULT_STRATEGY, -Bufsize => 1234) ; ++ cmp_ok $status, '==', Z_OK ; ++ ++ is $x->get_Level(), Z_DEFAULT_COMPRESSION; ++ is $x->get_Strategy(), Z_DEFAULT_STRATEGY; ++ + $status = $x->deflate($goodbye, $Answer) ; + cmp_ok $status, '==', Z_OK ; + $input .= $goodbye; +@@ -568,7 +575,7 @@ SKIP: + cmp_ok $status, '==', Z_OK ; + + is $x->get_Level(), Z_NO_COMPRESSION; +- is $x->get_Strategy(), Z_HUFFMAN_ONLY; ++ is $x->get_Strategy(), Z_DEFAULT_STRATEGY; + + $status = $x->deflate($goodbye, $Answer) ; + cmp_ok $status, '==', Z_OK ; +-- +2.7.4 + diff --git a/SOURCES/Compress-Raw-Zlib-2.071-Conform-to-C90.patch b/SOURCES/Compress-Raw-Zlib-2.071-Conform-to-C90.patch new file mode 100644 index 0000000..91d6096 --- /dev/null +++ b/SOURCES/Compress-Raw-Zlib-2.071-Conform-to-C90.patch @@ -0,0 +1,82 @@ +From 1f3ac68dac93b7b85f09427d188386aaff0d3f80 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Fri, 17 Feb 2017 12:06:27 +0100 +Subject: [PATCH] Conform to C90 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The code failed to compile when building perl because perl adds -Werror=declaration-after-statement: + +gcc -c -I/usr/include -D_REENTRANT -D_GNU_SOURCE -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fwrapv -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Werror=declaration-after-statement -Wextra -Wc++-compat -Wwrite-strings -g -DVERSION=\"2.069\" -DXS_VERSION=\"2.069\" -fPIC "-I../.." -DNO_VIZ -DZ_SOLO -DGZIP_OS_CODE=3 Zlib.c +Zlib.xs: In function 'flushParams': +Zlib.xs:702:5: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement] + Bytef* output = s->deflateParams_out_buffer ; + ^~~~~ + +CPAN RT#120272 + +Signed-off-by: Petr Písař +--- + Zlib.xs | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/Zlib.xs b/Zlib.xs +index 83d1423..7f4396a 100644 +--- a/Zlib.xs ++++ b/Zlib.xs +@@ -696,14 +696,14 @@ flushParams(di_stream* s) + int ret ; + z_stream * strm = &s->stream; + +- strm->next_in = NULL; +- strm->avail_in = 0; +- + Bytef* output = s->deflateParams_out_buffer ; + uLong total_output = s->deflateParams_out_length; + + uLong have = 0; + ++ strm->next_in = NULL; ++ strm->avail_in = 0; ++ + do + { + if (output) +@@ -1133,12 +1133,12 @@ deflate (s, buf, output) + } + + RETVAL = deflate(&(s->stream), Z_NO_FLUSH); +- if (RETVAL != Z_STREAM_ERROR) { ++ /* if (RETVAL != Z_STREAM_ERROR) { + int done = increment - s->stream.avail_out ; +- /* printf("std DEFLATEr returned %d '%s' avail in %d, out %d wrote %d\n", RETVAL, ++ printf("std DEFLATEr returned %d '%s' avail in %d, out %d wrote %d\n", RETVAL, + GetErrorString(RETVAL), s->stream.avail_in, +-s->stream.avail_out, done); */ +- } ++s->stream.avail_out, done); ++ } */ + + if (trace) { + printf("DEFLATE returned %d %s, avail in %d, out %d\n", RETVAL, +@@ -1260,12 +1260,12 @@ flush(s, output, f=Z_FINISH) + } + + RETVAL = deflate(&(s->stream), f); +- if (RETVAL != Z_STREAM_ERROR) { ++ /* if (RETVAL != Z_STREAM_ERROR) { + int done = availableout - s->stream.avail_out ; +- /* printf("flush DEFLATEr returned %d '%s' avail in %d, out %d wrote %d\n", RETVAL, ++ printf("flush DEFLATEr returned %d '%s' avail in %d, out %d wrote %d\n", RETVAL, + GetErrorString(RETVAL), s->stream.avail_in, +-s->stream.avail_out, done); */ +- } ++s->stream.avail_out, done); ++ } */ + + if (trace) { + printf("flush DEFLATE returned %d '%s', avail in %d, out %d\n", RETVAL, +-- +2.7.4 + diff --git a/SOURCES/Pod-Html-license-clarification b/SOURCES/Pod-Html-license-clarification new file mode 100644 index 0000000..bd567f1 --- /dev/null +++ b/SOURCES/Pod-Html-license-clarification @@ -0,0 +1,41 @@ +Date: Sun, 15 Mar 2015 21:22:10 -0600 +Subject: Re: Pod::Html license +From: Tom Christiansen +To: Petr Šabata +Cc: Tom Christiansen , marcgreen@cpan.org, + jplesnik@redhat.com +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Content-Type: text/plain; charset=utf-8 + +Yes, it was supposed to be licensed just like the rest of Perl. + +Sent from my Sprint phone + +Petr Šabata wrote: + +>Marc, Tom, +> +>I'm reviewing licensing of our perl package in Fedora and +>noticed Pod::HTML and its pod2html script are licensed under +>the Artistic license (only). +> +>This is an issue for us as this license isn't considered free by +>FSF [0]. Unless the license of this core component changes, we +>will have to drop it from the tarball and remove support for it +>from all the modules we ship that use it, such as Module::Build +>or Module::Install. +> +>What I've seen in the past is authors originally claiming their +>module was released under Artistic while what they actually meant +>was the common `the same as perl itself', i.e. `GPL+/Aristic' [1], +>an FSF free license. Is it possible this is also the case +>of Pod::Html? +> +>Thanks, +>Petr +> +>(also CC'ing Jitka, the primary package maintainer in Fedora) +> +>[0] https://www.gnu.org/licenses/license-list.html#ArtisticLicense +>[1] https://www.gnu.org/licenses/license-list.html#PerlLicense diff --git a/SOURCES/gendep.macros b/SOURCES/gendep.macros new file mode 100644 index 0000000..13ac79e --- /dev/null +++ b/SOURCES/gendep.macros @@ -0,0 +1,1988 @@ +%global gendep_perl \ +Requires: perl(:VERSION) >= 5.0.0 \ +Requires: perl(:VERSION) >= 5.10.1 \ +Requires: perl(:VERSION) >= 5.3.0 \ +Requires: perl(:VERSION) >= 5.5.0 \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(:VERSION) >= 5.7.0 \ +Requires: perl(:VERSION) >= 5.7.3 \ +Requires: perl(:VERSION) >= 5.8.0 \ +Requires: perl(:VERSION) >= 5.9.1 \ +Requires: perl(:VERSION) >= 5.9.4 \ +Requires: perl(B) \ +Requires: perl(B::Concise) \ +Requires: perl(B::Op_private) \ +Requires: perl(B::Terse) \ +Requires: perl(Carp) \ +Requires: perl(Class::Struct) \ +Requires: perl(Config) \ +Requires: perl(Cwd) \ +Requires: perl(Exporter) \ +Requires: perl(ExtUtils::Constant::Base) \ +Requires: perl(ExtUtils::Constant::Utils) \ +Requires: perl(ExtUtils::Constant::XS) \ +Requires: perl(Fcntl) \ +Requires: perl(File::Basename) \ +Requires: perl(File::Path) \ +Requires: perl(File::Spec) \ +Requires: perl(File::Spec::Functions) \ +Requires: perl(I18N::LangTags) \ +Requires: perl(IO::File) \ +Requires: perl(IPC::Open3) \ +Requires: perl(Opcode) >= 1.01 \ +Requires: perl(POSIX) \ +Requires: perl(Scalar::Util) >= 1.10 \ +Requires: perl(Symbol) \ +Requires: perl(Text::Tabs) \ +Requires: perl(Text::Wrap) \ +Requires: perl(Tie::Handle) \ +Requires: perl(Tie::Hash) \ +Requires: perl(Tie::StdHandle) \ +Requires: perl(Time::tm) \ +Requires: perl(Unicode::Normalize) \ +Requires: perl(XSLoader) \ +Requires: perl(_charnames) \ +Requires: perl(bytes) \ +Requires: perl(charnames) \ +Requires: perl(constant) \ +Requires: perl(feature) \ +Requires: perl(if) \ +Requires: perl(integer) \ +Requires: perl(overload) \ +Requires: perl(parent) \ +Requires: perl(re) \ +Requires: perl(strict) \ +Requires: perl(subs) \ +Requires: perl(threads) \ +Requires: perl(threads::shared) \ +Requires: perl(unicore::Name) \ +Requires: perl(utf8) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Requires: perl(warnings::register) \ +Provides: perl(AnyDBM_File) = 1.01 \ +Provides: perl(AutoLoader) = 5.74 \ +Provides: perl(AutoSplit) = 1.06 \ +Provides: perl(B) = 1.62 \ +Provides: perl(B::Concise) = 0.996 \ +Provides: perl(B::Deparse) = 1.37 \ +Provides: perl(B::OBJECT) \ +Provides: perl(B::Op_private) = 5.024004 \ +Provides: perl(B::Showlex) = 1.05 \ +Provides: perl(B::Terse) = 1.06 \ +Provides: perl(B::Xref) = 1.05 \ +Provides: perl(Benchmark) = 1.22 \ +Provides: perl(Class::Struct) = 0.65 \ +Provides: perl(Class::Struct::Tie_ISA) \ +Provides: perl(Config) = 5.024004 \ +Provides: perl(Config::Extensions) = 0.01 \ +Provides: perl(DB) = 1.08 \ +Provides: perl(DBM_Filter) = 0.06 \ +Provides: perl(DBM_Filter::compress) = 0.03 \ +Provides: perl(DBM_Filter::encode) = 0.03 \ +Provides: perl(DBM_Filter::int32) = 0.03 \ +Provides: perl(DBM_Filter::null) = 0.03 \ +Provides: perl(DBM_Filter::utf8) = 0.03 \ +Provides: perl(DirHandle) = 1.04 \ +Provides: perl(Dumpvalue) = 1.18 \ +Provides: perl(DynaLoader) = 1.38 \ +Provides: perl(EVERY) \ +Provides: perl(EVERY::LAST) \ +Provides: perl(English) = 1.10 \ +Provides: perl(ExtUtils::Constant) = 0.23 \ +Provides: perl(ExtUtils::Constant::Base) = 0.05 \ +Provides: perl(ExtUtils::Constant::ProxySubs) = 0.08 \ +Provides: perl(ExtUtils::Constant::Utils) = 0.03 \ +Provides: perl(ExtUtils::Constant::XS) = 0.03 \ +Provides: perl(Fcntl) = 1.13 \ +Provides: perl(File::Basename) = 2.85 \ +Provides: perl(File::Compare) = 1.1006 \ +Provides: perl(File::Copy) = 2.31 \ +Provides: perl(File::DosGlob) = 1.12 \ +Provides: perl(File::Find) = 1.34 \ +Provides: perl(File::Glob) = 1.26 \ +Provides: perl(File::stat) = 1.07 \ +Provides: perl(FileCache) = 1.09 \ +Provides: perl(FileHandle) = 2.02 \ +Provides: perl(FindBin) = 1.51 \ +Provides: perl(GDBM_File) = 1.15 \ +Provides: perl(Getopt::Std) = 1.11 \ +Provides: perl(Hash::Util) = 0.19 \ +Provides: perl(Hash::Util::FieldHash) = 1.19 \ +Provides: perl(I18N::Collate) = 1.02 \ +Provides: perl(I18N::LangTags) = 0.40 \ +Provides: perl(I18N::LangTags::Detect) = 1.05 \ +Provides: perl(I18N::LangTags::List) = 0.39 \ +Provides: perl(I18N::Langinfo) = 0.13 \ +Provides: perl(IPC::Open2) = 1.04 \ +Provides: perl(IPC::Open3) = 1.20 \ +Provides: perl(NDBM_File) = 1.14 \ +Provides: perl(NEXT) = 0.65 \ +Provides: perl(NEXT::ACTUAL) \ +Provides: perl(NEXT::ACTUAL::DISTINCT) \ +Provides: perl(NEXT::ACTUAL::UNSEEN) \ +Provides: perl(NEXT::DISTINCT) \ +Provides: perl(NEXT::DISTINCT::ACTUAL) \ +Provides: perl(NEXT::UNSEEN) \ +Provides: perl(NEXT::UNSEEN::ACTUAL) \ +Provides: perl(Net::hostent) = 1.01 \ +Provides: perl(Net::netent) = 1.00 \ +Provides: perl(Net::protoent) = 1.00 \ +Provides: perl(Net::servent) = 1.01 \ +Provides: perl(O) = 1.01 \ +Provides: perl(ODBM_File) = 1.14 \ +Provides: perl(Opcode) = 1.34 \ +Provides: perl(POSIX) = 1.65 \ +Provides: perl(POSIX::SigAction) \ +Provides: perl(POSIX::SigRt) \ +Provides: perl(POSIX::SigSet) \ +Provides: perl(PerlIO) = 1.09 \ +Provides: perl(PerlIO::encoding) = 0.24 \ +Provides: perl(PerlIO::mmap) = 0.016 \ +Provides: perl(PerlIO::scalar) = 0.24 \ +Provides: perl(PerlIO::via) = 0.17 \ +Provides: perl(Pod::Functions) = 1.10 \ +Provides: perl(SDBM_File) = 1.14 \ +Provides: perl(Safe) = 2.39 \ +Provides: perl(Search::Dict) = 1.07 \ +Provides: perl(SelectSaver) = 1.02 \ +Provides: perl(Symbol) = 1.07 \ +Provides: perl(Sys::Hostname) = 1.20 \ +Provides: perl(Term::Complete) = 1.403 \ +Provides: perl(Term::ReadLine) = 1.15 \ +Provides: perl(Term::ReadLine::Stub) \ +Provides: perl(Term::ReadLine::TermCap) \ +Provides: perl(Term::ReadLine::Tk) \ +Provides: perl(Text::Abbrev) = 1.02 \ +Provides: perl(Thread) = 3.04 \ +Provides: perl(Thread::Semaphore) = 2.12 \ +Provides: perl(Tie::Array) = 1.06 \ +Provides: perl(Tie::ExtraHash) \ +Provides: perl(Tie::File) = 1.02 \ +Provides: perl(Tie::File::Cache) \ +Provides: perl(Tie::File::Heap) \ +Provides: perl(Tie::Handle) = 4.2 \ +Provides: perl(Tie::Hash) \ +Provides: perl(Tie::Hash) = 1.05 \ +Provides: perl(Tie::Hash::NamedCapture) = 0.09 \ +Provides: perl(Tie::Memoize) = 1.1 \ +Provides: perl(Tie::RefHash) = 1.39 \ +Provides: perl(Tie::RefHash::Nestable) \ +Provides: perl(Tie::Scalar) = 1.04 \ +Provides: perl(Tie::StdArray) \ +Provides: perl(Tie::StdHandle) = 4.4 \ +Provides: perl(Tie::StdHash) \ +Provides: perl(Tie::StdScalar) \ +Provides: perl(Tie::SubstrHash) = 1.00 \ +Provides: perl(Time::gmtime) = 1.03 \ +Provides: perl(Time::localtime) = 1.02 \ +Provides: perl(Time::tm) = 1.00 \ +Provides: perl(UNIVERSAL) = 1.13 \ +Provides: perl(Unicode::UCD) = 0.64 \ +Provides: perl(User::grent) = 1.01 \ +Provides: perl(User::pwent) = 1.00 \ +Provides: perl(_charnames) = 1.43 \ +Provides: perl(arybase) = 0.11 \ +Provides: perl(attributes) = 0.27 \ +Provides: perl(autouse) = 1.11 \ +Provides: perl(base) = 2.23 \ +Provides: perl(blib) = 1.06 \ +Provides: perl(bytes) = 1.05 \ +Provides: perl(bytes_heavy.pl) \ +Provides: perl(charnames) = 1.43 \ +Provides: perl(deprecate) = 0.03 \ +Provides: perl(diagnostics) = 1.34 \ +Provides: perl(dumpvar.pl) \ +Provides: perl(encoding::warnings) = 0.12 \ +Provides: perl(feature) = 1.42 \ +Provides: perl(fields) = 2.23 \ +Provides: perl(filetest) = 1.03 \ +Provides: perl(if) = 0.0606 \ +Provides: perl(less) = 0.03 \ +Provides: perl(lib) = 0.63 \ +Provides: perl(locale) = 1.09 \ +Provides: perl(mro) = 1.18 \ +Provides: perl(ops) = 1.02 \ +Provides: perl(overload) = 1.26 \ +Provides: perl(overload::numbers) \ +Provides: perl(overloading) = 0.02 \ +Provides: perl(perl5db.pl) \ +Provides: perl(sigtrap) = 1.08 \ +Provides: perl(sort) = 2.02 \ +Provides: perl(subs) = 1.02 \ +Provides: perl(vars) = 1.03 \ +Provides: perl(vmsish) = 1.04 \ +Provides: perl(warnings::register) = 1.04 \ +Provides: perl(x86-64) = 4:5.24.4-397.RC1.fc26 \ +%{nil} +%global gendep_perl_Archive_Tar \ +Requires: perl(:VERSION) >= 5.5.0 \ +Requires: perl(Archive::Tar) \ +Requires: perl(Archive::Tar::Constant) \ +Requires: perl(Archive::Tar::File) \ +Requires: perl(Carp) \ +Requires: perl(Config) \ +Requires: perl(Cwd) \ +Requires: perl(Data::Dumper) \ +Requires: perl(Exporter) \ +Requires: perl(File::Basename) \ +Requires: perl(File::Find) \ +Requires: perl(File::Path) \ +Requires: perl(File::Spec) \ +Requires: perl(File::Spec::Unix) \ +Requires: perl(Getopt::Long) \ +Requires: perl(Getopt::Std) \ +Requires: perl(IO::File) \ +Requires: perl(IO::Handle) \ +Requires: perl(IO::Zlib) \ +Requires: perl(Pod::Usage) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Provides: perl(Archive::Tar) = 2.04 \ +Provides: perl(Archive::Tar::Constant) = 2.04 \ +Provides: perl(Archive::Tar::File) = 2.04 \ +%{nil} +%global gendep_perl_Attribute_Handlers \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Provides: perl(Attribute::Handlers) = 0.99 \ +%{nil} +%global gendep_perl_B_Debug \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(B) \ +Requires: perl(Config) \ +Requires: perl(strict) \ +Provides: perl(B::Debug) = 1.23 \ +%{nil} +%global gendep_perl_CPAN \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(App::Cpan) \ +Requires: perl(CPAN) >= 1.80 \ +Requires: perl(CPAN::Author) \ +Requires: perl(CPAN::Bundle) \ +Requires: perl(CPAN::CacheMgr) \ +Requires: perl(CPAN::Complete) \ +Requires: perl(CPAN::Debug) \ +Requires: perl(CPAN::DeferredCode) \ +Requires: perl(CPAN::Distribution) \ +Requires: perl(CPAN::Distroprefs) \ +Requires: perl(CPAN::Distrostatus) \ +Requires: perl(CPAN::Exception::RecursiveDependency) \ +Requires: perl(CPAN::Exception::yaml_not_installed) \ +Requires: perl(CPAN::Exception::yaml_process_error) \ +Requires: perl(CPAN::FTP) \ +Requires: perl(CPAN::FTP::netrc) \ +Requires: perl(CPAN::HTTP::Credentials) \ +Requires: perl(CPAN::HandleConfig) \ +Requires: perl(CPAN::Index) >= 1.93 \ +Requires: perl(CPAN::InfoObj) \ +Requires: perl(CPAN::LWP::UserAgent) \ +Requires: perl(CPAN::Mirrors) \ +Requires: perl(CPAN::Module) \ +Requires: perl(CPAN::Prompt) \ +Requires: perl(CPAN::Queue) \ +Requires: perl(CPAN::Shell) \ +Requires: perl(CPAN::Tarzip) \ +Requires: perl(CPAN::URL) \ +Requires: perl(CPAN::Version) \ +Requires: perl(Carp) \ +Requires: perl(Config) \ +Requires: perl(Cwd) \ +Requires: perl(DirHandle) \ +Requires: perl(Exporter) \ +Requires: perl(ExtUtils::MakeMaker) \ +Requires: perl(Fcntl) \ +Requires: perl(File::Basename) \ +Requires: perl(File::Copy) \ +Requires: perl(File::Find) \ +Requires: perl(File::Path) \ +Requires: perl(File::Spec) \ +Requires: perl(File::Spec::Functions) \ +Requires: perl(FileHandle) \ +Requires: perl(Getopt::Std) \ +Requires: perl(HTTP::Tiny) >= 0.005 \ +Requires: perl(Net::Ping) \ +Requires: perl(Safe) \ +Requires: perl(Sys::Hostname) \ +Requires: perl(Text::ParseWords) \ +Requires: perl(Text::Wrap) \ +Requires: perl(autouse) \ +Requires: perl(constant) \ +Requires: perl(if) \ +Requires: perl(overload) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Provides: perl(App::Cpan) = 1.63 \ +Provides: perl(CPAN) = 2.11 \ +Provides: perl(CPAN::Author) = 5.5002 \ +Provides: perl(CPAN::Bundle) = 5.5001 \ +Provides: perl(CPAN::CacheMgr) = 5.5002 \ +Provides: perl(CPAN::Complete) = 5.5001 \ +Provides: perl(CPAN::Debug) = 5.5001 \ +Provides: perl(CPAN::DeferredCode) = 5.50 \ +Provides: perl(CPAN::Distribution) = 2.04 \ +Provides: perl(CPAN::Distroprefs) = 6.0001 \ +Provides: perl(CPAN::Distroprefs::Iterator) \ +Provides: perl(CPAN::Distroprefs::Pref) \ +Provides: perl(CPAN::Distroprefs::Result) \ +Provides: perl(CPAN::Distroprefs::Result::Error) \ +Provides: perl(CPAN::Distroprefs::Result::Fatal) \ +Provides: perl(CPAN::Distroprefs::Result::Success) \ +Provides: perl(CPAN::Distroprefs::Result::Warning) \ +Provides: perl(CPAN::Distrostatus) = 5.5 \ +Provides: perl(CPAN::Eval) \ +Provides: perl(CPAN::Exception::RecursiveDependency) = 5.5 \ +Provides: perl(CPAN::Exception::blocked_urllist) = 1.001 \ +Provides: perl(CPAN::Exception::yaml_not_installed) = 5.5 \ +Provides: perl(CPAN::Exception::yaml_process_error) = 5.5 \ +Provides: perl(CPAN::FTP) = 5.5006 \ +Provides: perl(CPAN::FTP::netrc) = 1.01 \ +Provides: perl(CPAN::FirstTime) = 5.5307 \ +Provides: perl(CPAN::HTTP::Client) = 1.9601 \ +Provides: perl(CPAN::HTTP::Credentials) = 1.9601 \ +Provides: perl(CPAN::HandleConfig) = 5.5006 \ +Provides: perl(CPAN::Index) = 1.9601 \ +Provides: perl(CPAN::InfoObj) = 5.5 \ +Provides: perl(CPAN::Kwalify) = 5.50 \ +Provides: perl(CPAN::LWP::UserAgent) = 1.9601 \ +Provides: perl(CPAN::Mirrored::By) \ +Provides: perl(CPAN::Mirrors) = 1.9601 \ +Provides: perl(CPAN::Module) = 5.5002 \ +Provides: perl(CPAN::Nox) = 5.5001 \ +Provides: perl(CPAN::Plugin) = 0.95 \ +Provides: perl(CPAN::Plugin::Specfile) = 0.01 \ +Provides: perl(CPAN::Prompt) = 5.5 \ +Provides: perl(CPAN::Queue) = 5.5002 \ +Provides: perl(CPAN::Queue::Item) \ +Provides: perl(CPAN::Shell) = 5.5005 \ +Provides: perl(CPAN::Tarzip) = 5.5012 \ +Provides: perl(CPAN::URL) = 5.5 \ +Provides: perl(CPAN::Version) = 5.5003 \ +%{nil} +%global gendep_perl_CPAN_Meta \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(CPAN::Meta::Converter) >= 2.141170 \ +Requires: perl(CPAN::Meta::Feature) \ +Requires: perl(CPAN::Meta::Prereqs) \ +Requires: perl(CPAN::Meta::Requirements) >= 2.121 \ +Requires: perl(CPAN::Meta::Validator) \ +Requires: perl(Carp) \ +Requires: perl(Parse::CPAN::Meta) >= 1.4400 \ +Requires: perl(Parse::CPAN::Meta) >= 1.4414 \ +Requires: perl(Scalar::Util) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(CPAN::Meta) = 2.150005 \ +Provides: perl(CPAN::Meta::Converter) = 2.150005 \ +Provides: perl(CPAN::Meta::Feature) = 2.150005 \ +Provides: perl(CPAN::Meta::History) = 2.150005 \ +Provides: perl(CPAN::Meta::Merge) = 2.150005 \ +Provides: perl(CPAN::Meta::Prereqs) = 2.150005 \ +Provides: perl(CPAN::Meta::Spec) = 2.150005 \ +Provides: perl(CPAN::Meta::Validator) = 2.150005 \ +%{nil} +%global gendep_perl_CPAN_Meta_Requirements \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(CPAN::Meta::Requirements) = 2.132000 \ +%{nil} +%global gendep_perl_CPAN_Meta_YAML \ +Requires: perl(:VERSION) >= 5.8.1 \ +Requires: perl(B) \ +Requires: perl(Exporter) \ +Requires: perl(Scalar::Util) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(CPAN::Meta::YAML) = 0.018 \ +%{nil} +%global gendep_perl_Carp \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(Carp) = 1.40 \ +Provides: perl(Carp::Heavy) = 1.40 \ +Provides: perl(Carp::Heavy) = 1.40 \ +%{nil} +%global gendep_perl_Compress_Raw_Bzip2 \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(bytes) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(Compress::Raw::Bzip2) = 2.069 \ +%{nil} +%global gendep_perl_Compress_Raw_Zlib \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(bytes) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(Compress::Raw::Zlib) = 2.069 \ +%{nil} +%global gendep_perl_Config_Perl_V \ +Requires: perl(Config) \ +Requires: perl(Exporter) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Provides: perl(Config::Perl::V) = 0.25 \ +%{nil} +%global gendep_perl_DB_File \ +Requires: perl(:VERSION) >= 5.8.3 \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(File::Spec) \ +Requires: perl(Tie::Hash) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(DB_File) = 1.835 \ +Provides: perl(DB_File::BTREEINFO) \ +Provides: perl(DB_File::HASHINFO) \ +Provides: perl(DB_File::RECNOINFO) \ +%{nil} +%global gendep_perl_Data_Dumper \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(constant) \ +Requires: perl(overload) \ +Provides: perl(Data::Dumper) = 2.160 \ +%{nil} +%global gendep_perl_Devel_PPPort \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Devel::PPPort) = 3.32 \ +%{nil} +%global gendep_perl_Devel_Peek \ +Requires: perl(Exporter) \ +Requires: perl(XSLoader) \ +Provides: perl(Devel::Peek) = 1.23 \ +%{nil} +%global gendep_perl_Devel_SelfStubber \ +Requires: perl(File::Spec) \ +Requires: perl(SelfLoader) \ +Provides: perl(Devel::SelfStubber) = 1.05 \ +%{nil} +%global gendep_perl_Digest \ +Requires: perl(Carp) \ +Requires: perl(Digest) \ +Requires: perl(Exporter) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Digest) = 1.17 \ +Provides: perl(Digest::base) = 1.16 \ +Provides: perl(Digest::file) = 1.16 \ +%{nil} +%global gendep_perl_Digest_MD5 \ +Requires: perl(Exporter) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Digest::MD5) = 2.54 \ +%{nil} +%global gendep_perl_Digest_SHA \ +Requires: perl(:VERSION) >= 5.3.0 \ +Requires: perl(DynaLoader) \ +Requires: perl(Exporter) \ +Requires: perl(Fcntl) \ +Requires: perl(Getopt::Long) \ +Requires: perl(integer) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Provides: perl(Digest::SHA) = 5.95 \ +%{nil} +%global gendep_perl_Encode \ +Requires: perl(:VERSION) >= 5.8.0 \ +Requires: perl(:VERSION) >= 5.8.1 \ +Requires: perl(Carp) \ +Requires: perl(Encode) \ +Requires: perl(Encode::Alias) \ +Requires: perl(Encode::CJKConstants) \ +Requires: perl(Encode::CN::HZ) \ +Requires: perl(Encode::Config) \ +Requires: perl(Encode::Encoding) \ +Requires: perl(Encode::Guess) \ +Requires: perl(Encode::JP::JIS7) \ +Requires: perl(Encode::KR::2022_KR) \ +Requires: perl(Encode::MIME::Header) \ +Requires: perl(Encode::Unicode) \ +Requires: perl(Exporter) >= 5.57 \ +Requires: perl(File::Basename) \ +Requires: perl(Getopt::Long) \ +Requires: perl(Getopt::Std) \ +Requires: perl(MIME::Base64) \ +Requires: perl(XSLoader) \ +Requires: perl(bytes) \ +Requires: perl(constant) \ +Requires: perl(overload) \ +Requires: perl(parent) \ +Requires: perl(re) \ +Requires: perl(strict) \ +Requires: perl(utf8) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Provides: perl(Encode) = 2.80 \ +Provides: perl(Encode::Alias) = 2.20 \ +Provides: perl(Encode::Byte) = 2.4 \ +Provides: perl(Encode::CJKConstants) = 2.2 \ +Provides: perl(Encode::CN) = 2.3 \ +Provides: perl(Encode::CN::HZ) = 2.7 \ +Provides: perl(Encode::Config) = 2.5 \ +Provides: perl(Encode::EBCDIC) = 2.2 \ +Provides: perl(Encode::Encoder) = 2.3 \ +Provides: perl(Encode::Encoding) = 2.7 \ +Provides: perl(Encode::GSM0338) = 2.5 \ +Provides: perl(Encode::Guess) = 2.6 \ +Provides: perl(Encode::Internal) \ +Provides: perl(Encode::JP) = 2.4 \ +Provides: perl(Encode::JP::H2Z) = 2.2 \ +Provides: perl(Encode::JP::JIS7) = 2.5 \ +Provides: perl(Encode::KR) = 2.3 \ +Provides: perl(Encode::KR::2022_KR) = 2.3 \ +Provides: perl(Encode::MIME::Header) = 2.19 \ +Provides: perl(Encode::MIME::Header::ISO_2022_JP) = 1.4 \ +Provides: perl(Encode::MIME::Name) = 1.1 \ +Provides: perl(Encode::Symbol) = 2.2 \ +Provides: perl(Encode::TW) = 2.3 \ +Provides: perl(Encode::UTF_EBCDIC) \ +Provides: perl(Encode::Unicode) = 2.15 \ +Provides: perl(Encode::Unicode::UTF7) = 2.8 \ +Provides: perl(Encode::XS) \ +Provides: perl(Encode::utf8) \ +%{nil} +%global gendep_perl_Encode_devel \ +Requires: perl(Config) \ +Requires: perl(File::Find) \ +Requires: perl(Getopt::Std) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +%{nil} +%global gendep_perl_Env \ +Requires: perl(Config) \ +Requires: perl(Tie::Array) \ +Provides: perl(Env) = 1.04 \ +Provides: perl(Env::Array) \ +Provides: perl(Env::Array::VMS) \ +%{nil} +%global gendep_perl_Errno \ +Requires: perl(Config) \ +Requires: perl(Exporter) \ +Requires: perl(strict) \ +Provides: perl(Errno) = 1.25 \ +%{nil} +%global gendep_perl_Exporter \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Exporter) \ +Requires: perl(strict) \ +Provides: perl(Exporter) = 5.72 \ +Provides: perl(Exporter::Heavy) \ +%{nil} +%global gendep_perl_ExtUtils_CBuilder \ +Requires: perl(Config) \ +Requires: perl(Cwd) \ +Requires: perl(ExtUtils::CBuilder::Base) \ +Requires: perl(ExtUtils::CBuilder::Platform::Unix) \ +Requires: perl(File::Basename) \ +Requires: perl(File::Path) \ +Requires: perl(File::Spec) \ +Requires: perl(File::Spec::Functions) \ +Requires: perl(File::Temp) \ +Requires: perl(IO::File) \ +Requires: perl(IPC::Cmd) \ +Requires: perl(Perl::OSType) \ +Requires: perl(Text::ParseWords) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Provides: perl(ExtUtils::CBuilder) = 0.280225 \ +Provides: perl(ExtUtils::CBuilder::Base) = 0.280225 \ +Provides: perl(ExtUtils::CBuilder::Platform::Unix) = 0.280225 \ +Provides: perl(ExtUtils::CBuilder::Platform::VMS) = 0.280225 \ +Provides: perl(ExtUtils::CBuilder::Platform::Windows) = 0.280225 \ +Provides: perl(ExtUtils::CBuilder::Platform::Windows::BCC) = 0.280225 \ +Provides: perl(ExtUtils::CBuilder::Platform::Windows::GCC) = 0.280225 \ +Provides: perl(ExtUtils::CBuilder::Platform::Windows::MSVC) = 0.280225 \ +Provides: perl(ExtUtils::CBuilder::Platform::aix) = 0.280225 \ +Provides: perl(ExtUtils::CBuilder::Platform::android) = 0.280225 \ +Provides: perl(ExtUtils::CBuilder::Platform::cygwin) = 0.280225 \ +Provides: perl(ExtUtils::CBuilder::Platform::darwin) = 0.280225 \ +Provides: perl(ExtUtils::CBuilder::Platform::dec_osf) = 0.280225 \ +Provides: perl(ExtUtils::CBuilder::Platform::linux) = 0.280206 \ +Provides: perl(ExtUtils::CBuilder::Platform::os2) = 0.280225 \ +%{nil} +%global gendep_perl_ExtUtils_Command \ +Requires: perl(:VERSION) >= 5.5.30 \ +Requires: perl(Exporter) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(ExtUtils::Command) = 7.10 \ +%{nil} +%global gendep_perl_ExtUtils_Embed \ +Requires: perl(Config) \ +Requires: perl(Exporter) \ +Requires: perl(File::Spec) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(ExtUtils::Embed) = 1.33 \ +%{nil} +%global gendep_perl_ExtUtils_Install \ +Requires: perl(:VERSION) >= 5.5.30 \ +Requires: perl(AutoSplit) \ +Requires: perl(Carp) \ +Requires: perl(Config) \ +Requires: perl(Cwd) \ +Requires: perl(Exporter) \ +Requires: perl(ExtUtils::MakeMaker) \ +Requires: perl(ExtUtils::Packlist) \ +Requires: perl(File::Basename) \ +Requires: perl(File::Compare) \ +Requires: perl(File::Copy) \ +Requires: perl(File::Find) \ +Requires: perl(File::Path) \ +Requires: perl(File::Spec) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(ExtUtils::Install) = 2.04 \ +Provides: perl(ExtUtils::Install::Warn) \ +Provides: perl(ExtUtils::Installed) = 2.04 \ +Provides: perl(ExtUtils::Packlist) = 2.04 \ +%{nil} +%global gendep_perl_ExtUtils_MM_Utils \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(ExtUtils::MM::Utils) = 7.11 \ +%{nil} +%global gendep_perl_ExtUtils_MakeMaker \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(:VERSION) >= 5.6.2 \ +Requires: perl(Carp) \ +Requires: perl(Config) \ +Requires: perl(Cwd) \ +Requires: perl(DirHandle) \ +Requires: perl(Encode) \ +Requires: perl(Encode::Alias) \ +Requires: perl(Exporter) \ +Requires: perl(ExtUtils::Installed) \ +Requires: perl(ExtUtils::Liblist) \ +Requires: perl(ExtUtils::Liblist::Kid) \ +Requires: perl(ExtUtils::MM) \ +Requires: perl(ExtUtils::MM_Any) \ +Requires: perl(ExtUtils::MM_Unix) \ +Requires: perl(ExtUtils::MM_Win32) \ +Requires: perl(ExtUtils::MY) \ +Requires: perl(ExtUtils::MakeMaker) \ +Requires: perl(ExtUtils::MakeMaker::Config) \ +Requires: perl(ExtUtils::MakeMaker::version) \ +Requires: perl(ExtUtils::Packlist) \ +Requires: perl(File::Basename) \ +Requires: perl(File::Path) \ +Requires: perl(File::Spec) \ +Requires: perl(IO::File) \ +Requires: perl(base) \ +Requires: perl(lib) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Provides: perl(ExtUtils::Command::MM) = 7.10 \ +Provides: perl(ExtUtils::Liblist) = 7.10 \ +Provides: perl(ExtUtils::Liblist::Kid) = 7.10 \ +Provides: perl(ExtUtils::MM) = 7.10 \ +Provides: perl(ExtUtils::MM_AIX) = 7.10 \ +Provides: perl(ExtUtils::MM_Any) = 7.10 \ +Provides: perl(ExtUtils::MM_BeOS) = 7.10 \ +Provides: perl(ExtUtils::MM_Cygwin) = 7.10 \ +Provides: perl(ExtUtils::MM_DOS) = 7.10 \ +Provides: perl(ExtUtils::MM_Darwin) = 7.10 \ +Provides: perl(ExtUtils::MM_MacOS) = 7.10 \ +Provides: perl(ExtUtils::MM_NW5) = 7.10 \ +Provides: perl(ExtUtils::MM_OS2) = 7.10 \ +Provides: perl(ExtUtils::MM_QNX) = 7.10 \ +Provides: perl(ExtUtils::MM_UWIN) = 7.10 \ +Provides: perl(ExtUtils::MM_Unix) = 7.10 \ +Provides: perl(ExtUtils::MM_VMS) = 7.10 \ +Provides: perl(ExtUtils::MM_VOS) = 7.10 \ +Provides: perl(ExtUtils::MM_Win32) = 7.10 \ +Provides: perl(ExtUtils::MM_Win95) = 7.10 \ +Provides: perl(ExtUtils::MY) = 7.10 \ +Provides: perl(ExtUtils::MakeMaker) = 7.10 \ +Provides: perl(ExtUtils::MakeMaker::Config) = 7.10 \ +Provides: perl(ExtUtils::MakeMaker::Locale) = 7.10 \ +Provides: perl(ExtUtils::MakeMaker::version) = 7.10 \ +Provides: perl(ExtUtils::Mkbootstrap) = 7.10 \ +Provides: perl(ExtUtils::Mksymlists) = 7.10 \ +Provides: perl(ExtUtils::testlib) = 7.10 \ +Provides: perl(MM) \ +Provides: perl(MY) \ +%{nil} +%global gendep_perl_ExtUtils_Manifest \ +Requires: perl(Carp) \ +Requires: perl(Config) \ +Requires: perl(Exporter) \ +Requires: perl(File::Basename) \ +Requires: perl(File::Copy) \ +Requires: perl(File::Find) \ +Requires: perl(File::Spec) >= 0.8 \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(ExtUtils::Manifest) = 1.70 \ +%{nil} +%global gendep_perl_ExtUtils_Miniperl \ +Requires: perl(Exporter) \ +Requires: perl(ExtUtils::Embed) >= 1.31 \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(ExtUtils::Miniperl) = 1.05 \ +%{nil} +%global gendep_perl_ExtUtils_ParseXS \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(:VERSION) >= 5.6.1 \ +Requires: perl(Config) \ +Requires: perl(Cwd) \ +Requires: perl(Exporter) \ +Requires: perl(ExtUtils::ParseXS) \ +Requires: perl(ExtUtils::ParseXS::Constants) \ +Requires: perl(ExtUtils::ParseXS::CountLines) \ +Requires: perl(ExtUtils::ParseXS::Eval) \ +Requires: perl(ExtUtils::ParseXS::Utilities) \ +Requires: perl(ExtUtils::Typemaps) \ +Requires: perl(ExtUtils::Typemaps::InputMap) \ +Requires: perl(ExtUtils::Typemaps::OutputMap) \ +Requires: perl(ExtUtils::Typemaps::Type) \ +Requires: perl(File::Basename) \ +Requires: perl(File::Spec) \ +Requires: perl(Getopt::Long) \ +Requires: perl(Symbol) \ +Requires: perl(re) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(ExtUtils::ParseXS) = 3.31 \ +Provides: perl(ExtUtils::ParseXS::Constants) = 3.31 \ +Provides: perl(ExtUtils::ParseXS::CountLines) = 3.31 \ +Provides: perl(ExtUtils::ParseXS::Eval) = 3.31 \ +Provides: perl(ExtUtils::ParseXS::Utilities) = 3.31 \ +Provides: perl(ExtUtils::Typemaps) = 3.31 \ +Provides: perl(ExtUtils::Typemaps::Cmd) = 3.31 \ +Provides: perl(ExtUtils::Typemaps::InputMap) = 3.31 \ +Provides: perl(ExtUtils::Typemaps::OutputMap) = 3.31 \ +Provides: perl(ExtUtils::Typemaps::Type) = 3.31 \ +%{nil} +%global gendep_perl_File_Fetch \ +Requires: perl(Carp) \ +Requires: perl(Cwd) \ +Requires: perl(File::Basename) \ +Requires: perl(File::Copy) \ +Requires: perl(File::Path) \ +Requires: perl(File::Spec) \ +Requires: perl(File::Spec::Unix) \ +Requires: perl(File::Temp) \ +Requires: perl(FileHandle) \ +Requires: perl(IPC::Cmd) \ +Requires: perl(Locale::Maketext::Simple) \ +Requires: perl(Module::Load::Conditional) \ +Requires: perl(Params::Check) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(File::Fetch) = 0.48 \ +%{nil} +%global gendep_perl_File_Path \ +Requires: perl(:VERSION) >= 5.5.0 \ +Requires: perl(Cwd) \ +Requires: perl(Exporter) \ +Requires: perl(File::Basename) \ +Requires: perl(File::Spec) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(File::Path) = 2.12 \ +%{nil} +%global gendep_perl_File_Temp \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(Cwd) \ +Requires: perl(Errno) \ +Requires: perl(Exporter) >= 5.57 \ +Requires: perl(Fcntl) >= 1.03 \ +Requires: perl(File::Path) >= 2.06 \ +Requires: perl(File::Spec) >= 0.8 \ +Requires: perl(IO::Handle) \ +Requires: perl(IO::Seekable) \ +Requires: perl(Scalar::Util) \ +Requires: perl(Symbol) \ +Requires: perl(constant) \ +Requires: perl(overload) \ +Requires: perl(parent) >= 0.221 \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(File::Temp) = 0.2304 \ +Provides: perl(File::Temp::Dir) \ +%{nil} +%global gendep_perl_Filter \ +Requires: perl(:VERSION) >= 5.5.0 \ +Requires: perl(Carp) \ +Requires: perl(DynaLoader) \ +Requires: perl(Exporter) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Provides: perl(Filter::Util::Call) = 1.55 \ +%{nil} +%global gendep_perl_Filter_Simple \ +Requires: perl(Carp) \ +Requires: perl(Filter::Util::Call) \ +Requires: perl(Text::Balanced) \ +Requires: perl(vars) \ +Provides: perl(Filter::Simple) = 0.92 \ +%{nil} +%global gendep_perl_Getopt_Long \ +Requires: perl(:VERSION) >= 5.4.0 \ +Requires: perl(Exporter) \ +Requires: perl(constant) \ +Requires: perl(overload) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Getopt::Long) = 2.48 \ +Provides: perl(Getopt::Long::CallBack) \ +Provides: perl(Getopt::Long::Parser) \ +%{nil} +%global gendep_perl_HTTP_Tiny \ +Requires: perl(Carp) \ +Requires: perl(Errno) \ +Requires: perl(IO::Socket) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(HTTP::Tiny) = 0.056 \ +%{nil} +%global gendep_perl_IO \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(Errno) \ +Requires: perl(Exporter) \ +Requires: perl(Fcntl) \ +Requires: perl(File::Spec) \ +Requires: perl(File::stat) \ +Requires: perl(IO) \ +Requires: perl(IO::File) \ +Requires: perl(IO::Handle) \ +Requires: perl(IO::Seekable) \ +Requires: perl(IO::Socket) \ +Requires: perl(IO::Socket::INET) \ +Requires: perl(IO::Socket::UNIX) \ +Requires: perl(SelectSaver) \ +Requires: perl(Socket) >= 1.3 \ +Requires: perl(Symbol) \ +Requires: perl(Tie::Hash) \ +Requires: perl(XSLoader) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Requires: perl(warnings::register) \ +Provides: perl(IO) = 1.36 \ +Provides: perl(IO::Dir) = 1.10 \ +Provides: perl(IO::File) = 1.16 \ +Provides: perl(IO::Handle) = 1.36 \ +Provides: perl(IO::Pipe) = 1.15 \ +Provides: perl(IO::Pipe::End) \ +Provides: perl(IO::Poll) = 0.10 \ +Provides: perl(IO::Seekable) = 1.10 \ +Provides: perl(IO::Select) = 1.22 \ +Provides: perl(IO::Socket) = 1.38 \ +Provides: perl(IO::Socket::INET) = 1.35 \ +Provides: perl(IO::Socket::UNIX) = 1.26 \ +%{nil} +%global gendep_perl_IO_Compress \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(Compress::Raw::Bzip2) >= 2.069 \ +Requires: perl(Compress::Raw::Zlib) >= 2.069 \ +Requires: perl(Config) \ +Requires: perl(Encode) \ +Requires: perl(Exporter) \ +Requires: perl(Fcntl) \ +Requires: perl(File::GlobMapper) \ +Requires: perl(File::Spec) \ +Requires: perl(IO::Compress::Adapter::Bzip2) >= 2.069 \ +Requires: perl(IO::Compress::Adapter::Deflate) >= 2.069 \ +Requires: perl(IO::Compress::Adapter::Identity) >= 2.069 \ +Requires: perl(IO::Compress::Base) >= 2.069 \ +Requires: perl(IO::Compress::Base::Common) >= 2.069 \ +Requires: perl(IO::Compress::Gzip) >= 2.069 \ +Requires: perl(IO::Compress::Gzip::Constants) >= 2.069 \ +Requires: perl(IO::Compress::RawDeflate) >= 2.069 \ +Requires: perl(IO::Compress::Zip::Constants) >= 2.069 \ +Requires: perl(IO::Compress::Zlib::Constants) >= 2.069 \ +Requires: perl(IO::Compress::Zlib::Extra) >= 2.069 \ +Requires: perl(IO::File) \ +Requires: perl(IO::Handle) \ +Requires: perl(IO::Uncompress::Adapter::Bunzip2) >= 2.069 \ +Requires: perl(IO::Uncompress::Adapter::Identity) >= 2.069 \ +Requires: perl(IO::Uncompress::Adapter::Inflate) >= 2.069 \ +Requires: perl(IO::Uncompress::Base) >= 2.069 \ +Requires: perl(IO::Uncompress::Gunzip) >= 2.069 \ +Requires: perl(IO::Uncompress::Inflate) >= 2.069 \ +Requires: perl(IO::Uncompress::RawInflate) >= 2.069 \ +Requires: perl(IO::Uncompress::Unzip) >= 2.069 \ +Requires: perl(List::Util) \ +Requires: perl(POSIX) \ +Requires: perl(Scalar::Util) \ +Requires: perl(Symbol) \ +Requires: perl(bytes) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(utf8) \ +Requires: perl(warnings) \ +Provides: perl(Compress::Zlib) = 2.069 \ +Provides: perl(File::GlobMapper) = 1.000 \ +Provides: perl(IO::Compress::Adapter::Bzip2) = 2.069 \ +Provides: perl(IO::Compress::Adapter::Deflate) = 2.069 \ +Provides: perl(IO::Compress::Adapter::Identity) = 2.069 \ +Provides: perl(IO::Compress::Base) = 2.069 \ +Provides: perl(IO::Compress::Base::Common) = 2.069 \ +Provides: perl(IO::Compress::Bzip2) = 2.069 \ +Provides: perl(IO::Compress::Deflate) = 2.069 \ +Provides: perl(IO::Compress::Gzip) = 2.069 \ +Provides: perl(IO::Compress::Gzip::Constants) = 2.069 \ +Provides: perl(IO::Compress::RawDeflate) = 2.069 \ +Provides: perl(IO::Compress::Zip) = 2.069 \ +Provides: perl(IO::Compress::Zip::Constants) = 2.069 \ +Provides: perl(IO::Compress::Zlib::Constants) = 2.069 \ +Provides: perl(IO::Compress::Zlib::Extra) = 2.069 \ +Provides: perl(IO::Uncompress::Adapter::Bunzip2) = 2.069 \ +Provides: perl(IO::Uncompress::Adapter::Identity) = 2.069 \ +Provides: perl(IO::Uncompress::Adapter::Inflate) = 2.069 \ +Provides: perl(IO::Uncompress::AnyInflate) = 2.069 \ +Provides: perl(IO::Uncompress::AnyUncompress) = 2.069 \ +Provides: perl(IO::Uncompress::Base) = 2.069 \ +Provides: perl(IO::Uncompress::Bunzip2) \ +Provides: perl(IO::Uncompress::Bunzip2) = 2.069 \ +Provides: perl(IO::Uncompress::Gunzip) = 2.069 \ +Provides: perl(IO::Uncompress::Inflate) = 2.069 \ +Provides: perl(IO::Uncompress::RawInflate) = 2.069 \ +Provides: perl(IO::Uncompress::Unzip) = 2.069 \ +Provides: perl(U64) \ +Provides: perl(Zlib::OldDeflate) \ +Provides: perl(Zlib::OldInflate) \ +%{nil} +%global gendep_perl_IO_Socket_IP \ +Requires: perl(Carp) \ +Requires: perl(Errno) \ +Requires: perl(IO::Socket) \ +Requires: perl(IO::Socket::IP) \ +Requires: perl(POSIX) \ +Requires: perl(Socket) >= 1.97 \ +Requires: perl(base) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(IO::Socket::IP) = 0.37 \ +%{nil} +%global gendep_perl_IO_Zlib \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(Fcntl) \ +Requires: perl(Symbol) \ +Requires: perl(Tie::Handle) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(IO::Zlib) = 1.10 \ +%{nil} +%global gendep_perl_IPC_Cmd \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(File::Spec) \ +Requires: perl(Locale::Maketext::Simple) \ +Requires: perl(Module::Load::Conditional) \ +Requires: perl(Params::Check) \ +Requires: perl(Symbol) \ +Requires: perl(Text::ParseWords) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(IPC::Cmd) = 0.92 \ +%{nil} +%global gendep_perl_IPC_SysV \ +Requires: perl(Carp) \ +Requires: perl(Class::Struct) \ +Requires: perl(Config) \ +Requires: perl(Exporter) \ +Requires: perl(IPC::SysV) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(IPC::Msg) = 2.06 \ +Provides: perl(IPC::Msg::stat) \ +Provides: perl(IPC::Semaphore) = 2.06 \ +Provides: perl(IPC::Semaphore::stat) \ +Provides: perl(IPC::SharedMem) = 2.06 \ +Provides: perl(IPC::SharedMem::stat) \ +Provides: perl(IPC::SysV) = 2.06 \ +%{nil} +%global gendep_perl_JSON_PP \ +Requires: perl(:VERSION) >= 5.5.0 \ +Requires: perl(B) \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(Getopt::Long) \ +Requires: perl(JSON::PP) \ +Requires: perl(base) \ +Requires: perl(bytes) \ +Requires: perl(constant) \ +Requires: perl(overload) \ +Requires: perl(strict) \ +Provides: perl(JSON::PP) = 2.27300 \ +Provides: perl(JSON::PP::Boolean) \ +Provides: perl(JSON::PP::IncrParser) = 1.01 \ +%{nil} +%global gendep_perl_Locale_Codes \ +Requires: perl(:VERSION) >= 5.2.0 \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(Locale::Codes) \ +Requires: perl(Locale::Codes::Constants) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(utf8) \ +Requires: perl(warnings) \ +Provides: perl(Locale::Codes) = 3.25 \ +Provides: perl(Locale::Codes) = 3.37 \ +Provides: perl(Locale::Codes::Constants) = 3.37 \ +Provides: perl(Locale::Codes::Country) = 3.37 \ +Provides: perl(Locale::Codes::Currency) = 3.37 \ +Provides: perl(Locale::Codes::LangExt) = 3.37 \ +Provides: perl(Locale::Codes::LangFam) = 3.37 \ +Provides: perl(Locale::Codes::LangVar) = 3.37 \ +Provides: perl(Locale::Codes::Language) = 3.37 \ +Provides: perl(Locale::Codes::Script) = 3.37 \ +Provides: perl(Locale::Country) = 3.37 \ +Provides: perl(Locale::Currency) = 3.37 \ +Provides: perl(Locale::Language) = 3.37 \ +Provides: perl(Locale::Script) = 3.37 \ +%{nil} +%global gendep_perl_Locale_Maketext \ +Requires: perl(Carp) \ +Requires: perl(I18N::LangTags) \ +Requires: perl(I18N::LangTags::Detect) \ +Requires: perl(Locale::Maketext) \ +Requires: perl(integer) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Locale::Maketext) = 1.26 \ +Provides: perl(Locale::Maketext::Guts) = 1.20 \ +Provides: perl(Locale::Maketext::GutsLoader) = 1.20 \ +%{nil} +%global gendep_perl_Locale_Maketext_Simple \ +Requires: perl(:VERSION) >= 5.5.0 \ +Requires: perl(Locale::Maketext) \ +Requires: perl(base) \ +Requires: perl(strict) \ +Provides: perl(Locale::Maketext::Simple) = 0.21 \ +%{nil} +%global gendep_perl_MIME_Base64 \ +Requires: perl(Exporter) \ +Requires: perl(MIME::Base64) \ +Requires: perl(XSLoader) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(MIME::Base64) = 3.15 \ +Provides: perl(MIME::QuotedPrint) = 3.13 \ +%{nil} +%global gendep_perl_Math_BigInt \ +Requires: perl(:VERSION) >= 5.6.1 \ +Requires: perl(Exporter) \ +Requires: perl(constant) \ +Requires: perl(integer) \ +Requires: perl(overload) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(Math::BigFloat) = 1.999715 \ +Provides: perl(Math::BigInt) = 1.999715 \ +Provides: perl(Math::BigInt::Calc) = 1.999715 \ +Provides: perl(Math::BigInt::CalcEmu) = 1.999715 \ +%{nil} +%global gendep_perl_Math_BigInt_FastCalc \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Math::BigInt::Calc) >= 1.999706 \ +Requires: perl(XSLoader) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(Math::BigInt::FastCalc) = 0.40 \ +%{nil} +%global gendep_perl_Math_BigRat \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(Math::BigFloat) \ +Requires: perl(overload) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(Math::BigRat) = 0.260802 \ +%{nil} +%global gendep_perl_Math_Complex \ +Requires: perl(Config) \ +Requires: perl(Exporter) \ +Requires: perl(Math::Complex) >= 1.59 \ +Requires: perl(Scalar::Util) \ +Requires: perl(overload) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(Math::Complex) = 1.59 \ +Provides: perl(Math::Trig) = 1.23 \ +%{nil} +%global gendep_perl_Memoize \ +Requires: perl(Carp) \ +Requires: perl(Config) \ +Requires: perl(Exporter) \ +Requires: perl(NDBM_File) \ +Requires: perl(SDBM_File) \ +Requires: perl(Storable) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Memoize) = 1.03 \ +Provides: perl(Memoize::AnyDBM_File) = 1.03 \ +Provides: perl(Memoize::Expire) = 1.03 \ +Provides: perl(Memoize::ExpireFile) = 1.03 \ +Provides: perl(Memoize::ExpireTest) = 1.03 \ +Provides: perl(Memoize::NDBM_File) = 1.03 \ +Provides: perl(Memoize::SDBM_File) = 1.03 \ +Provides: perl(Memoize::Storable) = 1.03 \ +%{nil} +%global gendep_perl_Module_CoreList \ +Requires: perl(Module::CoreList) \ +Requires: perl(Module::CoreList::TieHashDelta) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(version) \ +Requires: perl(warnings) \ +Provides: perl(Module::CoreList) = 5.20180414 \ +Provides: perl(Module::CoreList::TieHashDelta) = 5.20180414 \ +Provides: perl(Module::CoreList::Utils) = 5.20180414 \ +%{nil} +%global gendep_perl_Module_CoreList_tools \ +Requires: perl(Getopt::Long) \ +Requires: perl(List::Util) \ +Requires: perl(Module::CoreList) \ +Requires: perl(Pod::Usage) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +%{nil} +%global gendep_perl_Module_Load \ +Requires: perl(File::Spec) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(Module::Load) = 0.32 \ +%{nil} +%global gendep_perl_Module_Load_Conditional \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(File::Spec) \ +Requires: perl(FileHandle) \ +Requires: perl(Locale::Maketext::Simple) \ +Requires: perl(Module::Load) \ +Requires: perl(Module::Metadata) \ +Requires: perl(Params::Check) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(version) \ +Provides: perl(Module::Load::Conditional) = 0.64 \ +%{nil} +%global gendep_perl_Module_Loaded \ +Requires: perl(Carp) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Module::Loaded) = 0.08 \ +%{nil} +%global gendep_perl_Module_Metadata \ +Requires: perl(Carp) \ +Requires: perl(File::Find) \ +Requires: perl(File::Spec) \ +Requires: perl(strict) \ +Requires: perl(version) >= 0.87 \ +Requires: perl(warnings) \ +Provides: perl(Module::Metadata) = 1.000031 \ +%{nil} +%global gendep_perl_Net_Ping \ +Requires: perl(:VERSION) >= 5.2.0 \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(Fcntl) \ +Requires: perl(FileHandle) \ +Requires: perl(POSIX) \ +Requires: perl(Socket) \ +Requires: perl(Time::HiRes) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Net::Ping) = 2.43 \ +%{nil} +%global gendep_perl_Params_Check \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(Locale::Maketext::Simple) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Params::Check) = 0.38 \ +%{nil} +%global gendep_perl_Parse_CPAN_Meta \ +Requires: perl(:VERSION) >= 5.8.1 \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(strict) \ +Provides: perl(Parse::CPAN::Meta) = 1.4417 \ +%{nil} +%global gendep_perl_PathTools \ +Requires: perl(Exporter) \ +Requires: perl(File::Spec) \ +Requires: perl(File::Spec::Unix) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Cwd) = 3.63 \ +Provides: perl(File::Spec) = 3.63 \ +Provides: perl(File::Spec::AmigaOS) = 3.64 \ +Provides: perl(File::Spec::Cygwin) = 3.63 \ +Provides: perl(File::Spec::Epoc) = 3.63 \ +Provides: perl(File::Spec::Functions) = 3.63 \ +Provides: perl(File::Spec::Mac) = 3.63 \ +Provides: perl(File::Spec::OS2) = 3.63 \ +Provides: perl(File::Spec::Unix) = 3.63 \ +Provides: perl(File::Spec::Win32) = 3.63 \ +%{nil} +%global gendep_perl_Perl_OSType \ +Requires: perl(Exporter) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(Perl::OSType) = 1.009 \ +%{nil} +%global gendep_perl_PerlIO_via_QuotedPrint \ +Requires: perl(MIME::QuotedPrint) \ +Requires: perl(strict) \ +Provides: perl(PerlIO::via::QuotedPrint) = 0.08 \ +%{nil} +%global gendep_perl_Pod_Checker \ +Requires: perl(:VERSION) >= 5.5.0 \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(Getopt::Long) \ +Requires: perl(Pod::Checker) \ +Requires: perl(Pod::ParseUtils) \ +Requires: perl(Pod::Parser) \ +Requires: perl(Pod::Usage) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Pod::Checker) = 1.60 \ +%{nil} +%global gendep_perl_Pod_Escapes \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Exporter) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Provides: perl(Pod::Escapes) = 1.07 \ +%{nil} +%global gendep_perl_Pod_Html \ +Requires: perl(Carp) \ +Requires: perl(Config) \ +Requires: perl(Cwd) \ +Requires: perl(Exporter) \ +Requires: perl(File::Basename) \ +Requires: perl(File::Spec) \ +Requires: perl(File::Spec::Unix) \ +Requires: perl(Getopt::Long) \ +Requires: perl(Pod::Html) \ +Requires: perl(Pod::Simple::Search) \ +Requires: perl(Pod::Simple::XHTML) \ +Requires: perl(locale) \ +Requires: perl(parent) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Provides: perl(Pod::Html) = 1.2201 \ +Provides: perl(Pod::Simple::XHTML::LocalPodLinks) \ +%{nil} +%global gendep_perl_Pod_Parser \ +Requires: perl(:VERSION) >= 5.5.0 \ +Requires: perl(Carp) \ +Requires: perl(Cwd) \ +Requires: perl(Exporter) \ +Requires: perl(File::Find) \ +Requires: perl(File::Spec) \ +Requires: perl(Getopt::Long) \ +Requires: perl(Pod::InputObjects) \ +Requires: perl(Pod::Parser) >= 1.04 \ +Requires: perl(Pod::Select) \ +Requires: perl(Pod::Usage) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Pod::Cache) \ +Provides: perl(Pod::Cache::Item) \ +Provides: perl(Pod::Find) = 1.63 \ +Provides: perl(Pod::Hyperlink) \ +Provides: perl(Pod::InputObjects) = 1.63 \ +Provides: perl(Pod::InputSource) \ +Provides: perl(Pod::InteriorSequence) \ +Provides: perl(Pod::List) \ +Provides: perl(Pod::Paragraph) \ +Provides: perl(Pod::ParseTree) \ +Provides: perl(Pod::ParseUtils) = 1.63 \ +Provides: perl(Pod::Parser) = 1.63 \ +Provides: perl(Pod::PlainText) = 2.07 \ +Provides: perl(Pod::Select) = 1.63 \ +%{nil} +%global gendep_perl_Pod_Perldoc \ +Requires: perl(:VERSION) >= 5.0.0 \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(Config) \ +Requires: perl(Encode) \ +Requires: perl(Fcntl) \ +Requires: perl(File::Basename) \ +Requires: perl(File::Spec::Functions) \ +Requires: perl(IO::Select) \ +Requires: perl(Pod::Man) >= 2.18 \ +Requires: perl(Pod::Perldoc) \ +Requires: perl(Pod::Perldoc::BaseTo) \ +Requires: perl(Pod::Perldoc::GetOptsOO) \ +Requires: perl(Pod::Simple::RTF) \ +Requires: perl(Pod::Simple::XMLOutStream) \ +Requires: perl(Pod::Text) \ +Requires: perl(Pod::Text::Color) \ +Requires: perl(Pod::Text::Termcap) \ +Requires: perl(parent) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Provides: perl(Pod::Perldoc) = 3.25 \ +Provides: perl(Pod::Perldoc::BaseTo) = 3.25 \ +Provides: perl(Pod::Perldoc::GetOptsOO) = 3.25 \ +Provides: perl(Pod::Perldoc::ToANSI) = 3.25 \ +Provides: perl(Pod::Perldoc::ToChecker) = 3.25 \ +Provides: perl(Pod::Perldoc::ToMan) = 3.25 \ +Provides: perl(Pod::Perldoc::ToNroff) = 3.25 \ +Provides: perl(Pod::Perldoc::ToPod) = 3.25 \ +Provides: perl(Pod::Perldoc::ToRtf) = 3.25 \ +Provides: perl(Pod::Perldoc::ToTerm) = 3.25 \ +Provides: perl(Pod::Perldoc::ToText) = 3.25 \ +Provides: perl(Pod::Perldoc::ToTk) = 3.25 \ +Provides: perl(Pod::Perldoc::ToXml) = 3.25 \ +%{nil} +%global gendep_perl_Pod_Simple \ +Requires: perl(:VERSION) >= 5.0.0 \ +Requires: perl(:VERSION) >= 5.5.0 \ +Requires: perl(:VERSION) >= 5.8.0 \ +Requires: perl(Carp) \ +Requires: perl(Config) \ +Requires: perl(Cwd) \ +Requires: perl(Encode) \ +Requires: perl(File::Basename) \ +Requires: perl(File::Spec) \ +Requires: perl(Getopt::Long) \ +Requires: perl(Pod::Escapes) >= 1.04 \ +Requires: perl(Pod::Simple) \ +Requires: perl(Pod::Simple::BlackBox) \ +Requires: perl(Pod::Simple::HTML) \ +Requires: perl(Pod::Simple::LinkSection) \ +Requires: perl(Pod::Simple::Methody) \ +Requires: perl(Pod::Simple::PullParser) \ +Requires: perl(Pod::Simple::PullParserEndToken) \ +Requires: perl(Pod::Simple::PullParserStartToken) \ +Requires: perl(Pod::Simple::PullParserTextToken) \ +Requires: perl(Pod::Simple::PullParserToken) \ +Requires: perl(Pod::Simple::Search) \ +Requires: perl(Symbol) \ +Requires: perl(Text::Wrap) >= 98.112902 \ +Requires: perl(integer) \ +Requires: perl(overload) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Pod::Simple) = 3.32 \ +Provides: perl(Pod::Simple::BlackBox) = 3.32 \ +Provides: perl(Pod::Simple::Checker) = 3.32 \ +Provides: perl(Pod::Simple::Debug) = 3.32 \ +Provides: perl(Pod::Simple::DumpAsText) = 3.32 \ +Provides: perl(Pod::Simple::DumpAsXML) = 3.32 \ +Provides: perl(Pod::Simple::HTML) = 3.32 \ +Provides: perl(Pod::Simple::HTMLBatch) = 3.32 \ +Provides: perl(Pod::Simple::HTMLLegacy) = 5.01 \ +Provides: perl(Pod::Simple::LinkSection) = 3.32 \ +Provides: perl(Pod::Simple::Methody) = 3.32 \ +Provides: perl(Pod::Simple::Progress) = 3.32 \ +Provides: perl(Pod::Simple::PullParser) = 3.32 \ +Provides: perl(Pod::Simple::PullParserEndToken) = 3.32 \ +Provides: perl(Pod::Simple::PullParserStartToken) = 3.32 \ +Provides: perl(Pod::Simple::PullParserTextToken) = 3.32 \ +Provides: perl(Pod::Simple::PullParserToken) = 3.32 \ +Provides: perl(Pod::Simple::RTF) = 3.32 \ +Provides: perl(Pod::Simple::Search) = 3.32 \ +Provides: perl(Pod::Simple::SimpleTree) = 3.32 \ +Provides: perl(Pod::Simple::Text) = 3.32 \ +Provides: perl(Pod::Simple::TextContent) = 3.32 \ +Provides: perl(Pod::Simple::TiedOutFH) = 3.32 \ +Provides: perl(Pod::Simple::Transcode) = 3.32 \ +Provides: perl(Pod::Simple::TranscodeDumb) = 3.32 \ +Provides: perl(Pod::Simple::TranscodeSmart) = 3.32 \ +Provides: perl(Pod::Simple::XHTML) = 3.32 \ +Provides: perl(Pod::Simple::XMLOutStream) = 3.32 \ +%{nil} +%global gendep_perl_Pod_Usage \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(Config) \ +Requires: perl(Exporter) \ +Requires: perl(File::Spec) \ +Requires: perl(Getopt::Long) \ +Requires: perl(Pod::Usage) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Pod::Usage) = 1.68 \ +%{nil} +%global gendep_perl_Scalar_List_Utils \ +Requires: perl(Exporter) \ +Requires: perl(List::Util) \ +Requires: perl(XSLoader) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(List::Util) = 1.42 \ +Provides: perl(List::Util::XS) = 1.42 \ +Provides: perl(Scalar::Util) = 1.42 \ +Provides: perl(Sub::Util) = 1.42 \ +%{nil} +%global gendep_perl_SelfLoader \ +Requires: perl(:VERSION) >= 5.8.0 \ +Requires: perl(Exporter) \ +Requires: perl(IO::Handle) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(SelfLoader) = 1.23 \ +%{nil} +%global gendep_perl_Socket \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(XSLoader) \ +Requires: perl(strict) \ +Requires: perl(warnings::register) \ +Provides: perl(Socket) = 2.020 \ +%{nil} +%global gendep_perl_Storable \ +Requires: perl(Exporter) \ +Requires: perl(XSLoader) \ +Requires: perl(vars) \ +Provides: perl(Storable) = 2.56 \ +%{nil} +%global gendep_perl_Sys_Syslog \ +Requires: perl(:VERSION) >= 5.5.0 \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(File::Basename) \ +Requires: perl(POSIX) \ +Requires: perl(Socket) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Requires: perl(warnings::register) \ +Provides: perl(Sys::Syslog) = 0.33 \ +%{nil} +%global gendep_perl_Term_ANSIColor \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(Term::ANSIColor) = 4.04 \ +%{nil} +%global gendep_perl_Term_Cap \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Term::Cap) = 1.17 \ +%{nil} +%global gendep_perl_Test \ +Requires: perl(:VERSION) >= 5.4.0 \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Test) = 1.28 \ +%{nil} +%global gendep_perl_Test_Harness \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(App::Prove) \ +Requires: perl(App::Prove::State) \ +Requires: perl(App::Prove::State::Result) \ +Requires: perl(App::Prove::State::Result::Test) \ +Requires: perl(Benchmark) \ +Requires: perl(Carp) \ +Requires: perl(Config) \ +Requires: perl(Exporter) \ +Requires: perl(File::Basename) \ +Requires: perl(File::Find) \ +Requires: perl(File::Path) \ +Requires: perl(File::Spec) \ +Requires: perl(Getopt::Long) \ +Requires: perl(IO::Handle) \ +Requires: perl(IO::Select) \ +Requires: perl(POSIX) \ +Requires: perl(TAP::Base) \ +Requires: perl(TAP::Formatter::Base) \ +Requires: perl(TAP::Formatter::Console::Session) \ +Requires: perl(TAP::Formatter::File::Session) \ +Requires: perl(TAP::Formatter::Session) \ +Requires: perl(TAP::Harness) \ +Requires: perl(TAP::Harness::Env) \ +Requires: perl(TAP::Object) \ +Requires: perl(TAP::Parser::Aggregator) \ +Requires: perl(TAP::Parser::Grammar) \ +Requires: perl(TAP::Parser::Iterator) \ +Requires: perl(TAP::Parser::Iterator::Array) \ +Requires: perl(TAP::Parser::Iterator::Process) \ +Requires: perl(TAP::Parser::Iterator::Stream) \ +Requires: perl(TAP::Parser::IteratorFactory) \ +Requires: perl(TAP::Parser::Result) \ +Requires: perl(TAP::Parser::Result::Bailout) \ +Requires: perl(TAP::Parser::Result::Comment) \ +Requires: perl(TAP::Parser::Result::Plan) \ +Requires: perl(TAP::Parser::Result::Pragma) \ +Requires: perl(TAP::Parser::Result::Test) \ +Requires: perl(TAP::Parser::Result::Unknown) \ +Requires: perl(TAP::Parser::Result::Version) \ +Requires: perl(TAP::Parser::Result::YAML) \ +Requires: perl(TAP::Parser::ResultFactory) \ +Requires: perl(TAP::Parser::Scheduler::Job) \ +Requires: perl(TAP::Parser::Scheduler::Spinner) \ +Requires: perl(TAP::Parser::Source) \ +Requires: perl(TAP::Parser::SourceHandler) \ +Requires: perl(TAP::Parser::SourceHandler::Executable) \ +Requires: perl(TAP::Parser::SourceHandler::File) \ +Requires: perl(TAP::Parser::SourceHandler::Handle) \ +Requires: perl(TAP::Parser::SourceHandler::Perl) \ +Requires: perl(TAP::Parser::SourceHandler::RawTAP) \ +Requires: perl(TAP::Parser::YAMLish::Reader) \ +Requires: perl(TAP::Parser::YAMLish::Writer) \ +Requires: perl(Text::ParseWords) \ +Requires: perl(base) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(App::Prove) = 3.36 \ +Provides: perl(App::Prove::State) = 3.36 \ +Provides: perl(App::Prove::State::Result) = 3.36 \ +Provides: perl(App::Prove::State::Result::Test) = 3.36 \ +Provides: perl(TAP::Base) = 3.36 \ +Provides: perl(TAP::Formatter::Base) = 3.36 \ +Provides: perl(TAP::Formatter::Color) = 3.36 \ +Provides: perl(TAP::Formatter::Console) = 3.36 \ +Provides: perl(TAP::Formatter::Console::ParallelSession) = 3.36 \ +Provides: perl(TAP::Formatter::Console::Session) = 3.36 \ +Provides: perl(TAP::Formatter::File) = 3.36 \ +Provides: perl(TAP::Formatter::File::Session) = 3.36 \ +Provides: perl(TAP::Formatter::Session) = 3.36 \ +Provides: perl(TAP::Harness) = 3.36 \ +Provides: perl(TAP::Harness::Env) = 3.36 \ +Provides: perl(TAP::Object) = 3.36 \ +Provides: perl(TAP::Parser) = 3.36 \ +Provides: perl(TAP::Parser::Aggregator) = 3.36 \ +Provides: perl(TAP::Parser::Grammar) = 3.36 \ +Provides: perl(TAP::Parser::Iterator) = 3.36 \ +Provides: perl(TAP::Parser::Iterator::Array) = 3.36 \ +Provides: perl(TAP::Parser::Iterator::Process) = 3.36 \ +Provides: perl(TAP::Parser::Iterator::Stream) = 3.36 \ +Provides: perl(TAP::Parser::IteratorFactory) = 3.36 \ +Provides: perl(TAP::Parser::Multiplexer) = 3.36 \ +Provides: perl(TAP::Parser::Result) = 3.36 \ +Provides: perl(TAP::Parser::Result::Bailout) = 3.36 \ +Provides: perl(TAP::Parser::Result::Comment) = 3.36 \ +Provides: perl(TAP::Parser::Result::Plan) = 3.36 \ +Provides: perl(TAP::Parser::Result::Pragma) = 3.36 \ +Provides: perl(TAP::Parser::Result::Test) = 3.36 \ +Provides: perl(TAP::Parser::Result::Unknown) = 3.36 \ +Provides: perl(TAP::Parser::Result::Version) = 3.36 \ +Provides: perl(TAP::Parser::Result::YAML) = 3.36 \ +Provides: perl(TAP::Parser::ResultFactory) = 3.36 \ +Provides: perl(TAP::Parser::Scheduler) = 3.36 \ +Provides: perl(TAP::Parser::Scheduler::Job) = 3.36 \ +Provides: perl(TAP::Parser::Scheduler::Spinner) = 3.36 \ +Provides: perl(TAP::Parser::Source) = 3.36 \ +Provides: perl(TAP::Parser::SourceHandler) = 3.36 \ +Provides: perl(TAP::Parser::SourceHandler::Executable) = 3.36 \ +Provides: perl(TAP::Parser::SourceHandler::File) = 3.36 \ +Provides: perl(TAP::Parser::SourceHandler::Handle) = 3.36 \ +Provides: perl(TAP::Parser::SourceHandler::Perl) = 3.36 \ +Provides: perl(TAP::Parser::SourceHandler::RawTAP) = 3.36 \ +Provides: perl(TAP::Parser::YAMLish::Reader) = 3.36 \ +Provides: perl(TAP::Parser::YAMLish::Writer) = 3.36 \ +Provides: perl(Test::Harness) = 3.36 \ +%{nil} +%global gendep_perl_Test_Simple \ +Requires: perl(:VERSION) >= 5.5.0 \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(Config) \ +Requires: perl(Exporter) \ +Requires: perl(IO::Handle) \ +Requires: perl(Symbol) \ +Requires: perl(Test::Builder) >= 0.99 \ +Requires: perl(Test::Builder) >= 1.00 \ +Requires: perl(Test::Builder::Module) >= 0.99 \ +Requires: perl(Test::Builder::Tester) \ +Requires: perl(Test::More) \ +Requires: perl(Test::Tester::Capture) \ +Requires: perl(Test::Tester::CaptureRunner) \ +Requires: perl(Test::Tester::Delegate) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Provides: perl(Test::Builder) = 1.001014 \ +Provides: perl(Test::Builder::IO::Scalar) = 2.113 \ +Provides: perl(Test::Builder::Module) = 1.001014 \ +Provides: perl(Test::Builder::Tester) = 1.28 \ +Provides: perl(Test::Builder::Tester::Color) = 1.290001 \ +Provides: perl(Test::Builder::Tester::Tie) \ +Provides: perl(Test::More) = 1.001014 \ +Provides: perl(Test::Simple) = 1.001014 \ +Provides: perl(Test::Tester) = 0.114 \ +Provides: perl(Test::Tester::Capture) \ +Provides: perl(Test::Tester::CaptureRunner) \ +Provides: perl(Test::Tester::Delegate) \ +Provides: perl(Test::use::ok) = 0.16 \ +Provides: perl(ok) = 0.16 \ +%{nil} +%global gendep_perl_Text_Balanced \ +Requires: perl(:VERSION) >= 5.5.0 \ +Requires: perl(Carp) \ +Requires: perl(Exporter) \ +Requires: perl(SelfLoader) \ +Requires: perl(overload) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Text::Balanced) = 2.03 \ +Provides: perl(Text::Balanced::ErrorMsg) \ +Provides: perl(Text::Balanced::Extractor) \ +%{nil} +%global gendep_perl_Text_ParseWords \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Exporter) \ +Requires: perl(strict) \ +Provides: perl(Text::ParseWords) = 3.30 \ +%{nil} +%global gendep_perl_Text_Tabs_Wrap \ +Requires: perl(:VERSION) >= 5.10.0 \ +Requires: perl(Exporter) \ +Requires: perl(Text::Tabs) \ +Requires: perl(re) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings::register) \ +Provides: perl(Text::Tabs) = 2013.0523 \ +Provides: perl(Text::Wrap) = 2013.0523 \ +%{nil} +%global gendep_perl_Thread_Queue \ +Requires: perl(Scalar::Util) >= 1.10 \ +Requires: perl(strict) \ +Requires: perl(threads::shared) >= 1.21 \ +Requires: perl(warnings) \ +Provides: perl(Thread::Queue) = 3.09 \ +%{nil} +%global gendep_perl_Time_HiRes \ +Requires: perl(DynaLoader) \ +Requires: perl(Exporter) \ +Requires: perl(strict) \ +Provides: perl(Time::HiRes) = 1.9741 \ +%{nil} +%global gendep_perl_Time_Local \ +Requires: perl(Carp) \ +Requires: perl(Config) \ +Requires: perl(Exporter) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(Time::Local) = 1.2300 \ +%{nil} +%global gendep_perl_Time_Piece \ +Requires: perl(Carp) \ +Requires: perl(DynaLoader) \ +Requires: perl(Exporter) >= 5.57 \ +Requires: perl(Time::Local) \ +Requires: perl(Time::Seconds) \ +Requires: perl(constant) \ +Requires: perl(integer) \ +Requires: perl(overload) \ +Requires: perl(strict) \ +Provides: perl(Time::Piece) = 1.31 \ +Provides: perl(Time::Seconds) = 1.31 \ +%{nil} +%global gendep_perl_Unicode_Collate \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(DynaLoader) \ +Requires: perl(File::Spec) \ +Requires: perl(Unicode::Collate) \ +Requires: perl(base) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(Unicode::Collate) = 1.14 \ +Provides: perl(Unicode::Collate::CJK::Big5) = 1.14 \ +Provides: perl(Unicode::Collate::CJK::GB2312) = 1.14 \ +Provides: perl(Unicode::Collate::CJK::JISX0208) = 1.14 \ +Provides: perl(Unicode::Collate::CJK::Korean) = 1.14 \ +Provides: perl(Unicode::Collate::CJK::Pinyin) = 1.14 \ +Provides: perl(Unicode::Collate::CJK::Stroke) = 1.14 \ +Provides: perl(Unicode::Collate::CJK::Zhuyin) = 1.14 \ +Provides: perl(Unicode::Collate::Locale) = 1.14 \ +%{nil} +%global gendep_perl_Unicode_Normalize \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(DynaLoader) \ +Requires: perl(Exporter) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(Unicode::Normalize) = 1.25 \ +%{nil} +%global gendep_perl_autodie \ +Requires: perl(:VERSION) >= 5.8.0 \ +Requires: perl(Carp) \ +Requires: perl(Config) \ +Requires: perl(Exporter) >= 5.57 \ +Requires: perl(Fatal) \ +Requires: perl(Scalar::Util) \ +Requires: perl(Tie::RefHash) \ +Requires: perl(autodie::Scope::Guard) \ +Requires: perl(autodie::Scope::GuardStack) \ +Requires: perl(autodie::Util) \ +Requires: perl(autodie::exception) \ +Requires: perl(constant) \ +Requires: perl(lib) \ +Requires: perl(overload) \ +Requires: perl(parent) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(Fatal) = 2.29 \ +Provides: perl(autodie) = 2.29 \ +Provides: perl(autodie::Scope::Guard) = 2.29 \ +Provides: perl(autodie::Scope::GuardStack) = 2.29 \ +Provides: perl(autodie::Util) = 2.29 \ +Provides: perl(autodie::exception) = 2.29 \ +Provides: perl(autodie::exception::system) = 2.29 \ +Provides: perl(autodie::hints) = 2.29 \ +Provides: perl(autodie::skip) = 2.29 \ +%{nil} +%global gendep_perl_bignum \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Exporter) \ +Requires: perl(Math::BigFloat) \ +Requires: perl(Math::BigInt) \ +Requires: perl(bigint) \ +Requires: perl(constant) \ +Requires: perl(overload) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(Math::BigFloat::Trace) = 0.42 \ +Provides: perl(Math::BigInt::Trace) = 0.42 \ +Provides: perl(bigint) = 0.42 \ +Provides: perl(bignum) = 0.42 \ +Provides: perl(bigrat) = 0.42 \ +%{nil} +%global gendep_perl_constant \ +Requires: perl(:VERSION) >= 5.8.0 \ +Requires: perl(strict) \ +Requires: perl(warnings::register) \ +Provides: perl(constant) = 1.33 \ +%{nil} +%global gendep_perl_core \ +%{nil} +%global gendep_perl_debuginfo \ +%{nil} +%global gendep_perl_devel \ +Requires: perl(Config) \ +Requires: perl(ExtUtils::Constant) \ +Requires: perl(ExtUtils::Installed) \ +Requires: perl(File::Compare) \ +Requires: perl(File::Path) \ +Requires: perl(File::Spec) \ +Requires: perl(Getopt::Long) \ +Requires: perl(Text::Wrap) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +%{nil} +%global gendep_perl_encoding \ +Requires: perl(Encode) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(encoding) = 2.17 \ +%{nil} +%global gendep_perl_experimental \ +Requires: perl(Carp) \ +Requires: perl(feature) \ +Requires: perl(strict) \ +Requires: perl(version) \ +Requires: perl(warnings) \ +Provides: perl(experimental) = 0.016 \ +%{nil} +%global gendep_perl_libnet \ +Requires: perl(:VERSION) >= 5.8.1 \ +Requires: perl(Carp) \ +Requires: perl(Errno) \ +Requires: perl(Exporter) \ +Requires: perl(Fcntl) \ +Requires: perl(FileHandle) \ +Requires: perl(IO::Select) \ +Requires: perl(IO::Socket) \ +Requires: perl(Net::Cmd) \ +Requires: perl(Net::Config) \ +Requires: perl(Net::FTP::I) \ +Requires: perl(Net::FTP::dataconn) \ +Requires: perl(Socket) \ +Requires: perl(Symbol) \ +Requires: perl(Time::Local) \ +Requires: perl(constant) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(Net::Cmd) = 3.08 \ +Provides: perl(Net::Config) = 3.08 \ +Provides: perl(Net::Domain) = 3.08 \ +Provides: perl(Net::FTP) = 3.08 \ +Provides: perl(Net::FTP::A) = 3.08 \ +Provides: perl(Net::FTP::E) = 3.08 \ +Provides: perl(Net::FTP::I) = 3.08 \ +Provides: perl(Net::FTP::L) = 3.08 \ +Provides: perl(Net::FTP::_SSL_SingleSessionCache) \ +Provides: perl(Net::FTP::dataconn) = 3.08 \ +Provides: perl(Net::NNTP) = 3.08 \ +Provides: perl(Net::NNTP::_SSL) \ +Provides: perl(Net::Netrc) = 3.08 \ +Provides: perl(Net::POP3) = 3.08 \ +Provides: perl(Net::POP3::_SSL) \ +Provides: perl(Net::SMTP) = 3.08 \ +Provides: perl(Net::SMTP::_SSL) \ +Provides: perl(Net::Time) = 3.08 \ +%{nil} +%global gendep_perl_libnetcfg \ +Requires: perl(ExtUtils::MakeMaker) \ +Requires: perl(File::Spec) \ +Requires: perl(Getopt::Std) \ +Requires: perl(IO::File) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +%{nil} +%global gendep_perl_libs \ +Requires: perl(integer) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(:MODULE_COMPAT_5.24.0) \ +Provides: perl(:MODULE_COMPAT_5.24.1) \ +Provides: perl(:MODULE_COMPAT_5.24.2) \ +Provides: perl(:MODULE_COMPAT_5.24.3) \ +Provides: perl(:MODULE_COMPAT_5.24.4) \ +Provides: perl(:VERSION) = 5.24.4 \ +Provides: perl(:WITH_ITHREADS) \ +Provides: perl(:WITH_LARGEFILES) \ +Provides: perl(:WITH_PERLIO) \ +Provides: perl(:WITH_THREADS) \ +Provides: perl(XSLoader) = 0.22 \ +Provides: perl(integer) = 1.01 \ +Provides: perl(re) = 0.32 \ +Provides: perl(strict) = 1.11 \ +Provides: perl(unicore::Name) \ +Provides: perl(utf8) = 1.19 \ +Provides: perl(utf8_heavy.pl) \ +Provides: perl(warnings) = 1.36 \ +%{nil} +%global gendep_perl_macros \ +%{nil} +%global gendep_perl_open \ +Requires: perl(:VERSION) >= 5.8.1 \ +Requires: perl(warnings) \ +Provides: perl(open) = 1.10 \ +%{nil} +%global gendep_perl_parent \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Provides: perl(parent) = 0.234 \ +%{nil} +%global gendep_perl_perlfaq \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(perlfaq) = 5.021010 \ +%{nil} +%global gendep_perl_podlators \ +Requires: perl(:VERSION) >= 5.6.0 \ +Requires: perl(Carp) \ +Requires: perl(Encode) \ +Requires: perl(Exporter) \ +Requires: perl(Getopt::Long) \ +Requires: perl(POSIX) \ +Requires: perl(Pod::Man) \ +Requires: perl(Pod::Simple) \ +Requires: perl(Pod::Text) \ +Requires: perl(Pod::Usage) \ +Requires: perl(Term::ANSIColor) \ +Requires: perl(Term::Cap) \ +Requires: perl(strict) \ +Requires: perl(subs) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +Provides: perl(Pod::Man) = 4.07 \ +Provides: perl(Pod::ParseLink) = 4.07 \ +Provides: perl(Pod::Text) = 4.07 \ +Provides: perl(Pod::Text::Color) = 4.07 \ +Provides: perl(Pod::Text::Overstrike) = 4.07 \ +Provides: perl(Pod::Text::Termcap) = 4.07 \ +%{nil} +%global gendep_perl_tests \ +%{nil} +%global gendep_perl_threads \ +Requires: perl(:VERSION) >= 5.8.0 \ +Requires: perl(Config) \ +Requires: perl(XSLoader) \ +Requires: perl(overload) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(threads) = 2.07 \ +%{nil} +%global gendep_perl_threads_shared \ +Requires: perl(:VERSION) >= 5.8.0 \ +Requires: perl(Scalar::Util) \ +Requires: perl(strict) \ +Requires: perl(warnings) \ +Provides: perl(threads::shared) = 1.51 \ +%{nil} +%global gendep_perl_utils \ +Requires: perl(:VERSION) >= 5.9.1 \ +Requires: perl(Carp) \ +Requires: perl(Config) \ +Requires: perl(File::Basename) \ +Requires: perl(File::Path) \ +Requires: perl(File::Spec) \ +Requires: perl(File::Temp) \ +Requires: perl(Getopt::Std) \ +Requires: perl(Text::Tabs) \ +Requires: perl(re) \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(warnings) \ +%{nil} +%global gendep_perl_version \ +Requires: perl(:VERSION) >= 5.6.2 \ +Requires: perl(strict) \ +Requires: perl(vars) \ +Requires: perl(version::regex) \ +Requires: perl(warnings::register) \ +Provides: perl(version) = 0.9916 \ +Provides: perl(version::regex) = 0.9916 \ +%{nil} diff --git a/SOURCES/macros.perl b/SOURCES/macros.perl new file mode 100644 index 0000000..9c1fd0c --- /dev/null +++ b/SOURCES/macros.perl @@ -0,0 +1,151 @@ +# Sensible Perl-specific RPM build macros. +# +# Note that these depend on the generic filtering system being in place in +# rpm core; but won't cause a build to fail if they're not present. +# +# Chris Weyl 2009 +# Marcela Mašláňová 2011 + +# This macro unsets several common vars used to control how Makefile.PL (et +# al) build and install packages. We also set a couple to help some of the +# common systems be less interactive. This was blatantly stolen from +# cpanminus, and helps building rpms locally when one makes extensive use of +# local::lib, etc. +# +# Usage, in %build, before "%{__perl} Makefile.PL ..." +# +# %{?perl_ext_env_unset} + +%perl_ext_env_unset %{expand: +unset PERL_MM_OPT MODULEBUILDRC PERL5INC +export PERL_AUTOINSTALL="--defaultdeps" +export PERL_MM_USE_DEFAULT=1 +} + +############################################################################# +# Filtering macro incantations + +# keep track of what "revision" of the filtering we're at. Each time we +# change the filter we should increment this. + +%perl_default_filter_revision 3 + +# By default, for perl packages we want to filter all files in _docdir from +# req/prov scanning. +# Filtering out any provides caused by private libs in vendorarch/archlib +# (vendor/core) is done by rpmbuild since Fedora 20 +# . +# +# Note that this must be invoked in the spec file, preferably as +# "%{?perl_default_filter}", before any %description block. + +%perl_default_filter %{expand: \ +%global __provides_exclude_from %{?__provides_exclude_from:%__provides_exclude_from|}^%{_docdir} +%global __requires_exclude_from %{?__requires_exclude_from:%__requires_exclude_from|}^%{_docdir} +%global __provides_exclude %{?__provides_exclude:%__provides_exclude|}^perl\\\\(VMS|^perl\\\\(Win32|^perl\\\\(DB\\\\)|^perl\\\\(UNIVERSAL\\\\) +%global __requires_exclude %{?__requires_exclude:%__requires_exclude|}^perl\\\\(VMS|^perl\\\\(Win32 +} + +############################################################################# +# Macros to assist with generating a "-tests" subpackage in a semi-automatic +# manner. +# +# The following macros are still in a highly experimental stage and users +# should be aware that the interface and behaviour may change. +# +# PLEASE, PLEASE CONDITIONALIZE THESE MACROS IF YOU USE THEM. +# +# See http://gist.github.com/284409 + +# These macros should be invoked as above, right before the first %description +# section, and conditionalized. e.g., for the common case where all our tests +# are located under t/, the correct usage is: +# +# %{?perl_default_subpackage_tests} +# +# If custom files/directories need to be specified, this can be done as such: +# +# %{?perl_subpackage_tests:%perl_subpackage_tests t/ one/ three.sql} +# +# etc, etc. + +%perl_version %(eval "`%{__perl} -V:version`"; echo $version) +%perl_testdir %{_libexecdir}/perl5-tests +%cpan_dist_name %(eval echo %{name} | %{__sed} -e 's/^perl-//') + +# easily mark something as required by -tests and BR to the main package +%tests_req() %{expand:\ +BuildRequires: %*\ +%%tests_subpackage_requires %*\ +} + +# fixup (and create if needed) the shbang lines in tests, so they work and +# rpmlint doesn't (correctly) have a fit +%fix_shbang_line() \ +TMPHEAD=`mktemp`\ +TMPBODY=`mktemp`\ +for file in %* ; do \ + head -1 $file > $TMPHEAD\ + tail -n +2 $file > $TMPBODY\ + %{__perl} -pi -e '$f = /^#!/ ? "" : "#!%{__perl}$/"; $_="$f$_"' $TMPHEAD\ + cat $TMPHEAD $TMPBODY > $file\ +done\ +%{__perl} -MExtUtils::MakeMaker -e "ExtUtils::MM_Unix->fixin(qw{%*})"\ +%{__rm} $TMPHEAD $TMPBODY\ +%{nil} + +# additional -tests subpackage requires, if any +%tests_subpackage_requires() %{expand: \ +%global __tests_spkg_req %{?__tests_spkg_req} %* \ +} + +# additional -tests subpackage provides, if any +%tests_subpackage_provides() %{expand: \ +%global __tests_spkg_prov %{?__tests_spkg_prov} %* \ +} + +# +# Runs after the body of %check completes. +# + +%__perl_check_pre %{expand: \ +%{?__spec_check_pre} \ +pushd %{buildsubdir} \ +%define perl_br_testdir %{buildroot}%{perl_testdir}/%{cpan_dist_name} \ +%{__mkdir_p} %{perl_br_testdir} \ +%{__tar} -cf - %{__perl_test_dirs} | ( cd %{perl_br_testdir} && %{__tar} -xf - ) \ +find . -maxdepth 1 -type f -name '*META*' -exec %{__cp} -vp {} %{perl_br_testdir} ';' \ +find %{perl_br_testdir} -type f -exec %{__chmod} -c -x {} ';' \ +T_FILES=`find %{perl_br_testdir} -type f -name '*.t'` \ +%fix_shbang_line $T_FILES \ +%{__chmod} +x $T_FILES \ +%{_fixperms} %{perl_br_testdir} \ +popd \ +} + +# +# The actual invoked macro +# + +%perl_subpackage_tests() %{expand: \ +%global __perl_package 1\ +%global __perl_test_dirs %* \ +%global __spec_check_pre %{expand:%{__perl_check_pre}} \ +%package tests\ +Summary: Test suite for package %{name}\ +Group: Development/Debug\ +Requires: %{name} = %{?epoch:%{epoch}:}%{version}-%{release}\ +Requires: /usr/bin/prove \ +%{?__tests_spkg_req:Requires: %__tests_spkg_req}\ +%{?__tests_spkg_prov:Provides: %__tests_spkg_prov}\ +AutoReqProv: 0 \ +%description tests\ +This package provides the test suite for package %{name}.\ +%files tests\ +%defattr(-,root,root,-)\ +%{perl_testdir}\ +} + +# shortcut sugar +%perl_default_subpackage_tests %perl_subpackage_tests t/ + diff --git a/SOURCES/perl-5.10.0-libresolv.patch b/SOURCES/perl-5.10.0-libresolv.patch new file mode 100644 index 0000000..a844a28 --- /dev/null +++ b/SOURCES/perl-5.10.0-libresolv.patch @@ -0,0 +1,12 @@ +diff -up perl-5.10.0/Configure.didi perl-5.10.0/Configure +--- perl-5.10.0/Configure.didi 2007-12-18 11:47:07.000000000 +0100 ++++ perl-5.10.0/Configure 2008-07-21 10:51:16.000000000 +0200 +@@ -1479,7 +1479,7 @@ archname='' + usereentrant='undef' + : List of libraries we want. + : If anyone needs extra -lxxx, put those in a hint file. +-libswanted="cl pthread socket bind inet nsl ndbm gdbm dbm db malloc dl ld" ++libswanted="cl pthread socket resolv inet nsl ndbm gdbm dbm db malloc dl ld" + libswanted="$libswanted sun m crypt sec util c cposix posix ucb bsd BSD" + : We probably want to search /usr/shlib before most other libraries. + : This is only used by the lib/ExtUtils/MakeMaker.pm routine extliblist. diff --git a/SOURCES/perl-5.10.0-x86_64-io-test-failure.patch b/SOURCES/perl-5.10.0-x86_64-io-test-failure.patch new file mode 100644 index 0000000..08adda8 --- /dev/null +++ b/SOURCES/perl-5.10.0-x86_64-io-test-failure.patch @@ -0,0 +1,12 @@ +diff -up perl-5.10.0/t/io/fs.t.BAD perl-5.10.0/t/io/fs.t +--- perl-5.10.0/t/io/fs.t.BAD 2008-01-30 13:36:43.000000000 -0500 ++++ perl-5.10.0/t/io/fs.t 2008-01-30 13:41:27.000000000 -0500 +@@ -227,7 +227,7 @@ isnt($atime, 500000000, 'atime'); + isnt($mtime, 500000000 + $delta, 'mtime'); + + SKIP: { +- skip "no futimes", 6 unless ($Config{d_futimes} || "") eq "define"; ++ skip "no futimes", 6; + open(my $fh, "<", 'b'); + $foo = (utime 500000000,500000000 + $delta, $fh); + is($foo, 1, "futime"); diff --git a/SOURCES/perl-5.14.1-offtest.patch b/SOURCES/perl-5.14.1-offtest.patch new file mode 100644 index 0000000..45294c8 --- /dev/null +++ b/SOURCES/perl-5.14.1-offtest.patch @@ -0,0 +1,17 @@ +diff -up perl-5.14.1/cpan/File-Temp/t/fork.t.off perl-5.14.1/cpan/File-Temp/t/fork.t +--- perl-5.14.1/cpan/File-Temp/t/fork.t.off 2011-04-13 13:36:34.000000000 +0200 ++++ perl-5.14.1/cpan/File-Temp/t/fork.t 2011-06-20 10:29:31.536282611 +0200 +@@ -12,12 +12,8 @@ BEGIN { + $Config::Config{useithreads} and + $Config::Config{ccflags} =~ /-DPERL_IMPLICIT_SYS/ + ); +- if ( $can_fork ) { +- print "1..8\n"; +- } else { +- print "1..0 # Skip No fork available\n"; ++ print "1..0 # Skip Koji doesn't work with Perl fork tests\n"; + exit; +- } + } + + use File::Temp; diff --git a/SOURCES/perl-5.16.3-Link-XS-modules-to-libperl.so-with-EU-CBuilder-on-Li.patch b/SOURCES/perl-5.16.3-Link-XS-modules-to-libperl.so-with-EU-CBuilder-on-Li.patch new file mode 100644 index 0000000..d87aca7 --- /dev/null +++ b/SOURCES/perl-5.16.3-Link-XS-modules-to-libperl.so-with-EU-CBuilder-on-Li.patch @@ -0,0 +1,65 @@ +From b598ba3f2d4b8347c6621cff022b8e2329b79ea5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Wed, 3 Jul 2013 11:01:02 +0200 +Subject: [PATCH] Link XS modules to libperl.so with EU::CBuilder on Linux +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + + + + +Signed-off-by: Petr Písař +--- + MANIFEST | 1 + + .../lib/ExtUtils/CBuilder/Platform/linux.pm | 26 ++++++++++++++++++++++ + 2 files changed, 27 insertions(+) + create mode 100644 dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/linux.pm + +diff --git a/MANIFEST b/MANIFEST +index 397252a..d7c519b 100644 +--- a/MANIFEST ++++ b/MANIFEST +@@ -3093,6 +3093,7 @@ dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/aix.pm CBuilder methods fo + dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/cygwin.pm CBuilder methods for cygwin + dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/darwin.pm CBuilder methods for darwin + dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/dec_osf.pm CBuilder methods for OSF ++dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/linux.pm CBuilder methods for Linux + dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/os2.pm CBuilder methods for OS/2 + dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Unix.pm CBuilder methods for Unix + dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/VMS.pm CBuilder methods for VMS +diff --git a/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/linux.pm b/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/linux.pm +new file mode 100644 +index 0000000..e3251c4 +--- /dev/null ++++ b/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/linux.pm +@@ -0,0 +1,26 @@ ++package ExtUtils::CBuilder::Platform::linux; ++ ++use strict; ++use ExtUtils::CBuilder::Platform::Unix; ++use File::Spec; ++ ++use vars qw($VERSION @ISA); ++$VERSION = '0.280206'; ++@ISA = qw(ExtUtils::CBuilder::Platform::Unix); ++ ++sub link { ++ my ($self, %args) = @_; ++ my $cf = $self->{config}; ++ ++ # Link XS modules to libperl.so explicitly because multiple ++ # dlopen(, RTLD_LOCAL) hides libperl symbols from XS module. ++ local $cf->{lddlflags} = $cf->{lddlflags}; ++ if ($ENV{PERL_CORE}) { ++ $cf->{lddlflags} .= ' -L' . $self->perl_inc(); ++ } ++ $cf->{lddlflags} .= ' -lperl'; ++ ++ return $self->SUPER::link(%args); ++} ++ ++1; +-- +1.8.1.4 + diff --git a/SOURCES/perl-5.16.3-Link-XS-modules-to-libperl.so-with-EU-MM-on-Linux.patch b/SOURCES/perl-5.16.3-Link-XS-modules-to-libperl.so-with-EU-MM-on-Linux.patch new file mode 100644 index 0000000..26159bc --- /dev/null +++ b/SOURCES/perl-5.16.3-Link-XS-modules-to-libperl.so-with-EU-MM-on-Linux.patch @@ -0,0 +1,52 @@ +From fc1f8ac36c34c35bad84fb7b99a26ab83c9ba075 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Wed, 3 Jul 2013 12:59:09 +0200 +Subject: [PATCH] Link XS modules to libperl.so with EU::MM on Linux +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + + + + +Signed-off-by: Petr Písař +--- + cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm +index a8b172f..a3fbce2 100644 +--- a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm ++++ b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm +@@ -31,6 +31,7 @@ BEGIN { + $Is{IRIX} = $^O eq 'irix'; + $Is{NetBSD} = $^O eq 'netbsd'; + $Is{Interix} = $^O eq 'interix'; ++ $Is{Linux} = $^O eq 'linux'; + $Is{SunOS4} = $^O eq 'sunos'; + $Is{Solaris} = $^O eq 'solaris'; + $Is{SunOS} = $Is{SunOS4} || $Is{Solaris}; +@@ -932,7 +933,7 @@ $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DFSEP). + + my $libs = '$(LDLOADLIBS)'; + +- if (($Is{NetBSD} || $Is{Interix} || $Is{Android}) && $Config{'useshrplib'} eq 'true') { ++ if (($Is{Linux} || $Is{NetBSD} || $Is{Interix} || $Is{Android}) && $Config{'useshrplib'} eq 'true') { + # Use nothing on static perl platforms, and to the flags needed + # to link against the shared libperl library on shared perl + # platforms. We peek at lddlflags to see if we need -Wl,-R +@@ -941,6 +942,11 @@ $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DFSEP). + # The Android linker will not recognize symbols from + # libperl unless the module explicitly depends on it. + $libs .= ' "-L$(PERL_INC)" -lperl'; ++ } else { ++ if ($ENV{PERL_CORE}) { ++ $libs .= ' "-L$(PERL_INC)"'; ++ } ++ $libs .= ' -lperl'; + } + } + +-- +1.8.1.4 + diff --git a/SOURCES/perl-5.16.3-create_libperl_soname.patch b/SOURCES/perl-5.16.3-create_libperl_soname.patch new file mode 100644 index 0000000..fabadf4 --- /dev/null +++ b/SOURCES/perl-5.16.3-create_libperl_soname.patch @@ -0,0 +1,52 @@ +From fa2f0dd5a7767223df10149d3f16d7ed7013e16f Mon Sep 17 00:00:00 2001 +From: Torsten Veller +Date: Sat, 14 Apr 2012 13:49:18 +0200 +Subject: Set libperl soname + +Bug-Gentoo: https://bugs.gentoo.org/286840 + +Patch-Name: gentoo/create_libperl_soname.diff +--- + Makefile.SH | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/Makefile.SH b/Makefile.SH +index d1da0a0..7733a32 100755 +--- a/Makefile.SH ++++ b/Makefile.SH +@@ -58,7 +58,7 @@ true) + ${api_revision}.${api_version}.${api_subversion} \ + -current_version \ + ${revision}.${patchlevel}.${subversion} \ +- -install_name \$(shrpdir)/\$@" ++ -install_name \$(shrpdir)/libperl.${revision}.${patchlevel}.dylib" + ;; + cygwin*) + shrpldflags="$shrpldflags -Wl,--out-implib=libperl.dll.a -Wl,--image-base,0x52000000" +@@ -66,13 +66,15 @@ true) + ;; + sunos*) + linklibperl="-lperl" ++ shrpldflags="$shrpldflags -Wl,-soname -Wl,libperl.so.${revision}.${patchlevel}" + ;; + netbsd*|freebsd[234]*|openbsd*|dragonfly*|bitrig*) + linklibperl="-L. -lperl" ++ shrpldflags="$shrpldflags -Wl,-soname -Wl,libperl.so.${revision}.${patchlevel}" + ;; + interix*) + linklibperl="-L. -lperl" +- shrpldflags="$shrpldflags -Wl,--image-base,0x57000000" ++ shrpldflags="$shrpldflags -Wl,--image-base,0x57000000 -Wl,-soname -Wl,libperl.so.${revision}.${patchlevel}" + ;; + aix*) + case "$cc" in +@@ -110,6 +112,9 @@ true) + linklibperl='libperl.x' + DPERL_EXTERNAL_GLOB='' + ;; ++ linux*) ++ shrpldflags="$shrpldflags -Wl,-soname -Wl,libperl.so.${revision}.${patchlevel}" ++ ;; + esac + case "$ldlibpthname" in + '') ;; diff --git a/SOURCES/perl-5.18.1-Document-Math-BigInt-CalcEmu-requires-Math-BigInt.patch b/SOURCES/perl-5.18.1-Document-Math-BigInt-CalcEmu-requires-Math-BigInt.patch new file mode 100644 index 0000000..bed0adc --- /dev/null +++ b/SOURCES/perl-5.18.1-Document-Math-BigInt-CalcEmu-requires-Math-BigInt.patch @@ -0,0 +1,30 @@ +From 862c89c81d26dae0dcef138e19df8b45615e69c9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Mon, 2 Dec 2013 10:10:56 +0100 +Subject: [PATCH] Document Math::BigInt::CalcEmu requires Math::BigInt +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + + + +Signed-off-by: Petr Písař +--- + dist/Math-BigInt/lib/Math/BigInt/CalcEmu.pm | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/dist/Math-BigInt/lib/Math/BigInt/CalcEmu.pm b/dist/Math-BigInt/lib/Math/BigInt/CalcEmu.pm +index c82e153..0c0b496 100644 +--- a/cpan/Math-BigInt/lib/Math/BigInt/CalcEmu.pm ++++ b/cpan/Math-BigInt/lib/Math/BigInt/CalcEmu.pm +@@ -290,6 +290,7 @@ Math::BigInt::CalcEmu - Emulate low-level math with BigInt code + + =head1 SYNOPSIS + ++ use Math::BigInt; + use Math::BigInt::CalcEmu; + + =head1 DESCRIPTION +-- +1.8.3.1 + diff --git a/SOURCES/perl-5.18.2-Destroy-GDBM-NDBM-ODBM-SDBM-_File-objects-only-from-.patch b/SOURCES/perl-5.18.2-Destroy-GDBM-NDBM-ODBM-SDBM-_File-objects-only-from-.patch new file mode 100644 index 0000000..9b503c6 --- /dev/null +++ b/SOURCES/perl-5.18.2-Destroy-GDBM-NDBM-ODBM-SDBM-_File-objects-only-from-.patch @@ -0,0 +1,233 @@ +From f793042f2bac2ace9a5c0030b47b41c4db561a5b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Fri, 6 Jun 2014 14:31:59 +0200 +Subject: [PATCH] Destroy {GDBM,NDBM,ODBM,SDBM}_File objects only from original + thread context +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This patch fixes a crash when destroing a hash tied to a *_File +database after spawning a thread: + +use Fcntl; +use SDBM_File; +use threads; +tie(my %dbtest, 'SDBM_File', "test.db", O_RDWR|O_CREAT, 0666); +threads->new(sub {})->join; + +This crashed or paniced depending on how perl was configured. + +Closes RT#61912. + +Signed-off-by: Petr Písař +--- + ext/GDBM_File/GDBM_File.xs | 16 ++++++++++------ + ext/NDBM_File/NDBM_File.xs | 16 ++++++++++------ + ext/ODBM_File/ODBM_File.xs | 18 +++++++++++------- + ext/SDBM_File/SDBM_File.xs | 4 +++- + t/lib/dbmt_common.pl | 35 +++++++++++++++++++++++++++++++++++ + 5 files changed, 69 insertions(+), 20 deletions(-) + +diff --git a/ext/GDBM_File/GDBM_File.xs b/ext/GDBM_File/GDBM_File.xs +index 33e08e2..7160f54 100644 +--- a/ext/GDBM_File/GDBM_File.xs ++++ b/ext/GDBM_File/GDBM_File.xs +@@ -13,6 +13,7 @@ + #define store_value 3 + + typedef struct { ++ tTHX owner; + GDBM_FILE dbp ; + SV * filter[4]; + int filtering ; +@@ -89,6 +90,7 @@ gdbm_TIEHASH(dbtype, name, read_write, mode) + if ((dbp = gdbm_open(name, GDBM_BLOCKSIZE, read_write, mode, + (FATALFUNC) croak_string))) { + RETVAL = (GDBM_File)safecalloc(1, sizeof(GDBM_File_type)) ; ++ RETVAL->owner = aTHX; + RETVAL->dbp = dbp ; + } + +@@ -109,12 +111,14 @@ gdbm_DESTROY(db) + PREINIT: + int i = store_value; + CODE: +- gdbm_close(db); +- do { +- if (db->filter[i]) +- SvREFCNT_dec(db->filter[i]); +- } while (i-- > 0); +- safefree(db); ++ if (db && db->owner == aTHX) { ++ gdbm_close(db); ++ do { ++ if (db->filter[i]) ++ SvREFCNT_dec(db->filter[i]); ++ } while (i-- > 0); ++ safefree(db); ++ } + + #define gdbm_FETCH(db,key) gdbm_fetch(db->dbp,key) + datum_value +diff --git a/ext/NDBM_File/NDBM_File.xs b/ext/NDBM_File/NDBM_File.xs +index 52e60fc..af223e5 100644 +--- a/ext/NDBM_File/NDBM_File.xs ++++ b/ext/NDBM_File/NDBM_File.xs +@@ -33,6 +33,7 @@ END_EXTERN_C + #define store_value 3 + + typedef struct { ++ tTHX owner; + DBM * dbp ; + SV * filter[4]; + int filtering ; +@@ -71,6 +72,7 @@ ndbm_TIEHASH(dbtype, filename, flags, mode) + RETVAL = NULL ; + if ((dbp = dbm_open(filename, flags, mode))) { + RETVAL = (NDBM_File)safecalloc(1, sizeof(NDBM_File_type)); ++ RETVAL->owner = aTHX; + RETVAL->dbp = dbp ; + } + +@@ -84,12 +86,14 @@ ndbm_DESTROY(db) + PREINIT: + int i = store_value; + CODE: +- dbm_close(db->dbp); +- do { +- if (db->filter[i]) +- SvREFCNT_dec(db->filter[i]); +- } while (i-- > 0); +- safefree(db); ++ if (db && db->owner == aTHX) { ++ dbm_close(db->dbp); ++ do { ++ if (db->filter[i]) ++ SvREFCNT_dec(db->filter[i]); ++ } while (i-- > 0); ++ safefree(db); ++ } + + #define ndbm_FETCH(db,key) dbm_fetch(db->dbp,key) + datum_value +diff --git a/ext/ODBM_File/ODBM_File.xs b/ext/ODBM_File/ODBM_File.xs +index d1ece7f..f7e00a0 100644 +--- a/ext/ODBM_File/ODBM_File.xs ++++ b/ext/ODBM_File/ODBM_File.xs +@@ -45,6 +45,7 @@ datum nextkey(datum key); + #define store_value 3 + + typedef struct { ++ tTHX owner; + void * dbp ; + SV * filter[4]; + int filtering ; +@@ -112,6 +113,7 @@ odbm_TIEHASH(dbtype, filename, flags, mode) + } + dbp = (void*)(dbminit(filename) >= 0 ? &dbmrefcnt : 0); + RETVAL = (ODBM_File)safecalloc(1, sizeof(ODBM_File_type)); ++ RETVAL->owner = aTHX; + RETVAL->dbp = dbp ; + } + OUTPUT: +@@ -124,13 +126,15 @@ DESTROY(db) + dMY_CXT; + int i = store_value; + CODE: +- dbmrefcnt--; +- dbmclose(); +- do { +- if (db->filter[i]) +- SvREFCNT_dec(db->filter[i]); +- } while (i-- > 0); +- safefree(db); ++ if (db && db->owner == aTHX) { ++ dbmrefcnt--; ++ dbmclose(); ++ do { ++ if (db->filter[i]) ++ SvREFCNT_dec(db->filter[i]); ++ } while (i-- > 0); ++ safefree(db); ++ } + + datum_value + odbm_FETCH(db, key) +diff --git a/ext/SDBM_File/SDBM_File.xs b/ext/SDBM_File/SDBM_File.xs +index 291e41b..0bdae9a 100644 +--- a/ext/SDBM_File/SDBM_File.xs ++++ b/ext/SDBM_File/SDBM_File.xs +@@ -10,6 +10,7 @@ + #define store_value 3 + + typedef struct { ++ tTHX owner; + DBM * dbp ; + SV * filter[4]; + int filtering ; +@@ -49,6 +50,7 @@ sdbm_TIEHASH(dbtype, filename, flags, mode) + } + if (dbp) { + RETVAL = (SDBM_File)safecalloc(1, sizeof(SDBM_File_type)); ++ RETVAL->owner = aTHX; + RETVAL->dbp = dbp ; + } + +@@ -60,7 +62,7 @@ void + sdbm_DESTROY(db) + SDBM_File db + CODE: +- if (db) { ++ if (db && db->owner == aTHX) { + int i = store_value; + sdbm_close(db->dbp); + do { +diff --git a/t/lib/dbmt_common.pl b/t/lib/dbmt_common.pl +index 5d4098c..a0a4d52 100644 +--- a/t/lib/dbmt_common.pl ++++ b/t/lib/dbmt_common.pl +@@ -511,5 +511,40 @@ unlink , $Dfile; + unlink ; + } + ++{ ++ # Check DBM back-ends do not destroy objects from then-spawned threads. ++ # RT#61912. ++ SKIP: { ++ my $threads_count = 2; ++ skip 'Threads are disabled', 3 + 2 * $threads_count ++ unless $Config{usethreads}; ++ use_ok('threads'); ++ ++ my %h; ++ unlink ; ++ ++ my $db = tie %h, $DBM_Class, 'Op1_dbmx', $create, 0640; ++ isa_ok($db, $DBM_Class); ++ ++ for (1 .. 2) { ++ ok(threads->create( ++ sub { ++ $SIG{'__WARN__'} = sub { fail(shift) }; # debugging perl panics ++ # report it by spurious TAP line ++ 1; ++ }), "Thread $_ created"); ++ } ++ for (threads->list) { ++ is($_->join, 1, "A thread exited successfully"); ++ } ++ ++ pass("Tied object survived exiting threads"); ++ ++ undef $db; ++ untie %h; ++ unlink ; ++ } ++} ++ + done_testing(); + 1; +-- +1.9.3 + diff --git a/SOURCES/perl-5.22.0-Install-libperl.so-to-shrpdir-on-Linux.patch b/SOURCES/perl-5.22.0-Install-libperl.so-to-shrpdir-on-Linux.patch new file mode 100644 index 0000000..6d43814 --- /dev/null +++ b/SOURCES/perl-5.22.0-Install-libperl.so-to-shrpdir-on-Linux.patch @@ -0,0 +1,61 @@ +From 9644657c4 10326749fd321d9c24944ec25afad2f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Thu, 20 Jun 2013 15:22:53 +0200 +Subject: [PATCH] Install libperl.so to shrpdir on Linux +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Petr Písař +--- + Configure | 7 ++++--- + Makefile.SH | 2 +- + 2 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/Configure b/Configure +index 2f30261..825496e 100755 +--- a/Configure ++++ b/Configure +@@ -8249,7 +8249,9 @@ esac + + # Detect old use of shrpdir via undocumented Configure -Dshrpdir + case "$shrpdir" in +-'') ;; ++'') ++shrpdir=$archlibexp/CORE ++;; + *) $cat >&4 < +Date: Thu, 18 Jun 2015 13:19:49 +0200 +Subject: [PATCH] Revert "const the core magic vtables" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit c910fead7893fe9700031ee59de6b904260b5d69. + +It's necessary for Coro-6.43. This patch will be removed once Coro +will be fixed or in a reasonable time if Coro become unamaintained. + + + + +Signed-off-by: Petr Písař +--- + perl.h | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/perl.h b/perl.h +index dcb184b..9bce052 100644 +--- a/perl.h ++++ b/perl.h +@@ -5583,7 +5583,14 @@ EXTCONST runops_proc_t PL_runops_std + EXTCONST runops_proc_t PL_runops_dbg + INIT(Perl_runops_debug); + +-#define EXT_MGVTBL EXTCONST MGVTBL ++/* PERL_GLOBAL_STRUCT_PRIVATE wants to keep global data like the ++ * magic vtables const, but this is incompatible with SWIG which ++ * does want to modify the vtables. */ ++#ifdef PERL_GLOBAL_STRUCT_PRIVATE ++# define EXT_MGVTBL EXTCONST MGVTBL ++#else ++# define EXT_MGVTBL EXT MGVTBL ++#endif + + #define PERL_MAGIC_READONLY_ACCEPTABLE 0x40 + #define PERL_MAGIC_VALUE_MAGIC 0x80 +-- +2.1.0 + diff --git a/SOURCES/perl-5.22.1-Provide-ExtUtils-MM-methods-as-standalone-ExtUtils-M.patch b/SOURCES/perl-5.22.1-Provide-ExtUtils-MM-methods-as-standalone-ExtUtils-M.patch new file mode 100644 index 0000000..0cfc4c5 --- /dev/null +++ b/SOURCES/perl-5.22.1-Provide-ExtUtils-MM-methods-as-standalone-ExtUtils-M.patch @@ -0,0 +1,110 @@ +From 9575301256f67116eccdbb99b38fc804ba3dcf53 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Mon, 18 Apr 2016 16:24:03 +0200 +Subject: [PATCH] Provide ExtUtils::MM methods as standalone + ExtUtils::MM::Utils +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +If you cannot afford depending on ExtUtils::MakeMaker, you can +depend on ExtUtils::MM::Utils instead. + + + +Signed-off-by: Petr Písař +--- + MANIFEST | 1 + + cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM/Utils.pm | 68 ++++++++++++++++++++++++ + 2 files changed, 69 insertions(+) + create mode 100644 cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM/Utils.pm + +diff --git a/MANIFEST b/MANIFEST +index 6af238c..d4f0c56 100644 +--- a/MANIFEST ++++ b/MANIFEST +@@ -1045,6 +1045,7 @@ cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS2.pm MakeMaker methods for OS/2 + cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM.pm MakeMaker adaptor class + cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_QNX.pm MakeMaker methods for QNX + cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm MakeMaker methods for Unix ++cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM/Utils.pm Independed MM methods + cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_UWIN.pm MakeMaker methods for U/WIN + cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VMS.pm MakeMaker methods for VMS + cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VOS.pm MakeMaker methods for VOS +diff --git a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM/Utils.pm b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM/Utils.pm +new file mode 100644 +index 0000000..6bbc0d8 +--- /dev/null ++++ b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM/Utils.pm +@@ -0,0 +1,68 @@ ++package ExtUtils::MM::Utils; ++ ++require 5.006; ++ ++use strict; ++use vars qw($VERSION); ++$VERSION = '7.11_06'; ++$VERSION = eval $VERSION; ## no critic [BuiltinFunctions::ProhibitStringyEval] ++ ++=head1 NAME ++ ++ExtUtils::MM::Utils - ExtUtils::MM methods without dependency on ExtUtils::MakeMaker ++ ++=head1 SYNOPSIS ++ ++ require ExtUtils::MM::Utils; ++ MM->maybe_command($file); ++ ++=head1 DESCRIPTION ++ ++This is a collection of L subroutines that are used by many ++other modules but that do not need full-featured L. The ++issue with L is it pulls in Perl header files and that is ++an overkill for small subroutines. ++ ++An example is the L that caused installing GCC just because of ++three-line I from L. ++ ++The intentions is to use L instead of ++L for these trivial methods. You can still call them via ++L class name. ++ ++=head1 METHODS ++ ++=over 4 ++ ++=item maybe_command ++ ++Returns true, if the argument is likely to be a command. ++ ++=cut ++ ++if (!exists $INC{'ExtUtils/MM.pm'}) { ++ *MM::maybe_command = *ExtUtils::MM::maybe_command = \&maybe_command; ++} ++ ++sub maybe_command { ++ my($self,$file) = @_; ++ return $file if -x $file && ! -d $file; ++ return; ++} ++ ++1; ++ ++=back ++ ++=head1 BUGS ++ ++These methods are copied from L. Other operating systems ++are not supported yet. The reason is this ++L. ++ ++=head1 SEE ALSO ++ ++L, L ++ ++=cut +-- +2.5.5 + diff --git a/SOURCES/perl-5.22.1-Replace-EU-MM-dependnecy-with-EU-MM-Utils-in-IPC-Cmd.patch b/SOURCES/perl-5.22.1-Replace-EU-MM-dependnecy-with-EU-MM-Utils-in-IPC-Cmd.patch new file mode 100644 index 0000000..572d37e --- /dev/null +++ b/SOURCES/perl-5.22.1-Replace-EU-MM-dependnecy-with-EU-MM-Utils-in-IPC-Cmd.patch @@ -0,0 +1,34 @@ +From 216ddd39adb0043930acad70ff242c30a1b0c6cf Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Mon, 18 Apr 2016 16:39:32 +0200 +Subject: [PATCH] Replace EU::MM dependnecy with EU::MM::Utils in IPC::Cmd +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This allows to free from a run-time dependency on fat +ExtUtils::MakeMaker. + + + +Signed-off-by: Petr Písař +--- + cpan/IPC-Cmd/lib/IPC/Cmd.pm | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/cpan/IPC-Cmd/lib/IPC/Cmd.pm b/cpan/IPC-Cmd/lib/IPC/Cmd.pm +index 6a82bdf..b6cd7ef 100644 +--- a/cpan/IPC-Cmd/lib/IPC/Cmd.pm ++++ b/cpan/IPC-Cmd/lib/IPC/Cmd.pm +@@ -230,7 +230,7 @@ sub can_run { + } + + require File::Spec; +- require ExtUtils::MakeMaker; ++ require ExtUtils::MM::Utils; + + my @possibles; + +-- +2.5.5 + diff --git a/SOURCES/perl-5.24.0-assertion-failure-in-.-or-0-x-0.patch b/SOURCES/perl-5.24.0-assertion-failure-in-.-or-0-x-0.patch new file mode 100644 index 0000000..ee37f0b --- /dev/null +++ b/SOURCES/perl-5.24.0-assertion-failure-in-.-or-0-x-0.patch @@ -0,0 +1,73 @@ +From 702cf95bcb627f2b3b44fad409df7f0fd517af60 Mon Sep 17 00:00:00 2001 +From: David Mitchell +Date: Mon, 5 Dec 2016 14:54:44 +0000 +Subject: [PATCH] assertion failure in ... or ((0) x 0)) +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Petr Pisar: Ported to 5.24.0: + +commit 5aa240eab7dbaa91f98c2fee1f04b6c0b5a9b9e3 +Author: David Mitchell +Date: Mon Dec 5 14:54:44 2016 +0000 + + assertion failure in ... or ((0) x 0)) + + [perl #130247] Perl_rpeep(OP *): Assertion `oldop' failed + + the 'x 0' optimising code in rpeep didn't expect the repeat expression + to occur on the op_other side of an op_next chain. + +Signed-off-by: Petr Písař +--- + op.c | 4 ++-- + t/op/repeat.t | 11 ++++++++++- + 2 files changed, 12 insertions(+), 3 deletions(-) + +diff --git a/op.c b/op.c +index d7b900e..018d90c 100644 +--- a/op.c ++++ b/op.c +@@ -13573,10 +13573,10 @@ Perl_rpeep(pTHX_ OP *o) + && kid->op_next->op_type == OP_REPEAT + && kid->op_next->op_private & OPpREPEAT_DOLIST + && (kid->op_next->op_flags & OPf_WANT) == OPf_WANT_LIST +- && SvIOK(kSVOP_sv) && SvIVX(kSVOP_sv) == 0) ++ && SvIOK(kSVOP_sv) && SvIVX(kSVOP_sv) == 0 ++ && oldop) + { + o = kid->op_next; /* repeat */ +- assert(oldop); + oldop->op_next = o; + op_free(cBINOPo->op_first); + op_free(cBINOPo->op_last ); +diff --git a/t/op/repeat.t b/t/op/repeat.t +index bee7dac..c933475 100644 +--- a/t/op/repeat.t ++++ b/t/op/repeat.t +@@ -6,7 +6,7 @@ BEGIN { + } + + require './test.pl'; +-plan(tests => 48); ++plan(tests => 49); + + # compile time + +@@ -183,3 +183,12 @@ fresh_perl_like( + { }, + '(1) x ~1', + ); ++ ++# [perl #130247] Perl_rpeep(OP *): Assertion `oldop' failed ++# ++# the 'x 0' optimising code in rpeep didn't expect the repeat expression ++# to occur on the op_other side of an op_next chain. ++# This used to give an assertion failure ++ ++eval q{() = (() or ((0) x 0)); 1}; ++is($@, "", "RT #130247"); +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.0-clean-up-gv_fetchmethod_pvn_flags-introduce-name_end.patch b/SOURCES/perl-5.24.0-clean-up-gv_fetchmethod_pvn_flags-introduce-name_end.patch new file mode 100644 index 0000000..aaaa801 --- /dev/null +++ b/SOURCES/perl-5.24.0-clean-up-gv_fetchmethod_pvn_flags-introduce-name_end.patch @@ -0,0 +1,94 @@ +From af04cb4d2503c5c75d2229e232b8a0bd5c210084 Mon Sep 17 00:00:00 2001 +From: Yves Orton +Date: Tue, 13 Sep 2016 23:06:07 +0200 +Subject: [PATCH] clean up gv_fetchmethod_pvn_flags: introduce name_end +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.0: + +commit 65308f87d02a1900e59f0002fa94c855d4d4c5df +Author: Yves Orton +Date: Tue Sep 13 23:06:07 2016 +0200 + + clean up gv_fetchmethod_pvn_flags: introduce name_end + + nend is used for too many things, this replaces various + uses of nend with name_end, which is constant. + + this is a first step to fixing [perl #129267], which shouldnt + change any behavior + +Signed-off-by: Petr Písař +--- + gv.c | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +diff --git a/gv.c b/gv.c +index 28396de..d738bf0 100644 +--- a/gv.c ++++ b/gv.c +@@ -1014,6 +1014,8 @@ Perl_gv_fetchmethod_pv_flags(pTHX_ HV *stash, const char *name, U32 flags) + GV * + Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN len, U32 flags) + { ++ const char * const origname = name; ++ const char * const name_end = name + len; + const char *nend; + const char *nsplit = NULL; + GV* gv; +@@ -1034,7 +1036,7 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN le + the error reporting code. */ + } + +- for (nend = name; *nend || nend != (origname + len); nend++) { ++ for (nend = name; *nend || nend != name_end; nend++) { + if (*nend == '\'') { + nsplit = nend; + name = nend + 1; +@@ -1065,13 +1067,13 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN le + ostash = stash; + } + +- gv = gv_fetchmeth_pvn(stash, name, nend - name, 0, flags); ++ gv = gv_fetchmeth_pvn(stash, name, name_end - name, 0, flags); + if (!gv) { + if (strEQ(name,"import") || strEQ(name,"unimport")) + gv = MUTABLE_GV(&PL_sv_yes); + else if (autoload) + gv = gv_autoload_pvn( +- ostash, name, nend - name, GV_AUTOLOAD_ISMETHOD|flags ++ ostash, name, name_end - name, GV_AUTOLOAD_ISMETHOD|flags + ); + if (!gv && do_croak) { + /* Right now this is exclusively for the benefit of S_method_common +@@ -1087,14 +1089,14 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN le + HV_FETCH_ISEXISTS, NULL, 0) + ) { + require_pv("IO/File.pm"); +- gv = gv_fetchmeth_pvn(stash, name, nend - name, 0, flags); ++ gv = gv_fetchmeth_pvn(stash, name, name_end - name, 0, flags); + if (gv) + return gv; + } + Perl_croak(aTHX_ + "Can't locate object method \"%"UTF8f + "\" via package \"%"HEKf"\"", +- UTF8fARG(is_utf8, nend - name, name), ++ UTF8fARG(is_utf8, name_end - name, name), + HEKfARG(HvNAME_HEK(stash))); + } + else { +@@ -1111,7 +1113,7 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN le + "Can't locate object method \"%"UTF8f + "\" via package \"%"SVf"\"" + " (perhaps you forgot to load \"%"SVf"\"?)", +- UTF8fARG(is_utf8, nend - name, name), ++ UTF8fARG(is_utf8, name_end - name, name), + SVfARG(packnamesv), SVfARG(packnamesv)); + } + } +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.0-crash-on-explicit-return-from-s-e.patch b/SOURCES/perl-5.24.0-crash-on-explicit-return-from-s-e.patch new file mode 100644 index 0000000..fb71af0 --- /dev/null +++ b/SOURCES/perl-5.24.0-crash-on-explicit-return-from-s-e.patch @@ -0,0 +1,94 @@ +From 2c639acf40b4abc2783352f8e20dbfb68389e633 Mon Sep 17 00:00:00 2001 +From: David Mitchell +Date: Mon, 28 Nov 2016 08:03:49 +0000 +Subject: [PATCH] crash on explicit return from s///e +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Petr Pisar: Ported to 5.24.0: + +commit 7332835e5da7b7a793ef814a84e53003be1d0138 +Author: David Mitchell +Date: Mon Nov 28 08:03:49 2016 +0000 + + crash on explicit return from s///e + + RT #130188 + + In + + sub f { + my $x = 'a'; + $x =~ s/./return;/e; + } + + the 'return' triggers popping any contexts above the subroutine context: + in this case, a CXt_SUBST context. In this case, Perl_dounwind() calls + cx_popblock() for the bottom-most popped context, to restore any saved + vars. However, CXt_SUBST is the one context type which *doesn't* use + 'struct block' as part of its context struct union, so you can't + cx_popblock() a CXt_SUBST context. + + This commit makes it skip the cx_popblock() in this case. + + Bug was introduced by me with v5.23.7-235-gfc6e609. + +Signed-off-by: Petr Písař +--- + pp_ctl.c | 6 ++++++ + t/re/subst.t | 17 ++++++++++++++++- + 2 files changed, 22 insertions(+), 1 deletion(-) + +diff --git a/pp_ctl.c b/pp_ctl.c +index 99ff59a..b94c09a 100644 +--- a/pp_ctl.c ++++ b/pp_ctl.c +@@ -1529,6 +1529,12 @@ Perl_dounwind(pTHX_ I32 cxix) + switch (CxTYPE(cx)) { + case CXt_SUBST: + CX_POPSUBST(cx); ++ /* CXt_SUBST is not a block context type, so skip the ++ * cx_popblock(cx) below */ ++ if (cxstack_ix == cxix + 1) { ++ cxstack_ix--; ++ return; ++ } + break; + case CXt_SUB: + cx_popsub(cx); +diff --git a/t/re/subst.t b/t/re/subst.t +index 26a78c7..c039cc4 100644 +--- a/t/re/subst.t ++++ b/t/re/subst.t +@@ -11,7 +11,7 @@ BEGIN { + require './loc_tools.pl'; + } + +-plan( tests => 271 ); ++plan( tests => 272 ); + + $_ = 'david'; + $a = s/david/rules/r; +@@ -1119,3 +1119,15 @@ SKIP: { + {stderr => 1 }, + '[perl #129038 ] s/\xff//l no longer crashes'); + } ++ ++# [perl #130188] crash on return from substitution in subroutine ++# make sure returning from s///e doesn't SEGV ++{ ++ my $f = sub { ++ my $x = 'a'; ++ $x =~ s/./return;/e; ++ }; ++ my $x = $f->(); ++ pass("RT #130188"); ++} ++ ++ ++ ++ +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.0-perl-129130-make-chdir-allocate-the-stack-it-needs.patch b/SOURCES/perl-5.24.0-perl-129130-make-chdir-allocate-the-stack-it-needs.patch new file mode 100644 index 0000000..c3b723a --- /dev/null +++ b/SOURCES/perl-5.24.0-perl-129130-make-chdir-allocate-the-stack-it-needs.patch @@ -0,0 +1,66 @@ +From d47812b974b515e952dc093e692bf15f0a9afbc4 Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Mon, 5 Sep 2016 15:40:11 +1000 +Subject: [PATCH] (perl #129130) make chdir allocate the stack it needs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.0: + +commit 92c843fb4b4e1a1e0ac7ec0fe198dc77266838da +Author: Tony Cook +Date: Mon Sep 5 15:40:11 2016 +1000 + + (perl #129130) make chdir allocate the stack it needs + + chdir with no argument didn't ensure there was stack space available + for its result. + +Signed-off-by: Petr Písař +--- + pp_sys.c | 1 + + t/op/chdir.t | 8 +++++++- + 2 files changed, 8 insertions(+), 1 deletion(-) + +diff --git a/pp_sys.c b/pp_sys.c +index 3bf2673..d2cf872 100644 +--- a/pp_sys.c ++++ b/pp_sys.c +@@ -3639,6 +3639,7 @@ PP(pp_chdir) + HV * const table = GvHVn(PL_envgv); + SV **svp; + ++ EXTEND(SP, 1); + if ( (svp = hv_fetchs(table, "HOME", FALSE)) + || (svp = hv_fetchs(table, "LOGDIR", FALSE)) + #ifdef VMS +diff --git a/t/op/chdir.t b/t/op/chdir.t +index a5ea76a..685e556 100644 +--- a/t/op/chdir.t ++++ b/t/op/chdir.t +@@ -10,7 +10,7 @@ BEGIN { + # possibilities into @INC. + unshift @INC, qw(t . lib ../lib); + require "test.pl"; +- plan(tests => 47); ++ plan(tests => 48); + } + + use Config; +@@ -161,6 +161,12 @@ sub check_env { + } + } + ++fresh_perl_is(<<'EOP', '', { stderr => 1 }, "check stack handling"); ++for $x (map $_+1, 1 .. 100) { ++ map chdir, 1 .. $x; ++} ++EOP ++ + my %Saved_Env = (); + sub clean_env { + foreach my $env (@magic_envs) { +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.0-perl-129164-Crash-with-splice.patch b/SOURCES/perl-5.24.0-perl-129164-Crash-with-splice.patch new file mode 100644 index 0000000..44dbe0c --- /dev/null +++ b/SOURCES/perl-5.24.0-perl-129164-Crash-with-splice.patch @@ -0,0 +1,79 @@ +From 54550573a613ad20f00521880f345644a1db85cc Mon Sep 17 00:00:00 2001 +From: Father Chrysostomos +Date: Sun, 11 Sep 2016 21:29:56 -0700 +Subject: [PATCH] Crash with splice +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.0: + +commit 92b69f6501b4d7351e09c8b1ddd386aa7e1c9cd1 +Author: Father Chrysostomos +Date: Sun Sep 11 21:29:56 2016 -0700 + + [perl #129164] Crash with splice + + This fixes #129166 and #129167 as well. + + splice needs to take into account that arrays can hold NULLs and + return &PL_sv_undef in those cases where it would have returned a + NULL element. + +Signed-off-by: Petr Písař +--- + pp.c | 4 ++++ + t/op/array.t | 17 +++++++++++++++++ + 2 files changed, 21 insertions(+) + +diff --git a/pp.c b/pp.c +index 4a2cde0..4153482 100644 +--- a/pp.c ++++ b/pp.c +@@ -5488,6 +5488,8 @@ PP(pp_splice) + for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--) + SvREFCNT_dec(*dst++); /* free them now */ + } ++ if (!*MARK) ++ *MARK = &PL_sv_undef; + } + AvFILLp(ary) += diff; + +@@ -5584,6 +5586,8 @@ PP(pp_splice) + while (length-- > 0) + SvREFCNT_dec(tmparyval[length]); + } ++ if (!*MARK) ++ *MARK = &PL_sv_undef; + } + else + *MARK = &PL_sv_undef; +diff --git a/t/op/array.t b/t/op/array.t +index 4f0a772..fb4e8c6 100644 +--- a/t/op/array.t ++++ b/t/op/array.t +@@ -555,4 +555,21 @@ is $#foo, 3, 'assigning to arylen aliased in foreach(scalar $#arylen)'; + is "@a", 'a b c', 'assigning to itself'; + } + ++# [perl #129164], [perl #129166], [perl #129167] ++# splice() with null array entries ++# These used to crash. ++$#a = -1; $#a++; ++() = 0-splice @a; # subtract ++$#a = -1; $#a++; ++() = -splice @a; # negate ++$#a = -1; $#a++; ++() = 0+splice @a; # add ++# And with array expansion, too ++$#a = -1; $#a++; ++() = 0-splice @a, 0, 1, 1, 1; ++$#a = -1; $#a++; ++() = -splice @a, 0, 1, 1, 1; ++$#a = -1; $#a++; ++() = 0+splice @a, 0, 1, 1, 1; ++ + "We're included by lib/Tie/Array/std.t so we need to return something true"; +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.0-perl-129788-IO-Poll-fix-memory-leak.patch b/SOURCES/perl-5.24.0-perl-129788-IO-Poll-fix-memory-leak.patch new file mode 100644 index 0000000..aa6f20f --- /dev/null +++ b/SOURCES/perl-5.24.0-perl-129788-IO-Poll-fix-memory-leak.patch @@ -0,0 +1,134 @@ +From 478d23ef9e7700e20a75907648dd4c53b1b4f544 Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Tue, 25 Oct 2016 16:17:18 +1100 +Subject: [PATCH] (perl #129788) IO::Poll: fix memory leak +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Petr Pisar: Ported to 5.24.0: + +commit 6de2dd46140d0d3ab6813e26940d7b74418b0260 +Author: Tony Cook +Date: Tue Oct 25 16:17:18 2016 +1100 + + (perl #129788) IO::Poll: fix memory leak + + Whenever a magical/tied scalar which dies upon read was passed to _poll() + temporary buffer for events was not freed. + + Adapted from a patch by Sergey Aleynikov + +Signed-off-by: Petr Písař +--- + MANIFEST | 1 + + META.json | 1 + + META.yml | 1 + + dist/IO/IO.xs | 3 +-- + dist/IO/t/io_leak.t | 37 +++++++++++++++++++++++++++++++++++++ + 5 files changed, 41 insertions(+), 2 deletions(-) + create mode 100644 dist/IO/t/io_leak.t + +diff --git a/MANIFEST b/MANIFEST +index 2cdf616..3b5f8fb 100644 +--- a/MANIFEST ++++ b/MANIFEST +@@ -3228,6 +3228,7 @@ dist/IO/t/io_dir.t See if directory-related methods from IO work + dist/IO/t/io_dup.t See if dup()-related methods from IO work + dist/IO/t/io_file_export.t Test IO::File exports + dist/IO/t/io_file.t See if binmode()-related methods on IO::File work ++dist/IO/t/io_leak.t See if IO leaks SVs (only run in core) + dist/IO/t/io_linenum.t See if I/O line numbers are tracked correctly + dist/IO/t/io_multihomed.t See if INET sockets work with multi-homed hosts + dist/IO/t/io_pipe.t See if pipe()-related methods from IO work +diff --git a/META.json b/META.json +index 4cb21a9..2809b58 100644 +--- a/META.json ++++ b/META.json +@@ -84,6 +84,7 @@ + "dist/IO/t/io_dup.t", + "dist/IO/t/io_file.t", + "dist/IO/t/io_file_export.t", ++ "dist/IO/t/io_leak.t", + "dist/IO/t/io_linenum.t", + "dist/IO/t/io_multihomed.t", + "dist/IO/t/io_pipe.t", +diff --git a/META.yml b/META.yml +index 13a2bb3..7494d2a 100644 +--- a/META.yml ++++ b/META.yml +@@ -81,6 +81,7 @@ no_index: + - dist/IO/t/io_dup.t + - dist/IO/t/io_file.t + - dist/IO/t/io_file_export.t ++ - dist/IO/t/io_leak.t + - dist/IO/t/io_linenum.t + - dist/IO/t/io_multihomed.t + - dist/IO/t/io_pipe.t +diff --git a/dist/IO/IO.xs b/dist/IO/IO.xs +index fe749a6..15ef9b2 100644 +--- a/dist/IO/IO.xs ++++ b/dist/IO/IO.xs +@@ -318,7 +318,7 @@ PPCODE: + { + #ifdef HAS_POLL + const int nfd = (items - 1) / 2; +- SV *tmpsv = NEWSV(999,nfd * sizeof(struct pollfd)); ++ SV *tmpsv = sv_2mortal(NEWSV(999,nfd * sizeof(struct pollfd))); + /* We should pass _some_ valid pointer even if nfd is zero, but it + * doesn't matter what it is, since we're telling it to not check any fds. + */ +@@ -337,7 +337,6 @@ PPCODE: + sv_setiv(ST(i), fds[j].revents); i++; + } + } +- SvREFCNT_dec(tmpsv); + XSRETURN_IV(ret); + #else + not_here("IO::Poll::poll"); +diff --git a/dist/IO/t/io_leak.t b/dist/IO/t/io_leak.t +new file mode 100644 +index 0000000..08cbe2b +--- /dev/null ++++ b/dist/IO/t/io_leak.t +@@ -0,0 +1,37 @@ ++#!/usr/bin/perl ++ ++use warnings; ++use strict; ++ ++use Test::More; ++ ++eval { require XS::APItest; XS::APItest->import('sv_count'); 1 } ++ or plan skip_all => "No XS::APItest::sv_count() available"; ++ ++plan tests => 1; ++ ++sub leak { ++ my ($n, $delta, $code, $name) = @_; ++ my $sv0 = 0; ++ my $sv1 = 0; ++ for my $i (1..$n) { ++ &$code(); ++ $sv1 = sv_count(); ++ $sv0 = $sv1 if $i == 1; ++ } ++ cmp_ok($sv1-$sv0, '<=', ($n-1)*$delta, $name); ++} ++ ++# [perl #129788] IO::Poll shouldn't leak on errors ++{ ++ package io_poll_leak; ++ use IO::Poll; ++ ++ sub TIESCALAR { bless {} } ++ sub FETCH { die } ++ ++ tie(my $a, __PACKAGE__); ++ sub f {eval { IO::Poll::_poll(0, $a, 1) }} ++ ++ ::leak(5, 0, \&f, q{IO::Poll::_poll shouldn't leak}); ++} +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.0-regcomp.c-fix-perl-129950-fix-firstchar-bitmap-under.patch b/SOURCES/perl-5.24.0-regcomp.c-fix-perl-129950-fix-firstchar-bitmap-under.patch new file mode 100644 index 0000000..82eeea6 --- /dev/null +++ b/SOURCES/perl-5.24.0-regcomp.c-fix-perl-129950-fix-firstchar-bitmap-under.patch @@ -0,0 +1,97 @@ +From 1b90dad20879f0e7a3eced5da0e0aacda93708ed Mon Sep 17 00:00:00 2001 +From: Yves Orton +Date: Thu, 27 Oct 2016 13:52:24 +0200 +Subject: [PATCH] regcomp.c: fix perl #129950 - fix firstchar bitmap under utf8 + with prefix optimisation +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.0: + +commit da42332b10691ba7af7550035ffc7f46c87e4e66 +Author: Yves Orton +Date: Thu Oct 27 13:52:24 2016 +0200 + + regcomp.c: fix perl #129950 - fix firstchar bitmap under utf8 with prefix optimisation + + The trie code contains a number of sub optimisations, one of which + extracts common prefixes from alternations, and another which isa + bitmap of the possible matching first chars. + + The bitmap needs to contain the possible first octets of the string + which the trie can match, and for codepoints which might have a different + first octet under utf8 or non-utf8 need to register BOTH codepoints. + + So for instance in the pattern (?:a|a\x{E4}) we should restructure this + as a(|\x{E4), and the bitmap for the trie should contain both \x{E4} AND + \x{C3} as \x{C3} is the first byte of \x{EF} expressed as utf8. + +Signed-off-by: Petr Písař +--- + regcomp.c | 14 ++++++++++++++ + t/re/pat.t | 9 ++++++++- + 2 files changed, 22 insertions(+), 1 deletion(-) + +diff --git a/regcomp.c b/regcomp.c +index 7462885..bcb8db5 100644 +--- a/regcomp.c ++++ b/regcomp.c +@@ -3272,6 +3272,13 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, + TRIE_BITMAP_SET(trie,*ch); + if ( folder ) + TRIE_BITMAP_SET(trie, folder[ *ch ]); ++ if ( !UTF ) { ++ /* store first byte of utf8 representation of ++ variant codepoints */ ++ if (! UVCHR_IS_INVARIANT(*ch)) { ++ TRIE_BITMAP_SET(trie, UTF8_TWO_BYTE_HI(*ch)); ++ } ++ } + DEBUG_OPTIMISE_r( + Perl_re_printf( aTHX_ "%s", (char*)ch) + ); +@@ -3280,6 +3287,13 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, + TRIE_BITMAP_SET(trie,*ch); + if ( folder ) + TRIE_BITMAP_SET(trie,folder[ *ch ]); ++ if ( !UTF ) { ++ /* store first byte of utf8 representation of ++ variant codepoints */ ++ if (! UVCHR_IS_INVARIANT(*ch)) { ++ TRIE_BITMAP_SET(trie, UTF8_TWO_BYTE_HI(*ch)); ++ } ++ } + DEBUG_OPTIMISE_r(Perl_re_printf( aTHX_ "%s", ch)); + } + idx = ofs; +diff --git a/t/re/pat.t b/t/re/pat.t +index 295a9f7..4aa77cf 100644 +--- a/t/re/pat.t ++++ b/t/re/pat.t +@@ -23,7 +23,7 @@ BEGIN { + skip_all_without_unicode_tables(); + } + +-plan tests => 789; # Update this when adding/deleting tests. ++plan tests => 791; # Update this when adding/deleting tests. + + run_tests() unless caller; + +@@ -1758,6 +1758,13 @@ EOP + fresh_perl_is($code, $expect, {}, "$bug - $test_name" ); + } + } ++ ++ { ++ my $str = "a\xE4"; ++ ok( $str =~ m{^(a|a\x{e4})$}, "fix [perl #129950] - latin1 case" ); ++ utf8::upgrade($str); ++ ok( $str =~ m{^(a|a\x{e4})$}, "fix [perl #129950] - utf8 case" ); ++ } + } # End of sub run_tests + + 1; +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.0-rt-129336-perl-i-u-erroneously-interpreted-as-u.patch b/SOURCES/perl-5.24.0-rt-129336-perl-i-u-erroneously-interpreted-as-u.patch new file mode 100644 index 0000000..6438669 --- /dev/null +++ b/SOURCES/perl-5.24.0-rt-129336-perl-i-u-erroneously-interpreted-as-u.patch @@ -0,0 +1,92 @@ +From 03fcc0c44bc7972f2c92736daae5b63d601b7c49 Mon Sep 17 00:00:00 2001 +From: Dan Collins +Date: Fri, 23 Sep 2016 01:21:20 -0400 +Subject: [PATCH] [rt #129336] #!perl -i u erroneously interpreted as -u +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.0: + +commit f54cfdacff1f3744ef08fc70f1f3bc6c7d862e83 +Author: Dan Collins +Date: Fri Sep 23 01:21:20 2016 -0400 + + [rt #129336] #!perl -i u erroneously interpreted as -u + + Perl_moreswitches processes a single switch, and returns a pointer + to the start of the next switch. It can return either + the a pointer to the next flag itself: + + #!perl -n -p + ^ Can point here + + Or, to the space before the next "arg": + + #!perl -n -p + ^ Can point here + + (Where the next call to Perl_moreswitches will consume " -".) + + In the case of -i[extension], the pointer is by default pointing at + the space after the end of the argument. The current code tries to + do the former, by unconditionally advancing the pointer, and then + advancing it again if it is on a '-'. But that is incorrect: + + #!perl -i p + ^ Will point here, but that isn't a flag + + I could fix this by removing the unconditional s++, and having it + increment by 2 if *(s+1)=='-', but this work isn't actually + necessary - it's better to just leave it pointing at the space after + the argument. + +Signed-off-by: Petr Písař +--- + perl.c | 5 ----- + t/op/lex.t | 9 ++++++++- + 2 files changed, 8 insertions(+), 6 deletions(-) + +diff --git a/perl.c b/perl.c +index 228a0d8..5cc7d0b 100644 +--- a/perl.c ++++ b/perl.c +@@ -3306,11 +3306,6 @@ Perl_moreswitches(pTHX_ const char *s) + + PL_inplace = savepvn(start, s - start); + } +- if (*s) { +- ++s; +- if (*s == '-') /* Additional switches on #! line. */ +- s++; +- } + return s; + case 'I': /* -I handled both here and in parse_body() */ + forbid_setid('I', FALSE); +diff --git a/t/op/lex.t b/t/op/lex.t +index c515449..9ada592 100644 +--- a/t/op/lex.t ++++ b/t/op/lex.t +@@ -7,7 +7,7 @@ use warnings; + + BEGIN { chdir 't' if -d 't'; require './test.pl'; } + +-plan(tests => 26); ++plan(tests => 27); + + { + no warnings 'deprecated'; +@@ -209,3 +209,10 @@ fresh_perl_is( + { stderr => 1 }, + 's;@{< +Date: Wed, 30 Nov 2016 08:59:01 +0000 +Subject: [PATCH] split was leaving PL_sv_undef in unused ary slots +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Petr Pisar: Ported to 5.24.0: + +commit 71ca73e5fa9639ac33e9f2e74cd0c32288a5040d +Author: David Mitchell +Date: Wed Nov 30 08:59:01 2016 +0000 + + split was leaving PL_sv_undef in unused ary slots + + This: + + @a = split(/-/,"-"); + $a[1] = undef; + $a[0] = 0; + + was giving + + Modification of a read-only value attempted at foo line 3. + + This is because: + + 1) unused slots in AvARRAY between AvFILL and AvMAX should always be + null; av_clear(), av_extend() etc do this; while av_store(), if storing + to a slot N somewhere between AvFILL and AvMAX, doesn't bother to clear + between (AvFILL+1)..(N-1) on the assumption that everyone else plays + nicely. + + 2) pp_split() when splitting directly to an array, sometimes over-splits + and has to null out the excess elements; + + 3) Since perl 5.19.4, unused AV slots are now marked with NULL rather than + &PL_sv_undef; + + 4) pp_split was still using &PL_sv_undef; + + The fault was with (4), and is easily fixed. + +Signed-off-by: Petr Písař +--- + pp.c | 2 +- + t/op/split.t | 13 ++++++++++++- + 2 files changed, 13 insertions(+), 2 deletions(-) + +diff --git a/pp.c b/pp.c +index 4153482..70345ce 100644 +--- a/pp.c ++++ b/pp.c +@@ -6212,7 +6212,7 @@ PP(pp_split) + while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) { + if (TOPs && !make_mortal) + sv_2mortal(TOPs); +- *SP-- = &PL_sv_undef; ++ *SP-- = NULL; + iters--; + } + } +diff --git a/t/op/split.t b/t/op/split.t +index fb73271..b7846a1 100644 +--- a/t/op/split.t ++++ b/t/op/split.t +@@ -7,7 +7,7 @@ BEGIN { + set_up_inc('../lib'); + } + +-plan tests => 131; ++plan tests => 133; + + $FS = ':'; + +@@ -523,3 +523,14 @@ is "@a", '1 2 3', 'assignment to split-to-array (pmtarget/package array)'; + } + (@{\@a} = split //, "abc") = 1..10; + is "@a", '1 2 3', 'assignment to split-to-array (stacked)'; ++ ++# splitting directly to an array wasn't filling unused AvARRAY slots with ++# NULL ++ ++{ ++ my @a; ++ @a = split(/-/,"-"); ++ $a[1] = 'b'; ++ ok eval { $a[0] = 'a'; 1; }, "array split filling AvARRAY: assign 0"; ++ is "@a", "a b", "array split filling AvARRAY: result"; ++} +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-Fix-memory-leak-in-B-RHE-HASH-method.patch b/SOURCES/perl-5.24.1-Fix-memory-leak-in-B-RHE-HASH-method.patch new file mode 100644 index 0000000..3769416 --- /dev/null +++ b/SOURCES/perl-5.24.1-Fix-memory-leak-in-B-RHE-HASH-method.patch @@ -0,0 +1,65 @@ +From 3c38abae50c05c6f3c9f7eca561ec08c62fba1ba Mon Sep 17 00:00:00 2001 +From: Sergey Aleynikov +Date: Thu, 5 Jan 2017 01:33:32 +0300 +Subject: [PATCH] Fix memory leak in B::RHE->HASH method. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Petr Písař: Ported to 5.24.1: + +commit 4b6e9aa6aa2256da1ec7ed08f819cbf5d1463741 +Author: Sergey Aleynikov +Date: Thu Jan 5 01:33:32 2017 +0300 + + Fix memory leak in B::RHE->HASH method. + +Signed-off-by: Petr Písař +--- + ext/B/B.xs | 2 +- + t/op/svleak.t | 12 +++++++++++- + 2 files changed, 12 insertions(+), 2 deletions(-) + +diff --git a/ext/B/B.xs b/ext/B/B.xs +index b4b6a40..e859d7d 100644 +--- a/ext/B/B.xs ++++ b/ext/B/B.xs +@@ -2179,7 +2179,7 @@ SV* + HASH(h) + B::RHE h + CODE: +- RETVAL = newRV( (SV*)cophh_2hv(h, 0) ); ++ RETVAL = newRV_noinc( (SV*)cophh_2hv(h, 0) ); + OUTPUT: + RETVAL + +diff --git a/t/op/svleak.t b/t/op/svleak.t +index c18f498..b0692ff 100644 +--- a/t/op/svleak.t ++++ b/t/op/svleak.t +@@ -15,7 +15,7 @@ BEGIN { + + use Config; + +-plan tests => 132; ++plan tests => 133; + + # run some code N times. If the number of SVs at the end of loop N is + # greater than (N-1)*delta at the end of loop 1, we've got a leak +@@ -547,3 +547,13 @@ EOF + sub f { $a =~ /[^.]+$b/; } + ::leak(2, 0, \&f, q{use re 'strict' shouldn't leak warning strings}); + } ++ ++# check that B::RHE->HASH does not leak ++{ ++ package BHINT; ++ sub foo {} ++ require B; ++ my $op = B::svref_2object(\&foo)->ROOT->first; ++ sub lk { { my $d = $op->hints_hash->HASH } } ++ ::leak(3, 0, \&lk, q!B::RHE->HASH shoudln't leak!); ++} +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-RT-130624-heap-use-after-free-in-4-arg-substr.patch b/SOURCES/perl-5.24.1-RT-130624-heap-use-after-free-in-4-arg-substr.patch new file mode 100644 index 0000000..f018778 --- /dev/null +++ b/SOURCES/perl-5.24.1-RT-130624-heap-use-after-free-in-4-arg-substr.patch @@ -0,0 +1,70 @@ +From 4e0fb37303b72ed9d38949139c304abdb73e223e Mon Sep 17 00:00:00 2001 +From: Aaron Crane +Date: Tue, 24 Jan 2017 23:39:40 +0000 +Subject: [PATCH] RT#130624: heap-use-after-free in 4-arg substr +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: + +commit 41b1e858a075694f88057b9514f5fc78c80b5355 +Author: Aaron Crane +Date: Tue Jan 24 23:39:40 2017 +0000 + + RT#130624: heap-use-after-free in 4-arg substr + +Signed-off-by: Petr Písař +--- + pp.c | 4 +++- + t/op/substr.t | 14 +++++++++++++- + 2 files changed, 16 insertions(+), 2 deletions(-) + +diff --git a/pp.c b/pp.c +index 334b353..aa6cff0 100644 +--- a/pp.c ++++ b/pp.c +@@ -3462,8 +3462,10 @@ PP(pp_substr) + tmps = SvPV_force_nomg(sv, curlen); + if (DO_UTF8(repl_sv) && repl_len) { + if (!DO_UTF8(sv)) { ++ /* Upgrade the dest, and recalculate tmps in case the buffer ++ * got reallocated; curlen may also have been changed */ + sv_utf8_upgrade_nomg(sv); +- curlen = SvCUR(sv); ++ tmps = SvPV_nomg(sv, curlen); + } + } + else if (DO_UTF8(sv)) +diff --git a/t/op/substr.t b/t/op/substr.t +index 01c36a9..f9fee48 100644 +--- a/t/op/substr.t ++++ b/t/op/substr.t +@@ -22,7 +22,7 @@ $SIG{__WARN__} = sub { + } + }; + +-plan(389); ++plan(391); + + run_tests() unless caller; + +@@ -872,3 +872,15 @@ is($destroyed, 1, 'Timely scalar destruction with lvalue substr'); + + # failed with ASAN + fresh_perl_is('$0 = "/usr/bin/perl"; substr($0, 0, 0, $0)', '', {}, "(perl #129340) substr() with source in target"); ++ ++ ++# [perl #130624] - heap-use-after-free, observable under asan ++{ ++ my $x = "\xE9zzzz"; ++ my $y = "\x{100}"; ++ my $z = substr $x, 0, 1, $y; ++ is $z, "\xE9", "RT#130624: heap-use-after-free in 4-arg substr (ret)"; ++ is $x, "\x{100}zzzz", "RT#130624: heap-use-after-free in 4-arg substr (targ)"; ++} ++ ++ +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-buffer-overrun-with-format-and-use-bytes.patch b/SOURCES/perl-5.24.1-buffer-overrun-with-format-and-use-bytes.patch new file mode 100644 index 0000000..8e9d245 --- /dev/null +++ b/SOURCES/perl-5.24.1-buffer-overrun-with-format-and-use-bytes.patch @@ -0,0 +1,93 @@ +From fd25d49cae6409a4ce901fd4d899a197541604b3 Mon Sep 17 00:00:00 2001 +From: David Mitchell +Date: Sat, 4 Feb 2017 15:10:49 +0000 +Subject: [PATCH] buffer overrun with format and 'use bytes' +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: + +commit e452bf1c9e9f30813b1f289188a6e8b0894575ba +Author: David Mitchell +Date: Sat Feb 4 15:10:49 2017 +0000 + + buffer overrun with format and 'use bytes' + + RT #130703 + + In the scope of 'use bytes', appending a string to a format where the + format is utf8 and the string is non-utf8 but contains lots of chars + with ords >= 128, the buffer could be overrun. This is due to all the + \x80-type chars going from being stored as 1 bytes to 2 bytes, without + growing PL_formtarget accordingly. + + This commit contains a minimal fix; the next commit will more generally + tidy up the grow code in pp_formline. + +Signed-off-by: Petr Písař +--- + pp_ctl.c | 3 +++ + t/op/write.t | 18 +++++++++++++++++- + 2 files changed, 20 insertions(+), 1 deletion(-) + +diff --git a/pp_ctl.c b/pp_ctl.c +index a1fc2f4..4d5ef2e 100644 +--- a/pp_ctl.c ++++ b/pp_ctl.c +@@ -505,6 +505,8 @@ PP(pp_formline) + SvTAINTED_on(PL_formtarget); + if (DO_UTF8(PL_formtarget)) + targ_is_utf8 = TRUE; ++ /* this is an initial estimate of how much output buffer space ++ * to allocate. It may be exceeded later */ + linemax = (SvCUR(formsv) * (IN_BYTES ? 1 : 3) + 1); + t = SvGROW(PL_formtarget, len + linemax + 1); + /* XXX from now onwards, SvCUR(PL_formtarget) is invalid */ +@@ -766,6 +768,7 @@ PP(pp_formline) + + if (targ_is_utf8 && !item_is_utf8) { + source = tmp = bytes_to_utf8(source, &to_copy); ++ grow = to_copy; + } else { + if (item_is_utf8 && !targ_is_utf8) { + U8 *s; +diff --git a/t/op/write.t b/t/op/write.t +index ab2733f..ae4ddb5 100644 +--- a/t/op/write.t ++++ b/t/op/write.t +@@ -98,7 +98,7 @@ for my $tref ( @NumTests ){ + my $bas_tests = 21; + + # number of tests in section 3 +-my $bug_tests = 66 + 3 * 3 * 5 * 2 * 3 + 2 + 66 + 6 + 2 + 3 + 96 + 11 + 3; ++my $bug_tests = 66 + 3 * 3 * 5 * 2 * 3 + 2 + 66 + 6 + 2 + 3 + 96 + 11 + 4; + + # number of tests in section 4 + my $hmb_tests = 37; +@@ -1562,6 +1562,22 @@ ok defined *{$::{CmT}}{FORMAT}, "glob assign"; + formline $format, $orig, 12345; + is $^A, ("x" x 100) . " 12345\n", "\@* doesn't overflow"; + ++ # ...nor this (RT #130703). ++ # Under 'use bytes', the two bytes (c2, 80) making up each \x80 char ++ # each get expanded to two bytes (so four in total per \x80 char); the ++ # buffer growth wasn't accounting for this doubling in size ++ ++ { ++ local $^A = ''; ++ my $format = "X\n\x{100}" . ("\x80" x 200); ++ my $expected = $format; ++ utf8::encode($expected); ++ use bytes; ++ formline($format); ++ is $^A, $expected, "RT #130703"; ++ } ++ ++ + # make sure it can cope with formats > 64k + + $format = 'x' x 65537; +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-don-t-call-Perl_fbm_instr-with-negative-length.patch b/SOURCES/perl-5.24.1-don-t-call-Perl_fbm_instr-with-negative-length.patch new file mode 100644 index 0000000..08fb660 --- /dev/null +++ b/SOURCES/perl-5.24.1-don-t-call-Perl_fbm_instr-with-negative-length.patch @@ -0,0 +1,116 @@ +From b0254cedee2517d2705070839549189cf9f72db4 Mon Sep 17 00:00:00 2001 +From: David Mitchell +Date: Fri, 16 Jun 2017 15:46:19 +0100 +Subject: [PATCH] don't call Perl_fbm_instr() with negative length +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: + +commit bb152a4b442f7718fd37d32cc558be675e8ae1ae +Author: David Mitchell +Date: Fri Jun 16 15:46:19 2017 +0100 + + don't call Perl_fbm_instr() with negative length + + RT #131575 + + re_intuit_start() could calculate a maximum end position less than the + current start position. This used to get rejected by fbm_intr(), until + v5.23.3-110-g147f21b, which made fbm_intr() faster and removed unnecessary + checks. + + This commits fixes re_intuit_start(), and adds an assert to fbm_intr(). + +Signed-off-by: Petr Písař +--- + regexec.c | 17 +++++++++++------ + t/re/pat.t | 13 ++++++++++++- + util.c | 2 ++ + 3 files changed, 25 insertions(+), 7 deletions(-) + +diff --git a/regexec.c b/regexec.c +index f1a52ab..3080880 100644 +--- a/regexec.c ++++ b/regexec.c +@@ -127,13 +127,16 @@ static const char* const non_utf8_target_but_utf8_required + (U8*)(off >= 0 ? reginfo->strend : reginfo->strbeg)) \ + : (U8*)(pos + off)) + +-#define HOPBACKc(pos, off) \ +- (char*)(reginfo->is_utf8_target \ +- ? reghopmaybe3((U8*)pos, (SSize_t)0-off, (U8*)(reginfo->strbeg)) \ +- : (pos - off >= reginfo->strbeg) \ +- ? (U8*)pos - off \ ++/* like HOPMAYBE3 but backwards. lim must be +ve. Returns NULL on overshoot */ ++#define HOPBACK3(pos, off, lim) \ ++ (reginfo->is_utf8_target \ ++ ? reghopmaybe3((U8*)pos, (SSize_t)0-off, (U8*)(lim)) \ ++ : (pos - off >= lim) \ ++ ? (U8*)pos - off \ + : NULL) + ++#define HOPBACKc(pos, off) ((char*)HOPBACK3(pos, off, reginfo->strbeg)) ++ + #define HOP3(pos,off,lim) (reginfo->is_utf8_target ? reghop3((U8*)(pos), off, (U8*)(lim)) : (U8*)(pos + off)) + #define HOP3c(pos,off,lim) ((char*)HOP3(pos,off,lim)) + +@@ -871,7 +874,9 @@ Perl_re_intuit_start(pTHX_ + (IV)prog->check_end_shift); + }); + +- end_point = HOP3(strend, -end_shift, strbeg); ++ end_point = HOPBACK3(strend, end_shift, rx_origin); ++ if (!end_point) ++ goto fail_finish; + start_point = HOPMAYBE3(rx_origin, start_shift, end_point); + if (!start_point) + goto fail_finish; +diff --git a/t/re/pat.t b/t/re/pat.t +index 50529b8..007f11d 100644 +--- a/t/re/pat.t ++++ b/t/re/pat.t +@@ -23,7 +23,7 @@ BEGIN { + skip_all_without_unicode_tables(); + } + +-plan tests => 793; # Update this when adding/deleting tests. ++plan tests => 794; # Update this when adding/deleting tests. + + run_tests() unless caller; + +@@ -1783,6 +1783,17 @@ EOP + # [perl #129281] buffer write overflow, detected by ASAN, valgrind + fresh_perl_is('/0(?0)|^*0(?0)|^*(^*())0|/', '', {}, "don't bump whilem_c too much"); + } ++ ++ { ++ # RT #131575 intuit skipping back from the end to find the highest ++ # possible start point, was potentially hopping back beyond pos() ++ # and crashing by calling fbm_instr with a negative length ++ ++ my $text = "=t=\x{5000}"; ++ pos($text) = 3; ++ ok(scalar($text !~ m{(~*=[a-z]=)}g), "RT #131575"); ++ } ++ + } # End of sub run_tests + + 1; +diff --git a/util.c b/util.c +index df75db0..bc265f5 100644 +--- a/util.c ++++ b/util.c +@@ -806,6 +806,8 @@ Perl_fbm_instr(pTHX_ unsigned char *big, unsigned char *bigend, SV *littlestr, U + + PERL_ARGS_ASSERT_FBM_INSTR; + ++ assert(bigend >= big); ++ + if ((STRLEN)(bigend - big) < littlelen) { + if ( SvTAIL(littlestr) + && ((STRLEN)(bigend - big) == littlelen - 1) +-- +2.9.4 + diff --git a/SOURCES/perl-5.24.1-fix-RT-130561-recursion-and-optimising-away-impossib.patch b/SOURCES/perl-5.24.1-fix-RT-130561-recursion-and-optimising-away-impossib.patch new file mode 100644 index 0000000..2a2e6b2 --- /dev/null +++ b/SOURCES/perl-5.24.1-fix-RT-130561-recursion-and-optimising-away-impossib.patch @@ -0,0 +1,93 @@ +From fbb9dc823a06b4815ee8fd8632fc475b8034e379 Mon Sep 17 00:00:00 2001 +From: Yves Orton +Date: Fri, 27 Jan 2017 10:18:51 +0100 +Subject: [PATCH] fix RT #130561 - recursion and optimising away impossible + quantifiers are not friends +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: + +commit 31fc93954d1f379c7a49889d91436ce99818e1f6 +Author: Yves Orton +Date: Fri Jan 27 10:18:51 2017 +0100 + + fix RT #130561 - recursion and optimising away impossible quantifiers are not friends + + Instead of optimising away impossible quantifiers like (foo){1,0} treat them + as unquantified, and guard them with an OPFAIL. Thus /(foo){1,0}/ is treated + the same as /(*FAIL)(foo)/ this is important in patterns like /(foo){1,0}|(?1)/ + where the (?1) needs to be able to recurse into the (foo) even though the + (foo){1,0} can never match. It also resolves various issues (SEGVs) with patterns + like /((?1)){1,0}/. + + This patch would have been easier if S_reginsert() documented that it is + the callers responsibility to properly set up the NEXT_OFF() of the inserted + node (if the node has a NEXT_OFF()) + +Signed-off-by: Petr Písař +--- + regcomp.c | 14 +++----------- + t/re/pat_rt_report.t | 11 ++++++++++- + 2 files changed, 13 insertions(+), 12 deletions(-) + +diff --git a/regcomp.c b/regcomp.c +index bcb8db5..9f343d3 100644 +--- a/regcomp.c ++++ b/regcomp.c +@@ -11497,19 +11497,11 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth) + nextchar(pRExC_state); + if (max < min) { /* If can't match, warn and optimize to fail + unconditionally */ +- if (SIZE_ONLY) { +- +- /* We can't back off the size because we have to reserve +- * enough space for all the things we are about to throw +- * away, but we can shrink it by the amount we are about +- * to re-use here */ +- RExC_size += PREVOPER(RExC_size) - regarglen[(U8)OPFAIL]; +- } +- else { ++ if (PASS2) { + ckWARNreg(RExC_parse, "Quantifier {n,m} with n > m can't match"); +- RExC_emit = orig_emit; + } +- ret = reganode(pRExC_state, OPFAIL, 0); ++ reginsert(pRExC_state, OPFAIL, orig_emit, depth+1); ++ NEXT_OFF(orig_emit)= regarglen[OPFAIL] + NODE_STEP_REGNODE; + return ret; + } + else if (min == max && *RExC_parse == '?') +diff --git a/t/re/pat_rt_report.t b/t/re/pat_rt_report.t +index cb02ad2..2c1dbc4 100644 +--- a/t/re/pat_rt_report.t ++++ b/t/re/pat_rt_report.t +@@ -20,7 +20,7 @@ use warnings; + use 5.010; + use Config; + +-plan tests => 2500; # Update this when adding/deleting tests. ++plan tests => 2502; # Update this when adding/deleting tests. + + run_tests() unless caller; + +@@ -1113,6 +1113,15 @@ EOP + my $s = "\x{1ff}" . "f" x 32; + ok($s =~ /\x{1ff}[[:alpha:]]+/gca, "POSIXA pointer wrap"); + } ++ { ++ # rt ++ fresh_perl_is( ++ '"foo"=~/((?1)){8,0}/; print "ok"', ++ "ok", {}, 'RT #130561 - allowing impossible quantifier should not cause SEGVs'); ++ my $s= "foo"; ++ ok($s=~/(foo){1,0}|(?1)/, ++ "RT #130561 - allowing impossible quantifier should not break recursion"); ++ } + } # End of sub run_tests + + 1; +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-fix-pad-scope-issue-in-re_evals.patch b/SOURCES/perl-5.24.1-fix-pad-scope-issue-in-re_evals.patch new file mode 100644 index 0000000..17c82b4 --- /dev/null +++ b/SOURCES/perl-5.24.1-fix-pad-scope-issue-in-re_evals.patch @@ -0,0 +1,198 @@ +From f3704e62341b10824f503aa0c8029670d101a434 Mon Sep 17 00:00:00 2001 +From: David Mitchell +Date: Sat, 11 Feb 2017 11:53:41 +0000 +Subject: [PATCH] fix pad/scope issue in re_evals +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: +commit 4b9c7caeaecf4e9df0be3a2e296644f763f775d6 +Author: David Mitchell +Date: Sat Feb 11 11:53:41 2017 +0000 + + fix pad/scope issue in re_evals + + RT #129881 heap-buffer-overflow Perl_pad_sv + + In some circumstances involving a pattern which has embedded code blocks + from more than one source, e.g. + + my $r = qr{(?{1;}){2}X}; + "" =~ /$r|(?{1;})/; + + the wrong PL_comppad could be active while doing a LEAVE_SCOPE() or on + exit from the pattern. + + This was mainly due to the big context stack changes in 5.24.0 - in + particular, since POP_MULTICALL() now does CX_LEAVE_SCOPE(cx) *before* + restoring PL_comppad, the (correct) unwinding of any SAVECOMPPAD's was + being followed by Cblk_sub.prevcomppad>, which wasn't + necessarily a sensible value. + + To fix this, record the value of PL_savestack_ix at entry to S_regmatch(), + and set the cx->blk_oldsaveix of the MULTICALL to this value when pushed. + On exit from S_regmatch, we either POP_MULTICALL which will do a + LEAVE_SCOPE(cx->blk_oldsaveix), or in the absense of any EVAL, do the + explicit but equivalent LEAVE_SCOPE(orig_savestack_ix). + + Note that this is a change in behaviour to S_regmatch() - formerly it + wouldn't necessarily clear the savestack completely back the point of + entry - that would get left to do by its caller, S_regtry(), or indirectly + by Perl_regexec_flags(). This shouldn't make any practical difference, but + is tidier and less likely to introduce bugs later. + +Signed-off-by: Petr Písař +--- + regexec.c | 69 +++++++++++++++++++++++++++++++++++++++++++----------- + t/re/pat_re_eval.t | 20 +++++++++++++++- + 2 files changed, 74 insertions(+), 15 deletions(-) + +diff --git a/regexec.c b/regexec.c +index a7bc0c3..5656cdd 100644 +--- a/regexec.c ++++ b/regexec.c +@@ -5233,6 +5233,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog) + _char_class_number classnum; + bool is_utf8_pat = reginfo->is_utf8_pat; + bool match = FALSE; ++ I32 orig_savestack_ix = PL_savestack_ix; + + /* Solaris Studio 12.3 messes up fetching PL_charclass['\n'] */ + #if (defined(__SUNPRO_C) && (__SUNPRO_C == 0x5120) && defined(__x86_64) && defined(USE_64_BIT_ALL)) +@@ -6646,30 +6647,67 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog) + nop = (OP*)rexi->data->data[n]; + } + +- /* normally if we're about to execute code from the same +- * CV that we used previously, we just use the existing +- * CX stack entry. However, its possible that in the +- * meantime we may have backtracked, popped from the save +- * stack, and undone the SAVECOMPPAD(s) associated with +- * PUSH_MULTICALL; in which case PL_comppad no longer +- * points to newcv's pad. */ ++ /* Some notes about MULTICALL and the context and save stacks. ++ * ++ * In something like ++ * /...(?{ my $x)}...(?{ my $z)}...(?{ my $z)}.../ ++ * since codeblocks don't introduce a new scope (so that ++ * local() etc accumulate), at the end of a successful ++ * match there will be a SAVEt_CLEARSV on the savestack ++ * for each of $x, $y, $z. If the three code blocks above ++ * happen to have come from different CVs (e.g. via ++ * embedded qr//s), then we must ensure that during any ++ * savestack unwinding, PL_comppad always points to the ++ * right pad at each moment. We achieve this by ++ * interleaving SAVEt_COMPPAD's on the savestack whenever ++ * there is a change of pad. ++ * In theory whenever we call a code block, we should ++ * push a CXt_SUB context, then pop it on return from ++ * that code block. This causes a bit of an issue in that ++ * normally popping a context also clears the savestack ++ * back to cx->blk_oldsaveix, but here we specifically ++ * don't want to clear the save stack on exit from the ++ * code block. ++ * Also for efficiency we don't want to keep pushing and ++ * popping the single SUB context as we backtrack etc. ++ * So instead, we push a single context the first time ++ * we need, it, then hang onto it until the end of this ++ * function. Whenever we encounter a new code block, we ++ * update the CV etc if that's changed. During the times ++ * in this function where we're not executing a code ++ * block, having the SUB context still there is a bit ++ * naughty - but we hope that no-one notices. ++ * When the SUB context is initially pushed, we fake up ++ * cx->blk_oldsaveix to be as if we'd pushed this context ++ * on first entry to S_regmatch rather than at some random ++ * point during the regexe execution. That way if we ++ * croak, popping the context stack will ensure that ++ * *everything* SAVEd by this function is undone and then ++ * the context popped, rather than e.g., popping the ++ * context (and restoring the original PL_comppad) then ++ * popping more of the savestack and restoiring a bad ++ * PL_comppad. ++ */ ++ ++ /* If this is the first EVAL, push a MULTICALL. On ++ * subsequent calls, if we're executing a different CV, or ++ * if PL_comppad has got messed up from backtracking ++ * through SAVECOMPPADs, then refresh the context. ++ */ + if (newcv != last_pushed_cv || PL_comppad != last_pad) + { + U8 flags = (CXp_SUB_RE | + ((newcv == caller_cv) ? CXp_SUB_RE_FAKE : 0)); ++ SAVECOMPPAD(); + if (last_pushed_cv) { +- /* PUSH/POP_MULTICALL save and restore the +- * caller's PL_comppad; if we call multiple subs +- * using the same CX block, we have to save and +- * unwind the varying PL_comppad's ourselves, +- * especially restoring the right PL_comppad on +- * backtrack - so save it on the save stack */ +- SAVECOMPPAD(); + CHANGE_MULTICALL_FLAGS(newcv, flags); + } + else { + PUSH_MULTICALL_FLAGS(newcv, flags); + } ++ /* see notes above */ ++ CX_CUR()->blk_oldsaveix = orig_savestack_ix; ++ + last_pushed_cv = newcv; + } + else { +@@ -8456,9 +8494,12 @@ NULL + + if (last_pushed_cv) { + dSP; ++ /* see "Some notes about MULTICALL" above */ + POP_MULTICALL; + PERL_UNUSED_VAR(SP); + } ++ else ++ LEAVE_SCOPE(orig_savestack_ix); + + assert(!result || locinput - reginfo->strbeg >= 0); + return result ? locinput - reginfo->strbeg : -1; +diff --git a/t/re/pat_re_eval.t b/t/re/pat_re_eval.t +index e59b059..1a0b228 100644 +--- a/t/re/pat_re_eval.t ++++ b/t/re/pat_re_eval.t +@@ -22,7 +22,7 @@ BEGIN { + } + + +-plan tests => 527; # Update this when adding/deleting tests. ++plan tests => 530; # Update this when adding/deleting tests. + + run_tests() unless caller; + +@@ -1232,6 +1232,24 @@ sub run_tests { + 'padtmp swiping does not affect "$a$b" =~ /(??{})/' + } + ++ # RT #129881 ++ # on exit from a pattern with multiple code blocks from different ++ # CVs, PL_comppad wasn't being restored correctly ++ ++ sub { ++ # give first few pad slots known values ++ my ($x1, $x2, $x3, $x4, $x5) = 101..105; ++ # these vars are in a separate pad ++ my $r = qr/((?{my ($y1, $y2) = 201..202; 1;})A){2}X/; ++ # the first alt fails, causing a switch to this anon ++ # sub's pad ++ "AAA" =~ /$r|(?{my ($z1, $z2) = 301..302; 1;})A/; ++ is $x1, 101, "RT #129881: x1"; ++ is $x2, 102, "RT #129881: x2"; ++ is $x3, 103, "RT #129881: x3"; ++ }->(); ++ ++ + } # End of sub run_tests + + 1; +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-fix-special-case-recreation-of.patch b/SOURCES/perl-5.24.1-fix-special-case-recreation-of.patch new file mode 100644 index 0000000..4d28a8d --- /dev/null +++ b/SOURCES/perl-5.24.1-fix-special-case-recreation-of.patch @@ -0,0 +1,79 @@ +From 59ef97c7af81ab6faba749d88b558a55da41c249 Mon Sep 17 00:00:00 2001 +From: Zefram +Date: Sun, 22 Jan 2017 07:26:34 +0000 +Subject: [PATCH] fix special-case recreation of *:: +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: + +commit 120921acd4cf27bb932a725a8cf5c957652b22eb +Author: Zefram +Date: Sun Jan 22 07:26:34 2017 +0000 + + fix special-case recreation of *:: + + If *:: is called for then as a special case it is looked up as + $::{"main::"}. If $::{"main::"} has been deleted, then that hash entry + is recreated. But formerly it was only recreated as an undef scalar, + which broke things relying on glob lookup returning a glob. Now in + that special case the recreated hash entry is initialised as a glob, + and populated with the customary recursive reference to the main stash. + Fixes [perl #129869]. + +Signed-off-by: Petr Písař +--- + gv.c | 11 +++++++++-- + t/op/stash.t | 9 ++++++++- + 2 files changed, 17 insertions(+), 3 deletions(-) + +diff --git a/gv.c b/gv.c +index c89a3e7..3fda9b9 100644 +--- a/gv.c ++++ b/gv.c +@@ -1642,8 +1642,15 @@ S_parse_gv_stash_name(pTHX_ HV **stash, GV **gv, const char **name, + name_cursor++; + *name = name_cursor+1; + if (*name == name_end) { +- if (!*gv) +- *gv = MUTABLE_GV(*hv_fetchs(PL_defstash, "main::", TRUE)); ++ if (!*gv) { ++ *gv = MUTABLE_GV(*hv_fetchs(PL_defstash, "main::", TRUE)); ++ if (SvTYPE(*gv) != SVt_PVGV) { ++ gv_init_pvn(*gv, PL_defstash, "main::", 6, ++ GV_ADDMULTI); ++ GvHV(*gv) = ++ MUTABLE_HV(SvREFCNT_inc_simple(PL_defstash)); ++ } ++ } + return TRUE; + } + } +diff --git a/t/op/stash.t b/t/op/stash.t +index 7ac379b..d6fded4 100644 +--- a/t/op/stash.t ++++ b/t/op/stash.t +@@ -7,7 +7,7 @@ BEGIN { + + BEGIN { require "./test.pl"; } + +-plan( tests => 54 ); ++plan( tests => 55 ); + + # Used to segfault (bug #15479) + fresh_perl_like( +@@ -355,3 +355,10 @@ is runperl( + ), + "ok\n", + "[perl #128238] non-stashes in stashes"; ++ ++is runperl( ++ prog => '%:: = (); print *{q|::|}, qq|\n|', ++ stderr => 1, ++ ), ++ "*main::main::\n", ++ "[perl #129869] lookup %:: by name after clearing %::"; +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-perl-129125-copy-form-data-if-it-might-be-freed.patch b/SOURCES/perl-5.24.1-perl-129125-copy-form-data-if-it-might-be-freed.patch new file mode 100644 index 0000000..176efa9 --- /dev/null +++ b/SOURCES/perl-5.24.1-perl-129125-copy-form-data-if-it-might-be-freed.patch @@ -0,0 +1,107 @@ +From 0c43d46cd570d2a19edfa54b9c637dea5c0a3514 Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Thu, 19 Jan 2017 16:28:03 +1100 +Subject: [PATCH] (perl #129125) copy form data if it might be freed +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: + +commit 86191aed6f092273950ebdd48f886d4ec0c5e85e +Author: Tony Cook +Date: Thu Jan 19 16:28:03 2017 +1100 + + (perl #129125) copy form data if it might be freed + + If the format SV also appeared as an argument, and the FF_CHOP + operator modified that argument, the magic and hence the compiled + format would be freed, and the next iteration of the processing + the compiled format would read freed memory. + + Unlike my original patch this copies the formsv too, since + that is also stored in the magic, and is needed for presenting + literal text from the format. + +Signed-off-by: Petr Písař +--- + pp_ctl.c | 18 ++++++++++++++++++ + t/op/write.t | 19 ++++++++++++++++++- + 2 files changed, 36 insertions(+), 1 deletion(-) + +diff --git a/pp_ctl.c b/pp_ctl.c +index b94c09a..e859e01 100644 +--- a/pp_ctl.c ++++ b/pp_ctl.c +@@ -490,6 +490,7 @@ PP(pp_formline) + U8 *source; /* source of bytes to append */ + STRLEN to_copy; /* how may bytes to append */ + char trans; /* what chars to translate */ ++ bool copied_form = false; /* have we duplicated the form? */ + + mg = doparseform(tmpForm); + +@@ -687,6 +688,23 @@ PP(pp_formline) + case FF_CHOP: /* (for ^*) chop the current item */ + if (sv != &PL_sv_no) { + const char *s = chophere; ++ if (!copied_form && ++ ((sv == tmpForm || SvSMAGICAL(sv)) ++ || (SvGMAGICAL(tmpForm) && !sv_only_taint_gmagic(tmpForm))) ) { ++ /* sv and tmpForm are either the same SV, or magic might allow modification ++ of tmpForm when sv is modified, so copy */ ++ SV *newformsv = sv_mortalcopy(formsv); ++ U32 *new_compiled; ++ ++ f = SvPV_nolen(newformsv) + (f - SvPV_nolen(formsv)); ++ Newx(new_compiled, mg->mg_len / sizeof(U32), U32); ++ memcpy(new_compiled, mg->mg_ptr, mg->mg_len); ++ SAVEFREEPV(new_compiled); ++ fpc = new_compiled + (fpc - (U32*)mg->mg_ptr); ++ formsv = newformsv; ++ ++ copied_form = true; ++ } + if (chopspace) { + while (isSPACE(*s)) + s++; +diff --git a/t/op/write.t b/t/op/write.t +index 590d658..ab2733f 100644 +--- a/t/op/write.t ++++ b/t/op/write.t +@@ -98,7 +98,7 @@ for my $tref ( @NumTests ){ + my $bas_tests = 21; + + # number of tests in section 3 +-my $bug_tests = 66 + 3 * 3 * 5 * 2 * 3 + 2 + 66 + 4 + 2 + 3 + 96 + 11 + 3; ++my $bug_tests = 66 + 3 * 3 * 5 * 2 * 3 + 2 + 66 + 6 + 2 + 3 + 96 + 11 + 3; + + # number of tests in section 4 + my $hmb_tests = 37; +@@ -1637,6 +1637,23 @@ printf ">%s<\n", ref $zamm; + print "$zamm->[0]\n"; + EOP + ++# [perl #129125] - detected by -fsanitize=address or valgrind ++# the compiled format would be freed when the format string was modified ++# by the chop operator ++fresh_perl_is(<<'EOP', "^", { stderr => 1 }, '#129125 - chop on format'); ++my $x = '^@'; ++formline$x=>$x; ++print $^A; ++EOP ++ ++fresh_perl_is(<<'EOP', '<^< xx AA><>', { stderr => 1 }, '#129125 - chop on format, later values'); ++my $x = '^< xx ^<'; ++my $y = 'AA'; ++formline $x => $x, $y; ++print "<$^A><$x><$y>"; ++EOP ++ ++ + # [perl #73690] + + select +(select(RT73690), do { +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-perl-129274-avoid-treating-the-in-as-a-comment-intro.patch b/SOURCES/perl-5.24.1-perl-129274-avoid-treating-the-in-as-a-comment-intro.patch new file mode 100644 index 0000000..449e67a --- /dev/null +++ b/SOURCES/perl-5.24.1-perl-129274-avoid-treating-the-in-as-a-comment-intro.patch @@ -0,0 +1,70 @@ +From 2f221fc2333bd87615c03354b591b390e8b06715 Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Tue, 24 Jan 2017 11:14:28 +1100 +Subject: [PATCH] (perl #129274) avoid treating the # in $# as a comment intro +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Petr Písař: Ported to 5.24.1: + +commit 71776ae4fad9a7659deefe0c2376d45b873ffd6a +Author: Tony Cook +Date: Tue Jan 24 11:14:28 2017 +1100 + + (perl #129274) avoid treating the # in $# as a comment intro + +Signed-off-by: Petr Písař +--- + t/op/lex.t | 15 ++++++++++++++- + toke.c | 4 +++- + 2 files changed, 17 insertions(+), 2 deletions(-) + +diff --git a/t/op/lex.t b/t/op/lex.t +index 9ada592..d679d7c 100644 +--- a/t/op/lex.t ++++ b/t/op/lex.t +@@ -7,7 +7,7 @@ use warnings; + + BEGIN { chdir 't' if -d 't'; require './test.pl'; } + +-plan(tests => 27); ++plan(tests => 28); + + { + no warnings 'deprecated'; +@@ -223,3 +223,16 @@ fresh_perl_like( + {}, + '[perl #129336] - #!perl -i argument handling' + ); ++ ++# probably only failed under ASAN ++fresh_perl_is( ++ "stat\tt\$#0", ++ <<'EOM', ++$# is no longer supported at - line 1. ++Number found where operator expected at - line 1, near "$#0" ++ (Missing operator before 0?) ++Can't call method "t" on an undefined value at - line 1. ++EOM ++ {}, ++ "[perl #129273] heap use after free or overflow" ++); +diff --git a/toke.c b/toke.c +index 576ce72..630fc59 100644 +--- a/toke.c ++++ b/toke.c +@@ -4090,7 +4090,9 @@ S_intuit_method(pTHX_ char *start, SV *ioname, CV *cv) + if (cv || PL_last_lop_op == OP_PRINT || PL_last_lop_op == OP_SAY + || isUPPER(*PL_tokenbuf)) + return 0; +- s = skipspace(s); ++ /* this could be $# */ ++ if (isSPACE(*s)) ++ s = skipspace(s); + PL_bufptr = start; + PL_expect = XREF; + return *s == '(' ? FUNCMETH : METHOD; +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-perl-129281-test-for-buffer-overflow-issue.patch b/SOURCES/perl-5.24.1-perl-129281-test-for-buffer-overflow-issue.patch new file mode 100644 index 0000000..30397b5 --- /dev/null +++ b/SOURCES/perl-5.24.1-perl-129281-test-for-buffer-overflow-issue.patch @@ -0,0 +1,49 @@ +From 92f8cd4e7b0ff3d09162139e3c99b1d9310bca81 Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Mon, 10 Oct 2016 10:46:46 +1100 +Subject: [PATCH] (perl #129281) test for buffer overflow issue +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: + +commit d2ba660af00f1bf2e7012741615eff7c19f29707 +Author: Tony Cook +Date: Mon Oct 10 10:46:46 2016 +1100 + + (perl #129281) test for buffer overflow issue + +Signed-off-by: Petr Písař +--- + t/re/pat.t | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/t/re/pat.t b/t/re/pat.t +index 749edd0..7b8e6f7 100644 +--- a/t/re/pat.t ++++ b/t/re/pat.t +@@ -23,7 +23,7 @@ BEGIN { + skip_all_without_unicode_tables(); + } + +-plan tests => 792; # Update this when adding/deleting tests. ++plan tests => 793; # Update this when adding/deleting tests. + + run_tests() unless caller; + +@@ -1779,6 +1779,11 @@ EOP + }msx, { stderr => 1 }, "Offsets in debug output are not negative"); + } + } ++ { ++ # [perl #129281] buffer write overflow, detected by ASAN, valgrind ++ local $::TODO = "whilem_c bumped too much"; ++ fresh_perl_is('/0(?0)|^*0(?0)|^*(^*())0|/', '', {}, "don't bump whilem_c too much"); ++ } + } # End of sub run_tests + + 1; +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-perl-129340-copy-the-source-when-inside-the-dest-in-.patch b/SOURCES/perl-5.24.1-perl-129340-copy-the-source-when-inside-the-dest-in-.patch new file mode 100644 index 0000000..f400675 --- /dev/null +++ b/SOURCES/perl-5.24.1-perl-129340-copy-the-source-when-inside-the-dest-in-.patch @@ -0,0 +1,104 @@ +From 4fe0e2d067ac5639d94f35f8c7e8ac4e0e3ab336 Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Mon, 20 Feb 2017 11:02:21 +1100 +Subject: [PATCH] (perl #129340) copy the source when inside the dest in + sv_insert_flags() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: + +commit e7a8a8aac45d42d72d1586227ca51771f193f5dc +Author: Tony Cook +Date: Mon Feb 20 11:02:21 2017 +1100 + + (perl #129340) copy the source when inside the dest in sv_insert_flags() + +Signed-off-by: Petr Písař +--- + embed.fnc | 2 +- + proto.h | 2 +- + sv.c | 12 +++++++++++- + t/op/substr.t | 5 ++++- + 4 files changed, 17 insertions(+), 4 deletions(-) + +diff --git a/embed.fnc b/embed.fnc +index a64ffba..2395efb 100644 +--- a/embed.fnc ++++ b/embed.fnc +@@ -1437,7 +1437,7 @@ Amdb |void |sv_insert |NN SV *const bigstr|const STRLEN offset \ + |const STRLEN len|NN const char *const little \ + |const STRLEN littlelen + Apd |void |sv_insert_flags|NN SV *const bigstr|const STRLEN offset|const STRLEN len \ +- |NN const char *const little|const STRLEN littlelen|const U32 flags ++ |NN const char *little|const STRLEN littlelen|const U32 flags + Apd |int |sv_isa |NULLOK SV* sv|NN const char *const name + Apd |int |sv_isobject |NULLOK SV* sv + Apd |STRLEN |sv_len |NULLOK SV *const sv +diff --git a/proto.h b/proto.h +index fb4ee29..2b2004a 100644 +--- a/proto.h ++++ b/proto.h +@@ -3015,7 +3015,7 @@ PERL_CALLCONV void Perl_sv_inc_nomg(pTHX_ SV *const sv); + /* PERL_CALLCONV void Perl_sv_insert(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen); */ + #define PERL_ARGS_ASSERT_SV_INSERT \ + assert(bigstr); assert(little) +-PERL_CALLCONV void Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen, const U32 flags); ++PERL_CALLCONV void Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *little, const STRLEN littlelen, const U32 flags); + #define PERL_ARGS_ASSERT_SV_INSERT_FLAGS \ + assert(bigstr); assert(little) + PERL_CALLCONV int Perl_sv_isa(pTHX_ SV* sv, const char *const name); +diff --git a/sv.c b/sv.c +index d1e84f0..697db41 100644 +--- a/sv.c ++++ b/sv.c +@@ -6223,7 +6223,7 @@ C that applies to C. + */ + + void +-Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen, const U32 flags) ++Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *little, const STRLEN littlelen, const U32 flags) + { + char *big; + char *mid; +@@ -6236,6 +6236,16 @@ Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN l + + SvPV_force_flags(bigstr, curlen, flags); + (void)SvPOK_only_UTF8(bigstr); ++ ++ if (little >= SvPVX(bigstr) && ++ little < SvPVX(bigstr) + (SvLEN(bigstr) ? SvLEN(bigstr) : SvCUR(bigstr))) { ++ /* little is a pointer to within bigstr, since we can reallocate bigstr, ++ or little...little+littlelen might overlap offset...offset+len we make a copy ++ */ ++ little = savepvn(little, littlelen); ++ SAVEFREEPV(little); ++ } ++ + if (offset + len > curlen) { + SvGROW(bigstr, offset+len+1); + Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char); +diff --git a/t/op/substr.t b/t/op/substr.t +index eae2403..01c36a9 100644 +--- a/t/op/substr.t ++++ b/t/op/substr.t +@@ -22,7 +22,7 @@ $SIG{__WARN__} = sub { + } + }; + +-plan(388); ++plan(389); + + run_tests() unless caller; + +@@ -869,3 +869,6 @@ is($destroyed, 1, 'Timely scalar destruction with lvalue substr'); + + is($result_3363, "best", "ref-to-substr retains lvalue-ness under recursion [perl #3363]"); + } ++ ++# failed with ASAN ++fresh_perl_is('$0 = "/usr/bin/perl"; substr($0, 0, 0, $0)', '', {}, "(perl #129340) substr() with source in target"); +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-perl-129342-ensure-range-start-is-set-after-error-in.patch b/SOURCES/perl-5.24.1-perl-129342-ensure-range-start-is-set-after-error-in.patch new file mode 100644 index 0000000..6543e4f --- /dev/null +++ b/SOURCES/perl-5.24.1-perl-129342-ensure-range-start-is-set-after-error-in.patch @@ -0,0 +1,73 @@ +From a26907949ed561dccd661fc8600889eddc6664ea Mon Sep 17 00:00:00 2001 +From: Hugo van der Sanden +Date: Wed, 5 Oct 2016 14:53:27 +0100 +Subject: [PATCH] [perl #129342] ensure range-start is set after error in tr/// +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: + +t 59143e29a717d67a61b869a6c5bb49574f1ef43f +Author: Tony Cook +Date: Tue Jan 17 11:52:53 2017 +1100 + + (perl #129342) test for buffer overflow + +commit 3dd4eaeb8ac39e08179145b86aedda36584a3509 +Author: Hugo van der Sanden +Date: Wed Oct 5 14:53:27 2016 +0100 + + [perl #129342] ensure range-start is set after error in tr/// + + A parse error due to invalid octal or hex escape in the range of a + transliteration must still ensure some kind of start and end values + are captured, since we don't stop on the first such error. Failure + to do so can cause invalid reads after "Here we have parsed a range". + +Signed-off-by: Petr Písař +--- + t/lib/croak/toke | 7 +++++++ + toke.c | 4 ++-- + 2 files changed, 9 insertions(+), 2 deletions(-) + +diff --git a/t/lib/croak/toke b/t/lib/croak/toke +index 18dfa24..578a6da 100644 +--- a/t/lib/croak/toke ++++ b/t/lib/croak/toke +@@ -302,3 +302,10 @@ Execution of - aborted due to compilation errors. + BEGIN <> + EXPECT + Illegal declaration of subroutine BEGIN at - line 1. ++######## ++# NAME tr/// handling of mis-formatted \o characters ++# may only fail with ASAN ++tr/\o-0//; ++EXPECT ++Missing braces on \o{} at - line 2, within string ++Execution of - aborted due to compilation errors. +diff --git a/toke.c b/toke.c +index 288f372..576ce72 100644 +--- a/toke.c ++++ b/toke.c +@@ -3338,7 +3338,7 @@ S_scan_const(pTHX_ char *start) + UTF); + if (! valid) { + yyerror(error); +- continue; ++ uv = 0; /* drop through to ensure range ends are set */ + } + goto NUM_ESCAPE_INSERT; + } +@@ -3356,7 +3356,7 @@ S_scan_const(pTHX_ char *start) + UTF); + if (! valid) { + yyerror(error); +- continue; ++ uv = 0; /* drop through to ensure range ends are set */ + } + } + +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-perl-129377-don-t-read-past-start-of-string-for-unma.patch b/SOURCES/perl-5.24.1-perl-129377-don-t-read-past-start-of-string-for-unma.patch new file mode 100644 index 0000000..cbf5a73 --- /dev/null +++ b/SOURCES/perl-5.24.1-perl-129377-don-t-read-past-start-of-string-for-unma.patch @@ -0,0 +1,107 @@ +From a08fa6fd157fd0d61da7f20f07b939fbc302c2c6 Mon Sep 17 00:00:00 2001 +From: Hugo van der Sanden +Date: Wed, 5 Oct 2016 12:56:05 +0100 +Subject: [PATCH] [perl #129377] don't read past start of string for unmatched + backref +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: + +commit 2dfc11ec3af312f4fa3eb244077c79dbb5fc2d85 +Author: Hugo van der Sanden +Date: Wed Oct 5 12:56:05 2016 +0100 + + [perl #129377] don't read past start of string for unmatched backref + + We can have (start, end) == (0, -1) for an unmatched backref, we must + check for that. + +Signed-off-by: Petr Písař +--- + regexec.c | 10 ++++++---- + t/re/pat.t | 16 +++++++++++++++- + 2 files changed, 21 insertions(+), 5 deletions(-) + +diff --git a/regexec.c b/regexec.c +index a5d5db4..a7bc0c3 100644 +--- a/regexec.c ++++ b/regexec.c +@@ -5179,6 +5179,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog) + regnode *next; + U32 n = 0; /* general value; init to avoid compiler warning */ + SSize_t ln = 0; /* len or last; init to avoid compiler warning */ ++ SSize_t endref = 0; /* offset of end of backref when ln is start */ + char *locinput = startpos; + char *pushinput; /* where to continue after a PUSH */ + I32 nextchr; /* is always set to UCHARAT(locinput), or -1 at EOS */ +@@ -6489,10 +6490,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog) + + do_nref_ref_common: + ln = rex->offs[n].start; ++ endref = rex->offs[n].end; + reginfo->poscache_iter = reginfo->poscache_maxiter; /* Void cache */ +- if (rex->lastparen < n || ln == -1) ++ if (rex->lastparen < n || ln == -1 || endref == -1) + sayNO; /* Do not match unless seen CLOSEn. */ +- if (ln == rex->offs[n].end) ++ if (ln == endref) + break; + + s = reginfo->strbeg + ln; +@@ -6506,7 +6508,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog) + * not going off the end given by reginfo->strend, and + * returns in upon success, how much of the + * current input was matched */ +- if (! foldEQ_utf8_flags(s, NULL, rex->offs[n].end - ln, utf8_target, ++ if (! foldEQ_utf8_flags(s, NULL, endref - ln, utf8_target, + locinput, &limit, 0, utf8_target, utf8_fold_flags)) + { + sayNO; +@@ -6521,7 +6523,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog) + (type == REF || + UCHARAT(s) != fold_array[nextchr])) + sayNO; +- ln = rex->offs[n].end - ln; ++ ln = endref - ln; + if (locinput + ln > reginfo->strend) + sayNO; + if (ln > 1 && (type == REF +diff --git a/t/re/pat.t b/t/re/pat.t +index 4aa77cf..749edd0 100644 +--- a/t/re/pat.t ++++ b/t/re/pat.t +@@ -23,7 +23,7 @@ BEGIN { + skip_all_without_unicode_tables(); + } + +-plan tests => 791; # Update this when adding/deleting tests. ++plan tests => 792; # Update this when adding/deleting tests. + + run_tests() unless caller; + +@@ -1765,6 +1765,20 @@ EOP + utf8::upgrade($str); + ok( $str =~ m{^(a|a\x{e4})$}, "fix [perl #129950] - utf8 case" ); + } ++ { ++ # [perl #129377] backref to an unmatched capture should not cause ++ # reading before start of string. ++ SKIP: { ++ skip "no re-debug under miniperl" if is_miniperl; ++ my $prog = <<'EOP'; ++use re qw(Debug EXECUTE); ++"x" =~ m{ () y | () \1 }x; ++EOP ++ fresh_perl_like($prog, qr{ ++ \A (?! .* ^ \s+ - ) ++ }msx, { stderr => 1 }, "Offsets in debug output are not negative"); ++ } ++ } + } # End of sub run_tests + + 1; +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-perl-130262-split-scalar-context-stack-overflow-fix.patch b/SOURCES/perl-5.24.1-perl-130262-split-scalar-context-stack-overflow-fix.patch new file mode 100644 index 0000000..e250a0a --- /dev/null +++ b/SOURCES/perl-5.24.1-perl-130262-split-scalar-context-stack-overflow-fix.patch @@ -0,0 +1,62 @@ +From 2bcb4a5888b1c26ee11bc447cc02b42290c707af Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Mon, 5 Dec 2016 11:48:14 +1100 +Subject: [PATCH] (perl #130262) split scalar context stack overflow fix +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.14.1: + +commit 02c161ef974f8f1efbb5632f741c1164adb6ca75 +Author: Tony Cook +Date: Mon Dec 5 11:48:14 2016 +1100 + + (perl #130262) split scalar context stack overflow fix + + pp_split didn't ensure there was space for its return value + in scalar context. + +Signed-off-by: Petr Písař +--- + pp.c | 2 +- + t/op/split.t | 6 +++++- + 2 files changed, 6 insertions(+), 2 deletions(-) + +diff --git a/pp.c b/pp.c +index 70345ce..334b353 100644 +--- a/pp.c ++++ b/pp.c +@@ -6259,7 +6259,7 @@ PP(pp_split) + } + + GETTARGET; +- PUSHi(iters); ++ XPUSHi(iters); + RETURN; + } + +diff --git a/t/op/split.t b/t/op/split.t +index b7846a1..3e08841 100644 +--- a/t/op/split.t ++++ b/t/op/split.t +@@ -7,7 +7,7 @@ BEGIN { + set_up_inc('../lib'); + } + +-plan tests => 133; ++plan tests => 134; + + $FS = ':'; + +@@ -534,3 +534,7 @@ is "@a", '1 2 3', 'assignment to split-to-array (stacked)'; + ok eval { $a[0] = 'a'; 1; }, "array split filling AvARRAY: assign 0"; + is "@a", "a b", "array split filling AvARRAY: result"; + } ++ ++fresh_perl_is(<<'CODE', '', {}, "scalar split stack overflow"); ++map{int"";split//.0>60for"0000000000000000"}split// for"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" ++CODE +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-perl-130814-update-pointer-into-PL_linestr-after-loo.patch b/SOURCES/perl-5.24.1-perl-130814-update-pointer-into-PL_linestr-after-loo.patch new file mode 100644 index 0000000..6a6df7f --- /dev/null +++ b/SOURCES/perl-5.24.1-perl-130814-update-pointer-into-PL_linestr-after-loo.patch @@ -0,0 +1,50 @@ +From 9df34f9c4701104a366e768237ca694411136d2a Mon Sep 17 00:00:00 2001 +From: Hugo van der Sanden +Date: Sun, 19 Feb 2017 10:46:09 +0000 +Subject: [PATCH] update pointer into PL_linestr after lookahead +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to: 5.24.1: + +commit 90f2cc9a600117a49f8ee3e30cc681f062350c24 +Author: Hugo van der Sanden +Date: Sun Feb 19 10:46:09 2017 +0000 + + [perl #130814] update pointer into PL_linestr after lookahead + + Looking ahead for the "Missing $ on loop variable" diagnostic can reallocate + PL_linestr, invalidating our pointer. Save the offset so we can update it + in that case. + +Signed-off-by: Petr Písař +--- + toke.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/toke.c b/toke.c +index 630fc59..029d2ea 100644 +--- a/toke.c ++++ b/toke.c +@@ -7565,6 +7565,7 @@ Perl_yylex(pTHX) + s = skipspace(s); + if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) { + char *p = s; ++ SSize_t s_off = s - SvPVX(PL_linestr); + + if ((PL_bufend - p) >= 3 + && strnEQ(p, "my", 2) && isSPACE(*(p + 2))) +@@ -7582,6 +7583,9 @@ Perl_yylex(pTHX) + } + if (*p != '$') + Perl_croak(aTHX_ "Missing $ on loop variable"); ++ ++ /* The buffer may have been reallocated, update s */ ++ s = SvPVX(PL_linestr) + s_off; + } + OPERATOR(FOR); + +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-perl-130815-fix-ck_return-null-pointer-deref-on-malf.patch b/SOURCES/perl-5.24.1-perl-130815-fix-ck_return-null-pointer-deref-on-malf.patch new file mode 100644 index 0000000..37d7af4 --- /dev/null +++ b/SOURCES/perl-5.24.1-perl-130815-fix-ck_return-null-pointer-deref-on-malf.patch @@ -0,0 +1,72 @@ +From be05b2f7a801ae1721641fd240e0d7d6fc018136 Mon Sep 17 00:00:00 2001 +From: Aaron Crane +Date: Sun, 19 Feb 2017 12:26:54 +0000 +Subject: [PATCH] fix ck_return null-pointer deref on malformed code +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: + +commit e5c165a0b7551ffb94661aa7f18aabadba257782 +Author: Aaron Crane +Date: Sun Feb 19 12:26:54 2017 +0000 + + [perl #130815] fix ck_return null-pointer deref on malformed code + +commit 9de2a80ffc0eefb4d60e13766baf4bad129e0a92 +Author: David Mitchell +Date: Sun Feb 19 12:36:58 2017 +0000 + + bump test count in t/comp/parser.t + + (the previous commit forgot to) + +Signed-off-by: Petr Písař +--- + op.c | 2 +- + t/comp/parser.t | 8 +++++++- + 2 files changed, 8 insertions(+), 2 deletions(-) + +diff --git a/op.c b/op.c +index 018d90c..9a61ea7 100644 +--- a/op.c ++++ b/op.c +@@ -10695,7 +10695,7 @@ Perl_ck_return(pTHX_ OP *o) + PERL_ARGS_ASSERT_CK_RETURN; + + kid = OpSIBLING(cLISTOPo->op_first); +- if (CvLVALUE(PL_compcv)) { ++ if (PL_compcv && CvLVALUE(PL_compcv)) { + for (; kid; kid = OpSIBLING(kid)) + op_lvalue(kid, OP_LEAVESUBLV); + } +diff --git a/t/comp/parser.t b/t/comp/parser.t +index 50f601c..5016509 100644 +--- a/t/comp/parser.t ++++ b/t/comp/parser.t +@@ -8,7 +8,7 @@ BEGIN { + chdir 't' if -d 't'; + } + +-print "1..173\n"; ++print "1..174\n"; + + sub failed { + my ($got, $expected, $name) = @_; +@@ -546,6 +546,12 @@ eval "grep+grep"; + eval 'qq{@{0]}${}},{})'; + is(1, 1, "RT #124207"); + ++# RT #130815: crash in ck_return for malformed code ++{ ++ eval 'm(@{if(0){sub d{]]])}return'; ++ like $@, qr/^syntax error at \(eval \d+\) line 1, near "\{\]"/, ++ 'RT #130815: null pointer deref'; ++} + + # Add new tests HERE (above this line) + +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-perl-130822-fix-an-AV-leak-in-Perl_reg_named_buff_fe.patch b/SOURCES/perl-5.24.1-perl-130822-fix-an-AV-leak-in-Perl_reg_named_buff_fe.patch new file mode 100644 index 0000000..0ebda55 --- /dev/null +++ b/SOURCES/perl-5.24.1-perl-130822-fix-an-AV-leak-in-Perl_reg_named_buff_fe.patch @@ -0,0 +1,81 @@ +From 0cefeca1fd2405ad1b5544a3919e0000377fde5e Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Tue, 21 Feb 2017 16:38:36 +1100 +Subject: [PATCH] (perl #130822) fix an AV leak in Perl_reg_named_buff_fetch +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: + +commit 853eb961c1a3b014b5a9510740abc15ccd4383b6 +Author: Tony Cook +Date: Tue Feb 21 16:38:36 2017 +1100 + + (perl #130822) fix an AV leak in Perl_reg_named_buff_fetch + + Originally noted as a scoping issue by Andy Lester. + +Signed-off-by: Petr Písař +--- + regcomp.c | 5 +---- + t/op/svleak.t | 12 +++++++++++- + 2 files changed, 12 insertions(+), 5 deletions(-) + +diff --git a/regcomp.c b/regcomp.c +index 6329f6c..989c528 100644 +--- a/regcomp.c ++++ b/regcomp.c +@@ -7849,21 +7849,18 @@ SV* + Perl_reg_named_buff_fetch(pTHX_ REGEXP * const r, SV * const namesv, + const U32 flags) + { +- AV *retarray = NULL; + SV *ret; + struct regexp *const rx = ReANY(r); + + PERL_ARGS_ASSERT_REG_NAMED_BUFF_FETCH; + +- if (flags & RXapif_ALL) +- retarray=newAV(); +- + if (rx && RXp_PAREN_NAMES(rx)) { + HE *he_str = hv_fetch_ent( RXp_PAREN_NAMES(rx), namesv, 0, 0 ); + if (he_str) { + IV i; + SV* sv_dat=HeVAL(he_str); + I32 *nums=(I32*)SvPVX(sv_dat); ++ AV * const retarray = (flags & RXapif_ALL) ? newAV() : NULL; + for ( i=0; inparens) >= nums[i] + && rx->offs[nums[i]].start != -1 +diff --git a/t/op/svleak.t b/t/op/svleak.t +index b0692ff..eeea7c1 100644 +--- a/t/op/svleak.t ++++ b/t/op/svleak.t +@@ -15,7 +15,7 @@ BEGIN { + + use Config; + +-plan tests => 133; ++plan tests => 134; + + # run some code N times. If the number of SVs at the end of loop N is + # greater than (N-1)*delta at the end of loop 1, we've got a leak +@@ -557,3 +557,13 @@ EOF + sub lk { { my $d = $op->hints_hash->HASH } } + ::leak(3, 0, \&lk, q!B::RHE->HASH shoudln't leak!); + } ++ ++{ ++ # Perl_reg_named_buff_fetch() leaks an AV when called with an RE ++ # with no named captures ++ sub named { ++ "x" =~ /x/; ++ re::regname("foo", 1); ++ } ++ ::leak(2, 0, \&named, "Perl_reg_named_buff_fetch() on no-name RE"); ++} +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-perl-131085-Crash-with-sub-in-stash.patch b/SOURCES/perl-5.24.1-perl-131085-Crash-with-sub-in-stash.patch new file mode 100644 index 0000000..552a722 --- /dev/null +++ b/SOURCES/perl-5.24.1-perl-131085-Crash-with-sub-in-stash.patch @@ -0,0 +1,61 @@ +From cba9aa759f7ce8a4a80e748eb451f679042cd74b Mon Sep 17 00:00:00 2001 +From: Father Chrysostomos +Date: Fri, 7 Apr 2017 14:08:02 -0700 +Subject: [PATCH] Crash with sub-in-stash +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: + +commit 790acddeaa0d2c73524596048b129561225cf100 +Author: Father Chrysostomos +Date: Fri Apr 7 14:08:02 2017 -0700 + + [perl #131085] Crash with sub-in-stash + + $ perl -e '$::{"A"} = sub {}; \&{"A"}' + Segmentation fault (core dumped) + + The code that vivifies a typeglob out of a code ref assumed that the + CV had a name hek, which is always the case when perl itself puts the + code ref there (via ‘sub A{}’), but is not necessarily the case if + someone is insinuating other stuff into the stash. + +Signed-off-by: Petr Písař +--- + gv.c | 2 +- + t/op/gv.t | 4 ++++ + 2 files changed, 5 insertions(+), 1 deletion(-) + +diff --git a/gv.c b/gv.c +index 3fda9b9..6690b64 100644 +--- a/gv.c ++++ b/gv.c +@@ -421,7 +421,7 @@ Perl_gv_init_pvn(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, U32 flag + /* Not actually a constant. Just a regular sub. */ + CV * const cv = (CV *)has_constant; + GvCV_set(gv,cv); +- if (CvSTASH(cv) == stash && ( ++ if (CvNAMED(cv) && CvSTASH(cv) == stash && ( + CvNAME_HEK(cv) == GvNAME_HEK(gv) + || ( HEK_LEN(CvNAME_HEK(cv)) == HEK_LEN(GvNAME_HEK(gv)) + && HEK_FLAGS(CvNAME_HEK(cv)) != HEK_FLAGS(GvNAME_HEK(gv)) +diff --git a/t/op/gv.t b/t/op/gv.t +index 03ae46e..cdaaef5 100644 +--- a/t/op/gv.t ++++ b/t/op/gv.t +@@ -1170,6 +1170,10 @@ SKIP: { + is ($? & 127, 0,"[perl #128597] No crash when gp_free calls ckWARN_d"); + } + ++# [perl #131085] This used to crash; no ok() necessary. ++$::{"A131085"} = sub {}; \&{"A131085"}; ++ ++ + __END__ + Perl + Rules +-- +2.9.4 + diff --git a/SOURCES/perl-5.24.1-perl-131211-fixup-File-Glob-degenerate-matching.patch b/SOURCES/perl-5.24.1-perl-131211-fixup-File-Glob-degenerate-matching.patch new file mode 100644 index 0000000..2b490ec --- /dev/null +++ b/SOURCES/perl-5.24.1-perl-131211-fixup-File-Glob-degenerate-matching.patch @@ -0,0 +1,266 @@ +From 30cba075ecbb662b392b2c6e896dec287ea49aa8 Mon Sep 17 00:00:00 2001 +From: Yves Orton +Date: Tue, 25 Apr 2017 15:17:06 +0200 +Subject: [PATCH] fixup File::Glob degenerate matching +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: + +commit 0db967b2e6a4093a6a5f649190159767e5d005e0 +Author: Yves Orton +Date: Tue Apr 25 15:17:06 2017 +0200 + + [perl #131211] fixup File::Glob degenerate matching + + The old code would go quadratic with recursion and backtracking + when doing patterns like "a*a*a*a*a*a*a*x" on a file like + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa". + + This patch changes the code to not recurse, and to not backtrack, + as per this article from Russ Cox: https://research.swtch.com/glob + + It also adds a micro-optimisation for M_ONE and M_SET under the new code. + + Thanks to Avar and Russ Cox for helping with this patch, along with + Jilles Tjoelker and the rest of the FreeBSD community. + +Signed-off-by: Petr Písař +--- + MANIFEST | 1 + + ext/File-Glob/bsd_glob.c | 64 +++++++++++++++++++++++-------- + ext/File-Glob/t/rt131211.t | 94 ++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 144 insertions(+), 15 deletions(-) + create mode 100644 ext/File-Glob/t/rt131211.t + +diff --git a/MANIFEST b/MANIFEST +index fe045a7..be2a44f 100644 +--- a/MANIFEST ++++ b/MANIFEST +@@ -3678,6 +3678,7 @@ ext/File-Glob/t/case.t See if File::Glob works + ext/File-Glob/t/global.t See if File::Glob works + ext/File-Glob/TODO File::Glob extension todo list + ext/File-Glob/t/rt114984.t See if File::Glob works ++ext/File-Glob/t/rt131211.t See if File::Glob works + ext/File-Glob/t/taint.t See if File::Glob works + ext/File-Glob/t/threads.t See if File::Glob + threads works + ext/GDBM_File/GDBM_File.pm GDBM extension Perl module +diff --git a/ext/File-Glob/bsd_glob.c b/ext/File-Glob/bsd_glob.c +index 821ef20..e96fb73 100644 +--- a/ext/File-Glob/bsd_glob.c ++++ b/ext/File-Glob/bsd_glob.c +@@ -563,8 +563,12 @@ glob0(const Char *pattern, glob_t *pglob) + break; + case BG_STAR: + pglob->gl_flags |= GLOB_MAGCHAR; +- /* collapse adjacent stars to one, +- * to avoid exponential behavior ++ /* Collapse adjacent stars to one. ++ * This is required to ensure that a pattern like ++ * "a**" matches a name like "a", as without this ++ * check when the first star matched everything it would ++ * cause the second star to return a match fail. ++ * As long ** is folded here this does not happen. + */ + if (bufnext == patbuf || bufnext[-1] != M_ALL) + *bufnext++ = M_ALL; +@@ -909,35 +913,56 @@ globextend(const Char *path, glob_t *pglob, size_t *limitp) + + + /* +- * pattern matching function for filenames. Each occurrence of the * +- * pattern causes a recursion level. ++ * pattern matching function for filenames using state machine to avoid ++ * recursion. We maintain a "nextp" and "nextn" to allow us to backtrack ++ * without additional callframes, and to do cleanly prune the backtracking ++ * state when multiple '*' (start) matches are included in the patter. ++ * ++ * Thanks to Russ Cox for the improved state machine logic to avoid quadratic ++ * matching on failure. ++ * ++ * https://research.swtch.com/glob ++ * ++ * An example would be a pattern ++ * ("a*" x 100) . "y" ++ * against a file name like ++ * ("a" x 100) . "x" ++ * + */ + static int + match(Char *name, Char *pat, Char *patend, int nocase) + { + int ok, negate_range; + Char c, k; ++ Char *nextp = NULL; ++ Char *nextn = NULL; + ++ loop: + while (pat < patend) { + c = *pat++; + switch (c & M_MASK) { + case M_ALL: + if (pat == patend) + return(1); +- do +- if (match(name, pat, patend, nocase)) +- return(1); +- while (*name++ != BG_EOS) +- ; +- return(0); ++ if (*name == BG_EOS) ++ return 0; ++ nextn = name + 1; ++ nextp = pat - 1; ++ break; + case M_ONE: ++ /* since * matches leftmost-shortest first * ++ * if we encounter the EOS then backtracking * ++ * will not help, so we can exit early here. */ + if (*name++ == BG_EOS) +- return(0); ++ return 0; + break; + case M_SET: + ok = 0; ++ /* since * matches leftmost-shortest first * ++ * if we encounter the EOS then backtracking * ++ * will not help, so we can exit early here. */ + if ((k = *name++) == BG_EOS) +- return(0); ++ return 0; + if ((negate_range = ((*pat & M_MASK) == M_NOT)) != BG_EOS) + ++pat; + while (((c = *pat++) & M_MASK) != M_END) +@@ -953,16 +978,25 @@ match(Char *name, Char *pat, Char *patend, int nocase) + } else if (nocase ? (tolower(c) == tolower(k)) : (c == k)) + ok = 1; + if (ok == negate_range) +- return(0); ++ goto fail; + break; + default: + k = *name++; + if (nocase ? (tolower(k) != tolower(c)) : (k != c)) +- return(0); ++ goto fail; + break; + } + } +- return(*name == BG_EOS); ++ if (*name == BG_EOS) ++ return 1; ++ ++ fail: ++ if (nextn) { ++ pat = nextp; ++ name = nextn; ++ goto loop; ++ } ++ return 0; + } + + /* Free allocated data belonging to a glob_t structure. */ +diff --git a/ext/File-Glob/t/rt131211.t b/ext/File-Glob/t/rt131211.t +new file mode 100644 +index 0000000..c1bcbe0 +--- /dev/null ++++ b/ext/File-Glob/t/rt131211.t +@@ -0,0 +1,94 @@ ++use strict; ++use warnings; ++use v5.16.0; ++use File::Temp 'tempdir'; ++use File::Spec::Functions; ++use Test::More; ++use Time::HiRes qw(time); ++ ++plan tests => 13; ++ ++my $path = tempdir uc cleanup => 1; ++my @files= ( ++ "x".("a" x 50)."b", # 0 ++ "abbbbbbbbbbbbc", # 1 ++ "abbbbbbbbbbbbd", # 2 ++ "aaabaaaabaaaabc", # 3 ++ "pq", # 4 ++ "r", # 5 ++ "rttiiiiiii", # 6 ++ "wewewewewewe", # 7 ++ "weeeweeeweee", # 8 ++ "weewweewweew", # 9 ++ "wewewewewewewewewewewewewewewewewq", # 10 ++ "wtttttttetttttttwr", # 11 ++); ++ ++ ++foreach (@files) { ++ open(my $f, ">", catfile $path, $_); ++} ++ ++my $elapsed_fail= 0; ++my $elapsed_match= 0; ++my @got_files; ++my @no_files; ++my $count = 0; ++ ++while (++$count < 10) { ++ $elapsed_match -= time; ++ @got_files= glob catfile $path, "x".("a*" x $count) . "b"; ++ $elapsed_match += time; ++ ++ $elapsed_fail -= time; ++ @no_files= glob catfile $path, "x".("a*" x $count) . "c"; ++ $elapsed_fail += time; ++ last if $elapsed_fail > $elapsed_match * 100; ++} ++ ++is $count,10, ++ "tried all the patterns without bailing out"; ++ ++cmp_ok $elapsed_fail/$elapsed_match,"<",2, ++ "time to fail less than twice the time to match"; ++is "@got_files", catfile($path, $files[0]), ++ "only got the expected file for xa*..b"; ++is "@no_files", "", "shouldnt have files for xa*..c"; ++ ++ ++@got_files= glob catfile $path, "a*b*b*b*bc"; ++is "@got_files", catfile($path, $files[1]), ++ "only got the expected file for a*b*b*b*bc"; ++ ++@got_files= sort glob catfile $path, "a*b*b*bc"; ++is "@got_files", catfile($path, $files[3])." ".catfile($path,$files[1]), ++ "got the expected two files for a*b*b*bc"; ++ ++@got_files= sort glob catfile $path, "p*"; ++is "@got_files", catfile($path, $files[4]), ++ "p* matches pq"; ++ ++@got_files= sort glob catfile $path, "r*???????"; ++is "@got_files", catfile($path, $files[6]), ++ "r*??????? works as expected"; ++ ++@got_files= sort glob catfile $path, "w*e*w??e"; ++is "@got_files", join(" ", sort map { catfile($path, $files[$_]) } (7,8)), ++ "w*e*w??e works as expected"; ++ ++@got_files= sort glob catfile $path, "w*e*we??"; ++is "@got_files", join(" ", sort map { catfile($path, $files[$_]) } (7,8,9,10)), ++ "w*e*we?? works as expected"; ++ ++@got_files= sort glob catfile $path, "w**e**w"; ++is "@got_files", join(" ", sort map { catfile($path, $files[$_]) } (9)), ++ "w**e**w works as expected"; ++ ++@got_files= sort glob catfile $path, "*wee*"; ++is "@got_files", join(" ", sort map { catfile($path, $files[$_]) } (8,9)), ++ "*wee* works as expected"; ++ ++@got_files= sort glob catfile $path, "we*"; ++is "@got_files", join(" ", sort map { catfile($path, $files[$_]) } (7,8,9,10)), ++ "we* works as expected"; ++ +-- +2.9.4 + diff --git a/SOURCES/perl-5.24.1-perl-131263-clear-the-UTF8-flag-on-a-glob-if-it-isn-.patch b/SOURCES/perl-5.24.1-perl-131263-clear-the-UTF8-flag-on-a-glob-if-it-isn-.patch new file mode 100644 index 0000000..9610bc0 --- /dev/null +++ b/SOURCES/perl-5.24.1-perl-131263-clear-the-UTF8-flag-on-a-glob-if-it-isn-.patch @@ -0,0 +1,72 @@ +From 064604f904546ae4ddada5a2aa30256faccee39c Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Wed, 7 Jun 2017 15:00:26 +1000 +Subject: [PATCH] clear the UTF8 flag on a glob if it isn't UTF8 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: + +commit 1097da16b21fe0a2257dba9937e55c0cca18f7e1 +Author: Tony Cook +Date: Wed Jun 7 15:00:26 2017 +1000 + + [perl #131263] clear the UTF8 flag on a glob if it isn't UTF8 + + Previously sv_2pv_flags() would set the UTF8 flag on a glob if it + had a UTF8 name, but wouldn't clear tha flag if it didn't. + + This meant a name change, eg. if assigned another glob, from a UTF8 + name to a non-UTF8 name would leave the flag set. + +Signed-off-by: Petr Písař +--- + sv.c | 2 ++ + t/op/gv.t | 10 +++++++++- + 2 files changed, 11 insertions(+), 1 deletion(-) + +diff --git a/sv.c b/sv.c +index 12cbb5f..05584a2 100644 +--- a/sv.c ++++ b/sv.c +@@ -3162,6 +3162,8 @@ Perl_sv_2pv_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags) + assert(SvPOK(buffer)); + if (SvUTF8(buffer)) + SvUTF8_on(sv); ++ else ++ SvUTF8_off(sv); + if (lp) + *lp = SvCUR(buffer); + return SvPVX(buffer); +diff --git a/t/op/gv.t b/t/op/gv.t +index cdaaef5..ea79e51 100644 +--- a/t/op/gv.t ++++ b/t/op/gv.t +@@ -12,7 +12,7 @@ BEGIN { + + use warnings; + +-plan(tests => 277 ); ++plan(tests => 279 ); + + # type coercion on assignment + $foo = 'foo'; +@@ -1173,6 +1173,14 @@ SKIP: { + # [perl #131085] This used to crash; no ok() necessary. + $::{"A131085"} = sub {}; \&{"A131085"}; + ++{ ++ # [perl #131263] ++ *sym = "\N{U+0080}"; ++ ok(*sym eq "*main::\N{U+0080}", "utf8 flag properly set"); ++ *sym = "\xC3\x80"; ++ ok(*sym eq "*main::\xC3\x80", "utf8 flag properly cleared"); ++} ++ + + __END__ + Perl +-- +2.9.4 + diff --git a/SOURCES/perl-5.24.1-permit-goto-at-top-level-of-multicalled-sub.patch b/SOURCES/perl-5.24.1-permit-goto-at-top-level-of-multicalled-sub.patch new file mode 100644 index 0000000..b4dde60 --- /dev/null +++ b/SOURCES/perl-5.24.1-permit-goto-at-top-level-of-multicalled-sub.patch @@ -0,0 +1,94 @@ +From 0a1ddbeaeeea3c690c2408bd4c3a61c05cb9695f Mon Sep 17 00:00:00 2001 +From: Zefram +Date: Mon, 23 Jan 2017 02:25:50 +0000 +Subject: [PATCH] permit goto at top level of multicalled sub +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Petr Písař: Ported to 5.24.1: + +commit 3c157b3cf0631c69ffa5aa2d55b9199bf93b22a9 +Author: Zefram +Date: Mon Jan 23 02:25:50 2017 +0000 + + permit goto at top level of multicalled sub + + A multicalled sub is reckoned to be a pseudo block, out of which it is + not permissible to goto. However, the test for a pseudo block was being + applied too early, preventing not just escape from a multicalled sub but + also a goto at the top level within the sub. This is a bug similar, but + not identical, to [perl #113938]. Now the test is deferred, permitting + goto at the sub's top level but still forbidding goto out of it. + +Signed-off-by: Petr Písař +--- + pp_ctl.c | 11 ++++++----- + t/op/goto.t | 11 ++++++++++- + 2 files changed, 16 insertions(+), 6 deletions(-) + +diff --git a/pp_ctl.c b/pp_ctl.c +index e859e01..a1fc2f4 100644 +--- a/pp_ctl.c ++++ b/pp_ctl.c +@@ -2921,6 +2921,7 @@ PP(pp_goto) + OP *gotoprobe = NULL; + bool leaving_eval = FALSE; + bool in_block = FALSE; ++ bool pseudo_block = FALSE; + PERL_CONTEXT *last_eval_cx = NULL; + + /* find label */ +@@ -2959,11 +2960,9 @@ PP(pp_goto) + gotoprobe = PL_main_root; + break; + case CXt_SUB: +- if (CvDEPTH(cx->blk_sub.cv) && !CxMULTICALL(cx)) { +- gotoprobe = CvROOT(cx->blk_sub.cv); +- break; +- } +- /* FALLTHROUGH */ ++ gotoprobe = CvROOT(cx->blk_sub.cv); ++ pseudo_block = cBOOL(CxMULTICALL(cx)); ++ break; + case CXt_FORMAT: + case CXt_NULL: + DIE(aTHX_ "Can't \"goto\" out of a pseudo block"); +@@ -2992,6 +2991,8 @@ PP(pp_goto) + break; + } + } ++ if (pseudo_block) ++ DIE(aTHX_ "Can't \"goto\" out of a pseudo block"); + PL_lastgotoprobe = gotoprobe; + } + if (!retop) +diff --git a/t/op/goto.t b/t/op/goto.t +index aa2f24f..07bd6fb 100644 +--- a/t/op/goto.t ++++ b/t/op/goto.t +@@ -10,7 +10,7 @@ BEGIN { + + use warnings; + use strict; +-plan tests => 98; ++plan tests => 99; + our $TODO; + + my $deprecated = 0; +@@ -774,3 +774,12 @@ sub FETCH { $_[0][0] } + tie my $t, "", sub { "cluck up porridge" }; + is eval { sub { goto $t }->() }//$@, 'cluck up porridge', + 'tied arg returning sub ref'; ++ ++sub revnumcmp ($$) { ++ goto FOO; ++ die; ++ FOO: ++ return $_[1] <=> $_[0]; ++} ++is eval { join(":", sort revnumcmp (9,5,1,3,7)) }, "9:7:5:3:1", ++ "can goto at top level of multicalled sub"; +-- +2.7.4 + diff --git a/SOURCES/perl-5.24.1-sprintf-add-memory-wrap-tests.patch b/SOURCES/perl-5.24.1-sprintf-add-memory-wrap-tests.patch new file mode 100644 index 0000000..e5883fc --- /dev/null +++ b/SOURCES/perl-5.24.1-sprintf-add-memory-wrap-tests.patch @@ -0,0 +1,68 @@ +From 08bc282a248b21c92ff45e49490fb95e24358213 Mon Sep 17 00:00:00 2001 +From: David Mitchell +Date: Tue, 9 May 2017 14:29:11 +0100 +Subject: [PATCH] sprintf(): add memory wrap tests +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.1: + +commit d729f63cc94318c248eab95844cfbed5298a7ecd +Author: David Mitchell +Date: Tue May 9 14:29:11 2017 +0100 + + sprintf(): add memory wrap tests + + In various places Perl_sv_vcatpvfn_flags() does croak_memory_wrap() + (including a couple added by the previous commit to fix RT #131260), + but there don't appear to be any tests for them. + + So this commit adds some tests. + +Signed-off-by: Petr Písař +--- + t/op/sprintf2.t | 29 ++++++++++++++++++++++++++++- + 1 file changed, 28 insertions(+), 1 deletion(-) + +diff --git a/t/op/sprintf2.t b/t/op/sprintf2.t +index 43ed919..ef8a743 100644 +--- a/t/op/sprintf2.t ++++ b/t/op/sprintf2.t +@@ -749,6 +749,33 @@ SKIP: { + "non-canonical form"); + } + } ++ ++# check all calls to croak_memory_wrap() ++# RT #131260 ++ ++{ ++ my $s = 8 * $Config{sizesize}; ++ my $i = 1; ++ my $max; ++ while ($s--) { $max |= $i; $i <<= 1; } ++ my $max40 = $max - 40; # see the magic fudge factor in sv_vcatpvfn_flags() ++ ++ my @tests = ( ++ # format, arg ++ ["%.${max}a", 1.1 ], ++ ["%.${max40}a", 1.1 ], ++ ["%.${max}i", 1 ], ++ ["%.${max}i", -1 ], ++ ); ++ ++ for my $test (@tests) { ++ my ($fmt, $arg) = @$test; ++ eval { my $s = sprintf $fmt, $arg; }; ++ like("$@", qr/panic: memory wrap/, qq{memory wrap: "$fmt", "$arg"}); ++ } ++} ++ ++ + + # These are IEEE 754 64-bit subnormals (formerly known as denormals). + # Keep these as strings so that non-IEEE-754 don't trip over them. +-- +2.9.4 + diff --git a/SOURCES/perl-5.24.3-Carp-Don-t-choke-on-ISA-constant.patch b/SOURCES/perl-5.24.3-Carp-Don-t-choke-on-ISA-constant.patch new file mode 100644 index 0000000..17db889 --- /dev/null +++ b/SOURCES/perl-5.24.3-Carp-Don-t-choke-on-ISA-constant.patch @@ -0,0 +1,75 @@ +From ab3bb20383d6dbf9baa811d06414ee474bb8f91e Mon Sep 17 00:00:00 2001 +From: Father Chrysostomos +Date: Wed, 1 Nov 2017 13:11:27 -0700 +Subject: [PATCH] =?UTF-8?q?Carp:=20Don=E2=80=99t=20choke=20on=20ISA=20cons?= + =?UTF-8?q?tant?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This broke some time between 1.29 (perl 5.18) and 1.3301 (perl 5.20): + +$ perl5.20.1 -e 'package Foo { use constant ISA => 42; Bar::f() } package Bar { use Carp; sub f { carp "tun syn" } }' +Not a GLOB reference at /usr/local/lib/perl5/5.20.1/Carp.pm line 560. + +and still persisted in bleadperl (Carp 1.43) until this commit. + +The code that goes poking through the symbol table needs to take into +account that not all stash elements are globs. + +Petr Písař: Ported to 5.24.3. + +Signed-off-by: Petr Písař +--- + dist/Carp/lib/Carp.pm | 3 ++- + dist/Carp/t/Carp.t | 13 ++++++++++++- + 2 files changed, 14 insertions(+), 2 deletions(-) + +diff --git a/dist/Carp/lib/Carp.pm b/dist/Carp/lib/Carp.pm +index 92f8866..f94b9d4 100644 +--- a/dist/Carp/lib/Carp.pm ++++ b/dist/Carp/lib/Carp.pm +@@ -594,7 +594,8 @@ sub trusts_directly { + for my $var (qw/ CARP_NOT ISA /) { + # Don't try using the variable until we know it exists, + # to avoid polluting the caller's namespace. +- if ( $stash->{$var} && *{$stash->{$var}}{ARRAY} && @{$stash->{$var}} ) { ++ if ( $stash->{$var} && ref \$stash->{$var} eq 'GLOB' ++ && *{$stash->{$var}}{ARRAY} && @{$stash->{$var}} ) { + return @{$stash->{$var}} + } + } +diff --git a/dist/Carp/t/Carp.t b/dist/Carp/t/Carp.t +index 9ecdf88..f981005 100644 +--- a/dist/Carp/t/Carp.t ++++ b/dist/Carp/t/Carp.t +@@ -3,7 +3,7 @@ no warnings "once"; + use Config; + + use IPC::Open3 1.0103 qw(open3); +-use Test::More tests => 66; ++use Test::More tests => 67; + + sub runperl { + my(%args) = @_; +@@ -478,6 +478,17 @@ SKIP: + ); + } + ++{ ++ package Mpar; ++ sub f { Carp::croak "tun syn" } ++ ++ package Phou; ++ $Phou::{ISA} = \42; ++ eval { Mpar::f }; ++} ++like $@, qr/tun syn/, 'Carp can handle non-glob ISA stash elems'; ++ ++ + # New tests go here + + # line 1 "XA" +-- +2.13.6 + diff --git a/SOURCES/perl-5.24.3-Fix-deparsing-of-transliterations-with-unprintable-c.patch b/SOURCES/perl-5.24.3-Fix-deparsing-of-transliterations-with-unprintable-c.patch new file mode 100644 index 0000000..706c37a --- /dev/null +++ b/SOURCES/perl-5.24.3-Fix-deparsing-of-transliterations-with-unprintable-c.patch @@ -0,0 +1,48 @@ +From 2657358b67ba3eadd1be99bd7e732a8d68f1f95d Mon Sep 17 00:00:00 2001 +From: John Lightsey +Date: Tue, 31 Oct 2017 18:12:26 -0500 +Subject: [PATCH] Fix deparsing of transliterations with unprintable + characters. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RT #132405 + +Signed-off-by: Nicolas R +Petr Písař: Port to 5.24.3. +Signed-off-by: Petr Písař +--- + lib/B/Deparse.pm | 2 +- + lib/B/Deparse.t | 5 +++++ + 2 files changed, 6 insertions(+), 1 deletion(-) + +diff --git a/lib/B/Deparse.pm b/lib/B/Deparse.pm +index 9879d67..f5f7d82 100644 +--- a/lib/B/Deparse.pm ++++ b/lib/B/Deparse.pm +@@ -5047,7 +5047,7 @@ sub pchr { # ASCII + } elsif ($n == ord "\r") { + return '\\r'; + } elsif ($n >= ord("\cA") and $n <= ord("\cZ")) { +- return '\\c' . unctrl{chr $n}; ++ return '\\c' . $unctrl{chr $n}; + } else { + # return '\x' . sprintf("%02x", $n); + return '\\' . sprintf("%03o", $n); +diff --git a/lib/B/Deparse.t b/lib/B/Deparse.t +index 19db404..45b1ff3 100644 +--- a/lib/B/Deparse.t ++++ b/lib/B/Deparse.t +@@ -2488,3 +2488,8 @@ $_ ^= $_; + $_ |.= $_; + $_ &.= $_; + $_ ^.= $_; ++#### ++# tr with unprintable characters ++my $str; ++$str = 'foo'; ++$str =~ tr/\cA//; +-- +2.13.6 + diff --git a/SOURCES/perl-5.24.3-fix-132017-OPFAIL-insert-needs-to-set-flags-to-0.patch b/SOURCES/perl-5.24.3-fix-132017-OPFAIL-insert-needs-to-set-flags-to-0.patch new file mode 100644 index 0000000..5305ed7 --- /dev/null +++ b/SOURCES/perl-5.24.3-fix-132017-OPFAIL-insert-needs-to-set-flags-to-0.patch @@ -0,0 +1,69 @@ +From 86ecc4da0ec0cea8f9b6af4191b87e4c454aa17c Mon Sep 17 00:00:00 2001 +From: Yves Orton +Date: Sun, 10 Sep 2017 10:59:05 +0200 +Subject: [PATCH] fix #132017 - OPFAIL insert needs to set flags to 0 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +why reginsert doesnt do this stuff I dont know. + +Petr Písař: Ported to 5.24.3. + +Signed-off-by: Petr Písař +--- + regcomp.c | 6 +++++- + t/re/pat.t | 5 ++++- + 2 files changed, 9 insertions(+), 2 deletions(-) + +diff --git a/regcomp.c b/regcomp.c +index 6dcc58a..374032c 100644 +--- a/regcomp.c ++++ b/regcomp.c +@@ -11498,6 +11498,7 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth) + if (max < min) { /* If can't match, warn and optimize to fail + unconditionally */ + reginsert(pRExC_state, OPFAIL, orig_emit, depth+1); ++ orig_emit->flags = 0; + if (PASS2) { + ckWARNreg(RExC_parse, "Quantifier {n,m} with n > m can't match"); + NEXT_OFF(orig_emit)= regarglen[OPFAIL] + NODE_STEP_REGNODE; +@@ -19046,8 +19047,11 @@ Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o, const regmatch_ + + /* add on the verb argument if there is one */ + if ( ( k == VERB || OP(o) == ACCEPT || OP(o) == OPFAIL ) && o->flags) { +- Perl_sv_catpvf(aTHX_ sv, ":%"SVf, ++ if ( ARG(o) ) ++ Perl_sv_catpvf(aTHX_ sv, ":%" SVf, + SVfARG((MUTABLE_SV(progi->data->data[ ARG( o ) ])))); ++ else ++ sv_catpvs(sv, ":NULL"); + } + #else + PERL_UNUSED_CONTEXT; +diff --git a/t/re/pat.t b/t/re/pat.t +index 007f11d..6ff8b0b 100644 +--- a/t/re/pat.t ++++ b/t/re/pat.t +@@ -23,7 +23,7 @@ BEGIN { + skip_all_without_unicode_tables(); + } + +-plan tests => 794; # Update this when adding/deleting tests. ++plan tests => 795; # Update this when adding/deleting tests. + + run_tests() unless caller; + +@@ -1793,6 +1793,9 @@ EOP + pos($text) = 3; + ok(scalar($text !~ m{(~*=[a-z]=)}g), "RT #131575"); + } ++ { ++ fresh_perl_is('"AA" =~ m/AA{1,0}/','',{},"handle OPFAIL insert properly"); ++ } + + } # End of sub run_tests + +-- +2.13.6 + diff --git a/SOURCES/perl-5.24.3-fix-parsing-of-braced-subscript-after-parens.patch b/SOURCES/perl-5.24.3-fix-parsing-of-braced-subscript-after-parens.patch new file mode 100644 index 0000000..cc4d226 --- /dev/null +++ b/SOURCES/perl-5.24.3-fix-parsing-of-braced-subscript-after-parens.patch @@ -0,0 +1,4391 @@ +From 1d1ce7c6bc5cc90b78e8231319dab65f969e7682 Mon Sep 17 00:00:00 2001 +From: Zefram +Date: Tue, 16 Jan 2018 08:04:08 +0000 +Subject: [PATCH] fix parsing of braced subscript after parens +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Where an arrow is omitted between subscripts, if a parenthesised +subscript is followed by a braced one, PL_expect was getting set to +XBLOCK due to code intended for "foreach (...) {...}". This broke +bareword autoquotation, and the parsing of operators following the +braced subscript. Alter PL_expect from XBLOCK to XOPERATOR following +a parenthesised subscript. Fixes [perl #8045]. + +Petr Písař: Ported to 5.24.3. + +Signed-off-by: Petr Písař +--- + perly.act | 1256 ++++++++++++++++++++++++++++------------------- + perly.h | 297 ++++------- + perly.tab | 1352 +++++++++++++++++++++++---------------------------- + perly.y | 20 +- + t/op/postfixderef.t | 25 +- + 5 files changed, 1502 insertions(+), 1448 deletions(-) + +diff --git a/perly.act b/perly.act +index 0d1d5fc..b1457f8 100644 +--- a/perly.act ++++ b/perly.act +@@ -1,223 +1,250 @@ + /* -*- buffer-read-only: t -*- + !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +- This file is built by regen_perly.pl from perly.y. ++ This file is built by ./regen_perly.pl from perly.y. + Any changes made here will be lost! + */ + + case 2: +-#line 115 "perly.y" ++#line 115 "perly.y" /* yacc.c:1646 */ + { + parser->expect = XSTATE; + } ++ + break; + + case 3: +-#line 119 "perly.y" ++#line 119 "perly.y" /* yacc.c:1646 */ + { +- newPROG(block_end((ps[(3) - (4)].val.ival),(ps[(4) - (4)].val.opval))); ++ newPROG(block_end((ps[-1].val.ival),(ps[0].val.opval))); + PL_compiling.cop_seq = 0; + (yyval.ival) = 0; + } ++ + break; + + case 4: +-#line 125 "perly.y" ++#line 125 "perly.y" /* yacc.c:1646 */ + { + parser->expect = XTERM; + } ++ + break; + + case 5: +-#line 129 "perly.y" ++#line 129 "perly.y" /* yacc.c:1646 */ + { +- PL_eval_root = (ps[(3) - (3)].val.opval); ++ PL_eval_root = (ps[0].val.opval); + (yyval.ival) = 0; + } ++ + break; + + case 6: +-#line 134 "perly.y" ++#line 134 "perly.y" /* yacc.c:1646 */ + { + parser->expect = XBLOCK; + } ++ + break; + + case 7: +-#line 138 "perly.y" ++#line 138 "perly.y" /* yacc.c:1646 */ + { + PL_pad_reset_pending = TRUE; +- PL_eval_root = (ps[(3) - (3)].val.opval); ++ PL_eval_root = (ps[0].val.opval); + (yyval.ival) = 0; + yyunlex(); + parser->yychar = YYEOF; + } ++ + break; + + case 8: +-#line 146 "perly.y" ++#line 146 "perly.y" /* yacc.c:1646 */ + { + parser->expect = XSTATE; + } ++ + break; + + case 9: +-#line 150 "perly.y" ++#line 150 "perly.y" /* yacc.c:1646 */ + { + PL_pad_reset_pending = TRUE; +- PL_eval_root = (ps[(3) - (3)].val.opval); ++ PL_eval_root = (ps[0].val.opval); + (yyval.ival) = 0; + yyunlex(); + parser->yychar = YYEOF; + } ++ + break; + + case 10: +-#line 158 "perly.y" ++#line 158 "perly.y" /* yacc.c:1646 */ + { + parser->expect = XSTATE; + } ++ + break; + + case 11: +-#line 162 "perly.y" ++#line 162 "perly.y" /* yacc.c:1646 */ + { + PL_pad_reset_pending = TRUE; +- PL_eval_root = (ps[(3) - (3)].val.opval); ++ PL_eval_root = (ps[0].val.opval); + (yyval.ival) = 0; + yyunlex(); + parser->yychar = YYEOF; + } ++ + break; + + case 12: +-#line 170 "perly.y" ++#line 170 "perly.y" /* yacc.c:1646 */ + { + parser->expect = XSTATE; + } ++ + break; + + case 13: +-#line 174 "perly.y" ++#line 174 "perly.y" /* yacc.c:1646 */ + { +- PL_eval_root = (ps[(3) - (3)].val.opval); ++ PL_eval_root = (ps[0].val.opval); + (yyval.ival) = 0; + } ++ + break; + + case 14: +-#line 182 "perly.y" +- { if (parser->copline > (line_t)(ps[(1) - (4)].val.ival)) +- parser->copline = (line_t)(ps[(1) - (4)].val.ival); +- (yyval.opval) = block_end((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval)); ++#line 182 "perly.y" /* yacc.c:1646 */ ++ { if (parser->copline > (line_t)(ps[-3].val.ival)) ++ parser->copline = (line_t)(ps[-3].val.ival); ++ (yyval.opval) = block_end((ps[-2].val.ival), (ps[-1].val.opval)); + } ++ + break; + + case 15: +-#line 190 "perly.y" +- { if (parser->copline > (line_t)(ps[(1) - (7)].val.ival)) +- parser->copline = (line_t)(ps[(1) - (7)].val.ival); +- (yyval.opval) = block_end((ps[(2) - (7)].val.ival), (ps[(5) - (7)].val.opval)); ++#line 190 "perly.y" /* yacc.c:1646 */ ++ { if (parser->copline > (line_t)(ps[-6].val.ival)) ++ parser->copline = (line_t)(ps[-6].val.ival); ++ (yyval.opval) = block_end((ps[-5].val.ival), (ps[-2].val.opval)); + } ++ + break; + + case 16: +-#line 197 "perly.y" ++#line 197 "perly.y" /* yacc.c:1646 */ + { (yyval.ival) = block_start(TRUE); + parser->parsed_sub = 0; } ++ + break; + + case 17: +-#line 202 "perly.y" +- { if (parser->copline > (line_t)(ps[(1) - (4)].val.ival)) +- parser->copline = (line_t)(ps[(1) - (4)].val.ival); +- (yyval.opval) = block_end((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval)); ++#line 202 "perly.y" /* yacc.c:1646 */ ++ { if (parser->copline > (line_t)(ps[-3].val.ival)) ++ parser->copline = (line_t)(ps[-3].val.ival); ++ (yyval.opval) = block_end((ps[-2].val.ival), (ps[-1].val.opval)); + } ++ + break; + + case 18: +-#line 209 "perly.y" ++#line 209 "perly.y" /* yacc.c:1646 */ + { (yyval.ival) = block_start(FALSE); + parser->parsed_sub = 0; } ++ + break; + + case 19: +-#line 215 "perly.y" ++#line 215 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = (OP*)NULL; } ++ + break; + + case 20: +-#line 217 "perly.y" +- { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[(1) - (2)].val.opval), (ps[(2) - (2)].val.opval)); ++#line 217 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval)); + PL_pad_reset_pending = TRUE; +- if ((ps[(1) - (2)].val.opval) && (ps[(2) - (2)].val.opval)) ++ if ((ps[-1].val.opval) && (ps[0].val.opval)) + PL_hints |= HINT_BLOCK_SCOPE; + } ++ + break; + + case 21: +-#line 226 "perly.y" ++#line 226 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = (OP*)NULL; } ++ + break; + + case 22: +-#line 228 "perly.y" +- { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[(1) - (2)].val.opval), (ps[(2) - (2)].val.opval)); ++#line 228 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval)); + PL_pad_reset_pending = TRUE; +- if ((ps[(1) - (2)].val.opval) && (ps[(2) - (2)].val.opval)) ++ if ((ps[-1].val.opval) && (ps[0].val.opval)) + PL_hints |= HINT_BLOCK_SCOPE; + } ++ + break; + + case 23: +-#line 237 "perly.y" ++#line 237 "perly.y" /* yacc.c:1646 */ + { +- (yyval.opval) = (ps[(1) - (1)].val.opval) ? newSTATEOP(0, NULL, (ps[(1) - (1)].val.opval)) : NULL; ++ (yyval.opval) = (ps[0].val.opval) ? newSTATEOP(0, NULL, (ps[0].val.opval)) : NULL; + } ++ + break; + + case 24: +-#line 241 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 241 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 25: +-#line 245 "perly.y" ++#line 245 "perly.y" /* yacc.c:1646 */ + { +- (yyval.opval) = newSTATEOP(SVf_UTF8 * (ps[(1) - (2)].val.pval)[strlen((ps[(1) - (2)].val.pval))+1], (ps[(1) - (2)].val.pval), (ps[(2) - (2)].val.opval)); ++ (yyval.opval) = newSTATEOP(SVf_UTF8 * (ps[-1].val.pval)[strlen((ps[-1].val.pval))+1], (ps[-1].val.pval), (ps[0].val.opval)); + } ++ + break; + + case 26: +-#line 249 "perly.y" ++#line 249 "perly.y" /* yacc.c:1646 */ + { +- (yyval.opval) = newSTATEOP(SVf_UTF8 * (ps[(1) - (2)].val.pval)[strlen((ps[(1) - (2)].val.pval))+1], (ps[(1) - (2)].val.pval), (ps[(2) - (2)].val.opval)); ++ (yyval.opval) = newSTATEOP(SVf_UTF8 * (ps[-1].val.pval)[strlen((ps[-1].val.pval))+1], (ps[-1].val.pval), (ps[0].val.opval)); + } ++ + break; + + case 27: +-#line 256 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 256 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 28: +-#line 258 "perly.y" ++#line 258 "perly.y" /* yacc.c:1646 */ + { + CV *fmtcv = PL_compcv; +- newFORM((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval), (ps[(4) - (4)].val.opval)); ++ newFORM((ps[-2].val.ival), (ps[-1].val.opval), (ps[0].val.opval)); + (yyval.opval) = (OP*)NULL; + if (CvOUTSIDE(fmtcv) && !CvEVAL(CvOUTSIDE(fmtcv))) { + pad_add_weakref(fmtcv); + } + parser->parsed_sub = 1; + } ++ + break; + + case 29: +-#line 268 "perly.y" ++#line 268 "perly.y" /* yacc.c:1646 */ + { +- if ((ps[(2) - (3)].val.opval)->op_type == OP_CONST) { ++ if ((ps[-1].val.opval)->op_type == OP_CONST) { + const char *const name = +- SvPV_nolen_const(((SVOP*)(ps[(2) - (3)].val.opval))->op_sv); ++ SvPV_nolen_const(((SVOP*)(ps[-1].val.opval))->op_sv); + if (strEQ(name, "BEGIN") || strEQ(name, "END") + || strEQ(name, "INIT") || strEQ(name, "CHECK") + || strEQ(name, "UNITCHECK")) +@@ -230,33 +257,35 @@ case 2: + || CvCLONE(CvOUTSIDE(PL_compcv)) + || !PadnameIsSTATE(PadlistNAMESARRAY(CvPADLIST( + CvOUTSIDE(PL_compcv) +- ))[(ps[(2) - (3)].val.opval)->op_targ])) ++ ))[(ps[-1].val.opval)->op_targ])) + CvCLONE_on(PL_compcv); + parser->in_my = 0; + parser->in_my_stash = NULL; + } ++ + break; + + case 30: +-#line 290 "perly.y" ++#line 290 "perly.y" /* yacc.c:1646 */ + { + SvREFCNT_inc_simple_void(PL_compcv); +- (ps[(2) - (7)].val.opval)->op_type == OP_CONST +- ? newATTRSUB((ps[(3) - (7)].val.ival), (ps[(2) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval), (ps[(7) - (7)].val.opval)) +- : newMYSUB((ps[(3) - (7)].val.ival), (ps[(2) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval), (ps[(7) - (7)].val.opval)) ++ (ps[-5].val.opval)->op_type == OP_CONST ++ ? newATTRSUB((ps[-4].val.ival), (ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), (ps[0].val.opval)) ++ : newMYSUB((ps[-4].val.ival), (ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), (ps[0].val.opval)) + ; + (yyval.opval) = (OP*)NULL; + intro_my(); + parser->parsed_sub = 1; + } ++ + break; + + case 31: +-#line 301 "perly.y" ++#line 301 "perly.y" /* yacc.c:1646 */ + { +- if ((ps[(2) - (3)].val.opval)->op_type == OP_CONST) { ++ if ((ps[-1].val.opval)->op_type == OP_CONST) { + const char *const name = +- SvPV_nolen_const(((SVOP*)(ps[(2) - (3)].val.opval))->op_sv); ++ SvPV_nolen_const(((SVOP*)(ps[-1].val.opval))->op_sv); + if (strEQ(name, "BEGIN") || strEQ(name, "END") + || strEQ(name, "INIT") || strEQ(name, "CHECK") + || strEQ(name, "UNITCHECK")) +@@ -269,130 +298,144 @@ case 2: + || CvCLONE(CvOUTSIDE(PL_compcv)) + || !PadnameIsSTATE(PadlistNAMESARRAY(CvPADLIST( + CvOUTSIDE(PL_compcv) +- ))[(ps[(2) - (3)].val.opval)->op_targ])) ++ ))[(ps[-1].val.opval)->op_targ])) + CvCLONE_on(PL_compcv); + parser->in_my = 0; + parser->in_my_stash = NULL; + } ++ + break; + + case 32: +-#line 323 "perly.y" ++#line 323 "perly.y" /* yacc.c:1646 */ + { + OP *body; +- if (parser->copline > (line_t)(ps[(8) - (10)].val.ival)) +- parser->copline = (line_t)(ps[(8) - (10)].val.ival); +- body = block_end((ps[(5) - (10)].val.ival), +- op_append_list(OP_LINESEQ, (ps[(6) - (10)].val.opval), (ps[(9) - (10)].val.opval))); ++ if (parser->copline > (line_t)(ps[-2].val.ival)) ++ parser->copline = (line_t)(ps[-2].val.ival); ++ body = block_end((ps[-5].val.ival), ++ op_append_list(OP_LINESEQ, (ps[-4].val.opval), (ps[-1].val.opval))); + + SvREFCNT_inc_simple_void(PL_compcv); +- (ps[(2) - (10)].val.opval)->op_type == OP_CONST +- ? newATTRSUB((ps[(3) - (10)].val.ival), (ps[(2) - (10)].val.opval), NULL, (ps[(7) - (10)].val.opval), body) +- : newMYSUB((ps[(3) - (10)].val.ival), (ps[(2) - (10)].val.opval), NULL, (ps[(7) - (10)].val.opval), body) ++ (ps[-8].val.opval)->op_type == OP_CONST ++ ? newATTRSUB((ps[-7].val.ival), (ps[-8].val.opval), NULL, (ps[-3].val.opval), body) ++ : newMYSUB((ps[-7].val.ival), (ps[-8].val.opval), NULL, (ps[-3].val.opval), body) + ; + (yyval.opval) = (OP*)NULL; + intro_my(); + parser->parsed_sub = 1; + } ++ + break; + + case 33: +-#line 340 "perly.y" ++#line 340 "perly.y" /* yacc.c:1646 */ + { +- package((ps[(3) - (4)].val.opval)); +- if ((ps[(2) - (4)].val.opval)) +- package_version((ps[(2) - (4)].val.opval)); ++ package((ps[-1].val.opval)); ++ if ((ps[-2].val.opval)) ++ package_version((ps[-2].val.opval)); + (yyval.opval) = (OP*)NULL; + } ++ + break; + + case 34: +-#line 347 "perly.y" ++#line 347 "perly.y" /* yacc.c:1646 */ + { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ } ++ + break; + + case 35: +-#line 349 "perly.y" ++#line 349 "perly.y" /* yacc.c:1646 */ + { + SvREFCNT_inc_simple_void(PL_compcv); +- utilize((ps[(1) - (7)].val.ival), (ps[(2) - (7)].val.ival), (ps[(4) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval)); ++ utilize((ps[-6].val.ival), (ps[-5].val.ival), (ps[-3].val.opval), (ps[-2].val.opval), (ps[-1].val.opval)); + parser->parsed_sub = 1; + (yyval.opval) = (OP*)NULL; + } ++ + break; + + case 36: +-#line 356 "perly.y" ++#line 356 "perly.y" /* yacc.c:1646 */ + { +- (yyval.opval) = block_end((ps[(3) - (7)].val.ival), +- newCONDOP(0, (ps[(4) - (7)].val.opval), op_scope((ps[(6) - (7)].val.opval)), (ps[(7) - (7)].val.opval))); +- parser->copline = (line_t)(ps[(1) - (7)].val.ival); ++ (yyval.opval) = block_end((ps[-4].val.ival), ++ newCONDOP(0, (ps[-3].val.opval), op_scope((ps[-1].val.opval)), (ps[0].val.opval))); ++ parser->copline = (line_t)(ps[-6].val.ival); + } ++ + break; + + case 37: +-#line 362 "perly.y" ++#line 362 "perly.y" /* yacc.c:1646 */ + { +- (yyval.opval) = block_end((ps[(3) - (7)].val.ival), +- newCONDOP(0, (ps[(4) - (7)].val.opval), (ps[(7) - (7)].val.opval), op_scope((ps[(6) - (7)].val.opval)))); +- parser->copline = (line_t)(ps[(1) - (7)].val.ival); ++ (yyval.opval) = block_end((ps[-4].val.ival), ++ newCONDOP(0, (ps[-3].val.opval), (ps[0].val.opval), op_scope((ps[-1].val.opval)))); ++ parser->copline = (line_t)(ps[-6].val.ival); + } ++ + break; + + case 38: +-#line 368 "perly.y" ++#line 368 "perly.y" /* yacc.c:1646 */ + { +- (yyval.opval) = block_end((ps[(3) - (6)].val.ival), newGIVENOP((ps[(4) - (6)].val.opval), op_scope((ps[(6) - (6)].val.opval)), 0)); +- parser->copline = (line_t)(ps[(1) - (6)].val.ival); ++ (yyval.opval) = block_end((ps[-3].val.ival), newGIVENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)), 0)); ++ parser->copline = (line_t)(ps[-5].val.ival); + } ++ + break; + + case 39: +-#line 373 "perly.y" +- { (yyval.opval) = block_end((ps[(3) - (6)].val.ival), newWHENOP((ps[(4) - (6)].val.opval), op_scope((ps[(6) - (6)].val.opval)))); } ++#line 373 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = block_end((ps[-3].val.ival), newWHENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)))); } ++ + break; + + case 40: +-#line 375 "perly.y" +- { (yyval.opval) = newWHENOP(0, op_scope((ps[(2) - (2)].val.opval))); } ++#line 375 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newWHENOP(0, op_scope((ps[0].val.opval))); } ++ + break; + + case 41: +-#line 377 "perly.y" ++#line 377 "perly.y" /* yacc.c:1646 */ + { +- (yyval.opval) = block_end((ps[(3) - (8)].val.ival), ++ (yyval.opval) = block_end((ps[-5].val.ival), + newWHILEOP(0, 1, (LOOP*)(OP*)NULL, +- (ps[(4) - (8)].val.opval), (ps[(7) - (8)].val.opval), (ps[(8) - (8)].val.opval), (ps[(6) - (8)].val.ival))); +- parser->copline = (line_t)(ps[(1) - (8)].val.ival); ++ (ps[-4].val.opval), (ps[-1].val.opval), (ps[0].val.opval), (ps[-2].val.ival))); ++ parser->copline = (line_t)(ps[-7].val.ival); + } ++ + break; + + case 42: +-#line 384 "perly.y" ++#line 384 "perly.y" /* yacc.c:1646 */ + { +- (yyval.opval) = block_end((ps[(3) - (8)].val.ival), ++ (yyval.opval) = block_end((ps[-5].val.ival), + newWHILEOP(0, 1, (LOOP*)(OP*)NULL, +- (ps[(4) - (8)].val.opval), (ps[(7) - (8)].val.opval), (ps[(8) - (8)].val.opval), (ps[(6) - (8)].val.ival))); +- parser->copline = (line_t)(ps[(1) - (8)].val.ival); ++ (ps[-4].val.opval), (ps[-1].val.opval), (ps[0].val.opval), (ps[-2].val.ival))); ++ parser->copline = (line_t)(ps[-7].val.ival); + } ++ + break; + + case 43: +-#line 391 "perly.y" ++#line 391 "perly.y" /* yacc.c:1646 */ + { parser->expect = XTERM; } ++ + break; + + case 44: +-#line 393 "perly.y" ++#line 393 "perly.y" /* yacc.c:1646 */ + { parser->expect = XTERM; } ++ + break; + + case 45: +-#line 396 "perly.y" ++#line 396 "perly.y" /* yacc.c:1646 */ + { +- OP *initop = (ps[(4) - (13)].val.opval); ++ OP *initop = (ps[-9].val.opval); + OP *forop = newWHILEOP(0, 1, (LOOP*)(OP*)NULL, +- scalar((ps[(7) - (13)].val.opval)), (ps[(13) - (13)].val.opval), (ps[(11) - (13)].val.opval), (ps[(10) - (13)].val.ival)); ++ scalar((ps[-6].val.opval)), (ps[0].val.opval), (ps[-2].val.opval), (ps[-3].val.ival)); + if (initop) { + forop = op_prepend_elem(OP_LINESEQ, initop, + op_append_elem(OP_LINESEQ, +@@ -400,123 +443,135 @@ case 2: + forop)); + } + PL_hints |= HINT_BLOCK_SCOPE; +- (yyval.opval) = block_end((ps[(3) - (13)].val.ival), forop); +- parser->copline = (line_t)(ps[(1) - (13)].val.ival); ++ (yyval.opval) = block_end((ps[-10].val.ival), forop); ++ parser->copline = (line_t)(ps[-12].val.ival); + } ++ + break; + + case 46: +-#line 411 "perly.y" ++#line 411 "perly.y" /* yacc.c:1646 */ + { +- (yyval.opval) = block_end((ps[(3) - (9)].val.ival), newFOROP(0, (ps[(4) - (9)].val.opval), (ps[(6) - (9)].val.opval), (ps[(8) - (9)].val.opval), (ps[(9) - (9)].val.opval))); +- parser->copline = (line_t)(ps[(1) - (9)].val.ival); ++ (yyval.opval) = block_end((ps[-6].val.ival), newFOROP(0, (ps[-5].val.opval), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval))); ++ parser->copline = (line_t)(ps[-8].val.ival); + } ++ + break; + + case 47: +-#line 416 "perly.y" ++#line 416 "perly.y" /* yacc.c:1646 */ + { +- (yyval.opval) = block_end((ps[(4) - (8)].val.ival), newFOROP(0, +- op_lvalue((ps[(2) - (8)].val.opval), OP_ENTERLOOP), (ps[(5) - (8)].val.opval), (ps[(7) - (8)].val.opval), (ps[(8) - (8)].val.opval))); +- parser->copline = (line_t)(ps[(1) - (8)].val.ival); ++ (yyval.opval) = block_end((ps[-4].val.ival), newFOROP(0, ++ op_lvalue((ps[-6].val.opval), OP_ENTERLOOP), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval))); ++ parser->copline = (line_t)(ps[-7].val.ival); + } ++ + break; + + case 48: +-#line 422 "perly.y" +- { parser->in_my = 0; (yyval.opval) = my((ps[(5) - (5)].val.opval)); } ++#line 422 "perly.y" /* yacc.c:1646 */ ++ { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); } ++ + break; + + case 49: +-#line 424 "perly.y" ++#line 424 "perly.y" /* yacc.c:1646 */ + { + (yyval.opval) = block_end( +- (ps[(4) - (11)].val.ival), ++ (ps[-7].val.ival), + newFOROP(0, + op_lvalue( + newUNOP(OP_REFGEN, 0, +- (ps[(6) - (11)].val.opval)), ++ (ps[-5].val.opval)), + OP_ENTERLOOP), +- (ps[(8) - (11)].val.opval), (ps[(10) - (11)].val.opval), (ps[(11) - (11)].val.opval)) ++ (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval)) + ); +- parser->copline = (line_t)(ps[(1) - (11)].val.ival); ++ parser->copline = (line_t)(ps[-10].val.ival); + } ++ + break; + + case 50: +-#line 437 "perly.y" ++#line 437 "perly.y" /* yacc.c:1646 */ + { +- (yyval.opval) = block_end((ps[(5) - (9)].val.ival), newFOROP( ++ (yyval.opval) = block_end((ps[-4].val.ival), newFOROP( + 0, op_lvalue(newUNOP(OP_REFGEN, 0, +- (ps[(3) - (9)].val.opval)), +- OP_ENTERLOOP), (ps[(6) - (9)].val.opval), (ps[(8) - (9)].val.opval), (ps[(9) - (9)].val.opval))); +- parser->copline = (line_t)(ps[(1) - (9)].val.ival); ++ (ps[-6].val.opval)), ++ OP_ENTERLOOP), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval))); ++ parser->copline = (line_t)(ps[-8].val.ival); + } ++ + break; + + case 51: +-#line 445 "perly.y" ++#line 445 "perly.y" /* yacc.c:1646 */ + { +- (yyval.opval) = block_end((ps[(3) - (7)].val.ival), +- newFOROP(0, (OP*)NULL, (ps[(4) - (7)].val.opval), (ps[(6) - (7)].val.opval), (ps[(7) - (7)].val.opval))); +- parser->copline = (line_t)(ps[(1) - (7)].val.ival); ++ (yyval.opval) = block_end((ps[-4].val.ival), ++ newFOROP(0, (OP*)NULL, (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval))); ++ parser->copline = (line_t)(ps[-6].val.ival); + } ++ + break; + + case 52: +-#line 451 "perly.y" ++#line 451 "perly.y" /* yacc.c:1646 */ + { + /* a block is a loop that happens once */ + (yyval.opval) = newWHILEOP(0, 1, (LOOP*)(OP*)NULL, +- (OP*)NULL, (ps[(1) - (2)].val.opval), (ps[(2) - (2)].val.opval), 0); ++ (OP*)NULL, (ps[-1].val.opval), (ps[0].val.opval), 0); + } ++ + break; + + case 53: +-#line 457 "perly.y" ++#line 457 "perly.y" /* yacc.c:1646 */ + { +- package((ps[(3) - (5)].val.opval)); +- if ((ps[(2) - (5)].val.opval)) { +- package_version((ps[(2) - (5)].val.opval)); ++ package((ps[-2].val.opval)); ++ if ((ps[-3].val.opval)) { ++ package_version((ps[-3].val.opval)); + } + } ++ + break; + + case 54: +-#line 464 "perly.y" ++#line 464 "perly.y" /* yacc.c:1646 */ + { + /* a block is a loop that happens once */ + (yyval.opval) = newWHILEOP(0, 1, (LOOP*)(OP*)NULL, +- (OP*)NULL, block_end((ps[(5) - (8)].val.ival), (ps[(7) - (8)].val.opval)), (OP*)NULL, 0); +- if (parser->copline > (line_t)(ps[(4) - (8)].val.ival)) +- parser->copline = (line_t)(ps[(4) - (8)].val.ival); ++ (OP*)NULL, block_end((ps[-3].val.ival), (ps[-1].val.opval)), (OP*)NULL, 0); ++ if (parser->copline > (line_t)(ps[-4].val.ival)) ++ parser->copline = (line_t)(ps[-4].val.ival); + } ++ + break; + + case 55: +-#line 472 "perly.y" ++#line 472 "perly.y" /* yacc.c:1646 */ + { +- (yyval.opval) = (ps[(1) - (2)].val.opval); ++ (yyval.opval) = (ps[-1].val.opval); + } ++ + break; + + case 56: +-#line 476 "perly.y" ++#line 476 "perly.y" /* yacc.c:1646 */ + { + (yyval.opval) = (OP*)NULL; + parser->copline = NOLINE; + } ++ + break; + + case 57: +-#line 484 "perly.y" ++#line 484 "perly.y" /* yacc.c:1646 */ + { OP *list; +- if ((ps[(2) - (2)].val.opval)) { +- OP *term = (ps[(2) - (2)].val.opval); +- list = op_append_elem(OP_LIST, (ps[(1) - (2)].val.opval), term); ++ if ((ps[0].val.opval)) { ++ OP *term = (ps[0].val.opval); ++ list = op_append_elem(OP_LIST, (ps[-1].val.opval), term); + } + else { +- list = (ps[(1) - (2)].val.opval); ++ list = (ps[-1].val.opval); + } + if (parser->copline == NOLINE) + parser->copline = CopLINE(PL_curcop)-1; +@@ -524,186 +579,219 @@ case 2: + (yyval.opval) = newSTATEOP(0, NULL, + op_convert_list(OP_FORMLINE, 0, list)); + } ++ + break; + + case 58: +-#line 501 "perly.y" ++#line 501 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = NULL; } ++ + break; + + case 59: +-#line 503 "perly.y" +- { (yyval.opval) = op_unscope((ps[(2) - (3)].val.opval)); } ++#line 503 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = op_unscope((ps[-1].val.opval)); } ++ + break; + + case 60: +-#line 508 "perly.y" ++#line 508 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = (OP*)NULL; } ++ + break; + + case 61: +-#line 510 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 510 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 62: +-#line 512 "perly.y" +- { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval)); } ++#line 512 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[0].val.opval), (ps[-2].val.opval)); } ++ + break; + + case 63: +-#line 514 "perly.y" +- { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval)); } ++#line 514 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[0].val.opval), (ps[-2].val.opval)); } ++ + break; + + case 64: +-#line 516 "perly.y" +- { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[(3) - (3)].val.opval)), (ps[(1) - (3)].val.opval)); } ++#line 516 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[0].val.opval)), (ps[-2].val.opval)); } ++ + break; + + case 65: +-#line 518 "perly.y" +- { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval)); } ++#line 518 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[0].val.opval), (ps[-2].val.opval)); } ++ + break; + + case 66: +-#line 520 "perly.y" +- { (yyval.opval) = newFOROP(0, (OP*)NULL, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval), (OP*)NULL); +- parser->copline = (line_t)(ps[(2) - (3)].val.ival); } ++#line 520 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newFOROP(0, (OP*)NULL, (ps[0].val.opval), (ps[-2].val.opval), (OP*)NULL); ++ parser->copline = (line_t)(ps[-1].val.ival); } ++ + break; + + case 67: +-#line 523 "perly.y" +- { (yyval.opval) = newWHENOP((ps[(3) - (3)].val.opval), op_scope((ps[(1) - (3)].val.opval))); } ++#line 523 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newWHENOP((ps[0].val.opval), op_scope((ps[-2].val.opval))); } ++ + break; + + case 68: +-#line 528 "perly.y" ++#line 528 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = (OP*)NULL; } ++ + break; + + case 69: +-#line 530 "perly.y" ++#line 530 "perly.y" /* yacc.c:1646 */ + { +- ((ps[(2) - (2)].val.opval))->op_flags |= OPf_PARENS; +- (yyval.opval) = op_scope((ps[(2) - (2)].val.opval)); ++ ((ps[0].val.opval))->op_flags |= OPf_PARENS; ++ (yyval.opval) = op_scope((ps[0].val.opval)); + } ++ + break; + + case 70: +-#line 535 "perly.y" +- { parser->copline = (line_t)(ps[(1) - (6)].val.ival); ++#line 535 "perly.y" /* yacc.c:1646 */ ++ { parser->copline = (line_t)(ps[-5].val.ival); + (yyval.opval) = newCONDOP(0, +- newSTATEOP(OPf_SPECIAL,NULL,(ps[(3) - (6)].val.opval)), +- op_scope((ps[(5) - (6)].val.opval)), (ps[(6) - (6)].val.opval)); ++ newSTATEOP(OPf_SPECIAL,NULL,(ps[-3].val.opval)), ++ op_scope((ps[-1].val.opval)), (ps[0].val.opval)); + PL_hints |= HINT_BLOCK_SCOPE; + } ++ + break; + + case 71: +-#line 545 "perly.y" ++#line 545 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = (OP*)NULL; } ++ + break; + + case 72: +-#line 547 "perly.y" +- { (yyval.opval) = op_scope((ps[(2) - (2)].val.opval)); } ++#line 547 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = op_scope((ps[0].val.opval)); } ++ + break; + + case 73: +-#line 552 "perly.y" ++#line 552 "perly.y" /* yacc.c:1646 */ + { (yyval.ival) = (PL_min_intro_pending && + PL_max_intro_pending >= PL_min_intro_pending); + intro_my(); } ++ + break; + + case 74: +-#line 558 "perly.y" ++#line 558 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = (OP*)NULL; } ++ + break; + + case 76: +-#line 564 "perly.y" ++#line 564 "perly.y" /* yacc.c:1646 */ + { YYSTYPE tmplval; + (void)scan_num("1", &tmplval); + (yyval.opval) = tmplval.opval; } ++ + break; + + case 78: +-#line 572 "perly.y" +- { (yyval.opval) = invert(scalar((ps[(1) - (1)].val.opval))); } ++#line 572 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = invert(scalar((ps[0].val.opval))); } ++ + break; + + case 79: +-#line 577 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); } ++#line 577 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); intro_my(); } ++ + break; + + case 80: +-#line 581 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); } ++#line 581 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); intro_my(); } ++ + break; + + case 81: +-#line 584 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 584 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 82: +-#line 585 "perly.y" ++#line 585 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = (OP*)NULL; } ++ + break; + + case 83: +-#line 589 "perly.y" ++#line 589 "perly.y" /* yacc.c:1646 */ + { (yyval.ival) = start_subparse(FALSE, 0); + SAVEFREESV(PL_compcv); } ++ + break; + + case 84: +-#line 595 "perly.y" ++#line 595 "perly.y" /* yacc.c:1646 */ + { (yyval.ival) = start_subparse(FALSE, CVf_ANON); + SAVEFREESV(PL_compcv); } ++ + break; + + case 85: +-#line 600 "perly.y" ++#line 600 "perly.y" /* yacc.c:1646 */ + { (yyval.ival) = start_subparse(TRUE, 0); + SAVEFREESV(PL_compcv); } ++ + break; + + case 88: +-#line 611 "perly.y" ++#line 611 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = (OP*)NULL; } ++ + break; + + case 90: +-#line 617 "perly.y" ++#line 617 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = (OP*)NULL; } ++ + break; + + case 91: +-#line 619 "perly.y" +- { (yyval.opval) = (ps[(2) - (2)].val.opval); } ++#line 619 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 92: +-#line 621 "perly.y" ++#line 621 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = (OP*)NULL; } ++ + break; + + case 93: +-#line 626 "perly.y" +- { (yyval.opval) = (ps[(2) - (2)].val.opval); } ++#line 626 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 94: +-#line 628 "perly.y" ++#line 628 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = (OP*)NULL; } ++ + break; + + case 95: +-#line 633 "perly.y" ++#line 633 "perly.y" /* yacc.c:1646 */ + { + /* We shouldn't get here otherwise */ + assert(FEATURE_SIGNATURES_IS_ENABLED); +@@ -713,318 +801,382 @@ case 2: + "The signatures feature is experimental"); + (yyval.opval) = parse_subsignature(); + } ++ + break; + + case 96: +-#line 643 "perly.y" ++#line 643 "perly.y" /* yacc.c:1646 */ + { +- (yyval.opval) = op_append_list(OP_LINESEQ, (ps[(2) - (3)].val.opval), ++ (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), + newSTATEOP(0, NULL, sawparens(newNULLLIST()))); + parser->expect = XATTRBLOCK; + } ++ + break; + + case 98: +-#line 652 "perly.y" ++#line 652 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = (OP*)NULL; } ++ + break; + + case 99: +-#line 657 "perly.y" +- { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); } ++#line 657 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); } ++ + break; + + case 100: +-#line 659 "perly.y" +- { (yyval.opval) = newLOGOP((ps[(2) - (3)].val.ival), 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); } ++#line 659 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newLOGOP((ps[-1].val.ival), 0, (ps[-2].val.opval), (ps[0].val.opval)); } ++ + break; + + case 101: +-#line 661 "perly.y" +- { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); } ++#line 661 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); } ++ + break; + + case 103: +-#line 667 "perly.y" +- { (yyval.opval) = (ps[(1) - (2)].val.opval); } ++#line 667 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[-1].val.opval); } ++ + break; + + case 104: +-#line 669 "perly.y" ++#line 669 "perly.y" /* yacc.c:1646 */ + { +- OP* term = (ps[(3) - (3)].val.opval); +- (yyval.opval) = op_append_elem(OP_LIST, (ps[(1) - (3)].val.opval), term); ++ OP* term = (ps[0].val.opval); ++ (yyval.opval) = op_append_elem(OP_LIST, (ps[-2].val.opval), term); + } ++ + break; + + case 106: +-#line 678 "perly.y" +- { (yyval.opval) = op_convert_list((ps[(1) - (3)].val.ival), OPf_STACKED, +- op_prepend_elem(OP_LIST, newGVREF((ps[(1) - (3)].val.ival),(ps[(2) - (3)].val.opval)), (ps[(3) - (3)].val.opval)) ); ++#line 678 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = op_convert_list((ps[-2].val.ival), OPf_STACKED, ++ op_prepend_elem(OP_LIST, newGVREF((ps[-2].val.ival),(ps[-1].val.opval)), (ps[0].val.opval)) ); + } ++ + break; + + case 107: +-#line 682 "perly.y" +- { (yyval.opval) = op_convert_list((ps[(1) - (5)].val.ival), OPf_STACKED, +- op_prepend_elem(OP_LIST, newGVREF((ps[(1) - (5)].val.ival),(ps[(3) - (5)].val.opval)), (ps[(4) - (5)].val.opval)) ); ++#line 682 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = op_convert_list((ps[-4].val.ival), OPf_STACKED, ++ op_prepend_elem(OP_LIST, newGVREF((ps[-4].val.ival),(ps[-2].val.opval)), (ps[-1].val.opval)) ); + } ++ + break; + + case 108: +-#line 686 "perly.y" ++#line 686 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, + op_append_elem(OP_LIST, +- op_prepend_elem(OP_LIST, scalar((ps[(1) - (6)].val.opval)), (ps[(5) - (6)].val.opval)), +- newMETHOP(OP_METHOD, 0, (ps[(3) - (6)].val.opval)))); ++ op_prepend_elem(OP_LIST, scalar((ps[-5].val.opval)), (ps[-1].val.opval)), ++ newMETHOP(OP_METHOD, 0, (ps[-3].val.opval)))); + } ++ + break; + + case 109: +-#line 692 "perly.y" ++#line 692 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, +- op_append_elem(OP_LIST, scalar((ps[(1) - (3)].val.opval)), +- newMETHOP(OP_METHOD, 0, (ps[(3) - (3)].val.opval)))); ++ op_append_elem(OP_LIST, scalar((ps[-2].val.opval)), ++ newMETHOP(OP_METHOD, 0, (ps[0].val.opval)))); + } ++ + break; + + case 110: +-#line 697 "perly.y" ++#line 697 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, + op_append_elem(OP_LIST, +- op_prepend_elem(OP_LIST, (ps[(2) - (3)].val.opval), (ps[(3) - (3)].val.opval)), +- newMETHOP(OP_METHOD, 0, (ps[(1) - (3)].val.opval)))); ++ op_prepend_elem(OP_LIST, (ps[-1].val.opval), (ps[0].val.opval)), ++ newMETHOP(OP_METHOD, 0, (ps[-2].val.opval)))); + } ++ + break; + + case 111: +-#line 703 "perly.y" ++#line 703 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, + op_append_elem(OP_LIST, +- op_prepend_elem(OP_LIST, (ps[(2) - (5)].val.opval), (ps[(4) - (5)].val.opval)), +- newMETHOP(OP_METHOD, 0, (ps[(1) - (5)].val.opval)))); ++ op_prepend_elem(OP_LIST, (ps[-3].val.opval), (ps[-1].val.opval)), ++ newMETHOP(OP_METHOD, 0, (ps[-4].val.opval)))); + } ++ + break; + + case 112: +-#line 709 "perly.y" +- { (yyval.opval) = op_convert_list((ps[(1) - (2)].val.ival), 0, (ps[(2) - (2)].val.opval)); } ++#line 709 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = op_convert_list((ps[-1].val.ival), 0, (ps[0].val.opval)); } ++ + break; + + case 113: +-#line 711 "perly.y" +- { (yyval.opval) = op_convert_list((ps[(1) - (4)].val.ival), 0, (ps[(3) - (4)].val.opval)); } ++#line 711 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); } ++ + break; + + case 114: +-#line 713 "perly.y" ++#line 713 "perly.y" /* yacc.c:1646 */ + { SvREFCNT_inc_simple_void(PL_compcv); +- (yyval.opval) = newANONATTRSUB((ps[(2) - (3)].val.ival), 0, (OP*)NULL, (ps[(3) - (3)].val.opval)); } ++ (yyval.opval) = newANONATTRSUB((ps[-1].val.ival), 0, (OP*)NULL, (ps[0].val.opval)); } ++ + break; + + case 115: +-#line 716 "perly.y" ++#line 716 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, + op_append_elem(OP_LIST, +- op_prepend_elem(OP_LIST, (ps[(4) - (5)].val.opval), (ps[(5) - (5)].val.opval)), (ps[(1) - (5)].val.opval))); ++ op_prepend_elem(OP_LIST, (ps[-1].val.opval), (ps[0].val.opval)), (ps[-4].val.opval))); + } ++ + break; + + case 118: +-#line 731 "perly.y" +- { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[(1) - (5)].val.opval), scalar((ps[(3) - (5)].val.opval))); } ++#line 731 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[-4].val.opval), scalar((ps[-2].val.opval))); } ++ + break; + + case 119: +-#line 733 "perly.y" +- { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[(1) - (4)].val.opval)), scalar((ps[(3) - (4)].val.opval))); ++#line 733 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[-3].val.opval)), scalar((ps[-1].val.opval))); + } ++ + break; + + case 120: +-#line 736 "perly.y" ++#line 736 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newBINOP(OP_AELEM, 0, +- ref(newAVREF((ps[(1) - (5)].val.opval)),OP_RV2AV), +- scalar((ps[(4) - (5)].val.opval))); ++ ref(newAVREF((ps[-4].val.opval)),OP_RV2AV), ++ scalar((ps[-1].val.opval))); + } ++ + break; + + case 121: +-#line 741 "perly.y" ++#line 741 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newBINOP(OP_AELEM, 0, +- ref(newAVREF((ps[(1) - (4)].val.opval)),OP_RV2AV), +- scalar((ps[(3) - (4)].val.opval))); ++ ref(newAVREF((ps[-3].val.opval)),OP_RV2AV), ++ scalar((ps[-1].val.opval))); + } ++ + break; + + case 122: +-#line 746 "perly.y" +- { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[(1) - (5)].val.opval)), jmaybe((ps[(3) - (5)].val.opval))); ++#line 746 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[-4].val.opval)), jmaybe((ps[-2].val.opval))); + } ++ + break; + + case 123: +-#line 749 "perly.y" ++#line 749 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newBINOP(OP_HELEM, 0, +- ref(newHVREF((ps[(1) - (6)].val.opval)),OP_RV2HV), +- jmaybe((ps[(4) - (6)].val.opval))); } ++ ref(newHVREF((ps[-5].val.opval)),OP_RV2HV), ++ jmaybe((ps[-2].val.opval))); } ++ + break; + + case 124: +-#line 753 "perly.y" ++#line 753 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newBINOP(OP_HELEM, 0, +- ref(newHVREF((ps[(1) - (5)].val.opval)),OP_RV2HV), +- jmaybe((ps[(3) - (5)].val.opval))); } ++ ref(newHVREF((ps[-4].val.opval)),OP_RV2HV), ++ jmaybe((ps[-2].val.opval))); } ++ + break; + + case 125: +-#line 757 "perly.y" ++#line 757 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, +- newCVREF(0, scalar((ps[(1) - (4)].val.opval)))); } ++ newCVREF(0, scalar((ps[-3].val.opval)))); ++ if (parser->expect == XBLOCK) ++ parser->expect = XOPERATOR; ++ } ++ + break; + + case 126: +-#line 760 "perly.y" ++#line 763 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, +- op_append_elem(OP_LIST, (ps[(4) - (5)].val.opval), +- newCVREF(0, scalar((ps[(1) - (5)].val.opval))))); } ++ op_append_elem(OP_LIST, (ps[-1].val.opval), ++ newCVREF(0, scalar((ps[-4].val.opval))))); ++ if (parser->expect == XBLOCK) ++ parser->expect = XOPERATOR; ++ } ++ + break; + + case 127: +-#line 765 "perly.y" ++#line 771 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, +- op_append_elem(OP_LIST, (ps[(3) - (4)].val.opval), +- newCVREF(0, scalar((ps[(1) - (4)].val.opval))))); } ++ op_append_elem(OP_LIST, (ps[-1].val.opval), ++ newCVREF(0, scalar((ps[-3].val.opval))))); ++ if (parser->expect == XBLOCK) ++ parser->expect = XOPERATOR; ++ } ++ + break; + + case 128: +-#line 769 "perly.y" ++#line 778 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, +- newCVREF(0, scalar((ps[(1) - (3)].val.opval)))); } ++ newCVREF(0, scalar((ps[-2].val.opval)))); ++ if (parser->expect == XBLOCK) ++ parser->expect = XOPERATOR; ++ } ++ + break; + + case 129: +-#line 772 "perly.y" +- { (yyval.opval) = newSLICEOP(0, (ps[(5) - (6)].val.opval), (ps[(2) - (6)].val.opval)); } ++#line 784 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-4].val.opval)); } ++ + break; + + case 130: +-#line 774 "perly.y" +- { (yyval.opval) = newSLICEOP(0, (ps[(3) - (4)].val.opval), (ps[(1) - (4)].val.opval)); } ++#line 786 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-3].val.opval)); } ++ + break; + + case 131: +-#line 776 "perly.y" +- { (yyval.opval) = newSLICEOP(0, (ps[(4) - (5)].val.opval), (OP*)NULL); } ++#line 788 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (OP*)NULL); } ++ + break; + + case 132: +-#line 781 "perly.y" +- { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[(1) - (3)].val.opval), (ps[(2) - (3)].val.ival), (ps[(3) - (3)].val.opval)); } ++#line 793 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[-2].val.opval), (ps[-1].val.ival), (ps[0].val.opval)); } ++ + break; + + case 133: +-#line 783 "perly.y" +- { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); } ++#line 795 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } ++ + break; + + case 134: +-#line 785 "perly.y" +- { if ((ps[(2) - (3)].val.ival) != OP_REPEAT) +- scalar((ps[(1) - (3)].val.opval)); +- (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, (ps[(1) - (3)].val.opval), scalar((ps[(3) - (3)].val.opval))); ++#line 797 "perly.y" /* yacc.c:1646 */ ++ { if ((ps[-1].val.ival) != OP_REPEAT) ++ scalar((ps[-2].val.opval)); ++ (yyval.opval) = newBINOP((ps[-1].val.ival), 0, (ps[-2].val.opval), scalar((ps[0].val.opval))); + } ++ + break; + + case 135: +-#line 790 "perly.y" +- { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); } ++#line 802 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } ++ + break; + + case 136: +-#line 792 "perly.y" +- { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); } ++#line 804 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } ++ + break; + + case 137: +-#line 794 "perly.y" +- { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); } ++#line 806 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } ++ + break; + + case 138: +-#line 796 "perly.y" +- { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); } ++#line 808 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } ++ + break; + + case 139: +-#line 798 "perly.y" +- { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); } ++#line 810 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } ++ + break; + + case 140: +-#line 800 "perly.y" +- { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); } ++#line 812 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } ++ + break; + + case 141: +-#line 802 "perly.y" +- { (yyval.opval) = newRANGE((ps[(2) - (3)].val.ival), scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); } ++#line 814 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newRANGE((ps[-1].val.ival), scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } ++ + break; + + case 142: +-#line 804 "perly.y" +- { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); } ++#line 816 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); } ++ + break; + + case 143: +-#line 806 "perly.y" +- { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); } ++#line 818 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[-2].val.opval), (ps[0].val.opval)); } ++ + break; + + case 144: +-#line 808 "perly.y" +- { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); } ++#line 820 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); } ++ + break; + + case 145: +-#line 810 "perly.y" +- { (yyval.opval) = bind_match((ps[(2) - (3)].val.ival), (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); } ++#line 822 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = bind_match((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } ++ + break; + + case 146: +-#line 815 "perly.y" +- { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[(2) - (2)].val.opval))); } ++#line 827 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[0].val.opval))); } ++ + break; + + case 147: +-#line 817 "perly.y" +- { (yyval.opval) = (ps[(2) - (2)].val.opval); } ++#line 829 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 148: +-#line 820 "perly.y" +- { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval))); } ++#line 832 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); } ++ + break; + + case 149: +-#line 822 "perly.y" +- { (yyval.opval) = newUNOP((ps[(1) - (2)].val.ival), 0, scalar((ps[(2) - (2)].val.opval))); } ++#line 834 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, scalar((ps[0].val.opval))); } ++ + break; + + case 150: +-#line 824 "perly.y" ++#line 836 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newUNOP(OP_POSTINC, 0, +- op_lvalue(scalar((ps[(1) - (2)].val.opval)), OP_POSTINC)); } ++ op_lvalue(scalar((ps[-1].val.opval)), OP_POSTINC)); } ++ + break; + + case 151: +-#line 827 "perly.y" ++#line 839 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newUNOP(OP_POSTDEC, 0, +- op_lvalue(scalar((ps[(1) - (2)].val.opval)), OP_POSTDEC));} ++ op_lvalue(scalar((ps[-1].val.opval)), OP_POSTDEC));} ++ + break; + + case 152: +-#line 830 "perly.y" ++#line 842 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = op_convert_list(OP_JOIN, 0, + op_append_elem( + OP_LIST, +@@ -1032,510 +1184,598 @@ case 2: + newSVOP(OP_CONST,0, + newSVpvs("\"")) + )), +- (ps[(1) - (2)].val.opval) ++ (ps[-1].val.opval) + )); + } ++ + break; + + case 153: +-#line 841 "perly.y" ++#line 853 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newUNOP(OP_PREINC, 0, +- op_lvalue(scalar((ps[(2) - (2)].val.opval)), OP_PREINC)); } ++ op_lvalue(scalar((ps[0].val.opval)), OP_PREINC)); } ++ + break; + + case 154: +-#line 844 "perly.y" ++#line 856 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newUNOP(OP_PREDEC, 0, +- op_lvalue(scalar((ps[(2) - (2)].val.opval)), OP_PREDEC)); } ++ op_lvalue(scalar((ps[0].val.opval)), OP_PREDEC)); } ++ + break; + + case 155: +-#line 851 "perly.y" +- { (yyval.opval) = newANONLIST((ps[(2) - (3)].val.opval)); } ++#line 863 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newANONLIST((ps[-1].val.opval)); } ++ + break; + + case 156: +-#line 853 "perly.y" ++#line 865 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newANONLIST((OP*)NULL);} ++ + break; + + case 157: +-#line 855 "perly.y" +- { (yyval.opval) = newANONHASH((ps[(2) - (4)].val.opval)); } ++#line 867 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newANONHASH((ps[-2].val.opval)); } ++ + break; + + case 158: +-#line 857 "perly.y" ++#line 869 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newANONHASH((OP*)NULL); } ++ + break; + + case 159: +-#line 859 "perly.y" ++#line 871 "perly.y" /* yacc.c:1646 */ + { SvREFCNT_inc_simple_void(PL_compcv); +- (yyval.opval) = newANONATTRSUB((ps[(2) - (5)].val.ival), (ps[(3) - (5)].val.opval), (ps[(4) - (5)].val.opval), (ps[(5) - (5)].val.opval)); } ++ (yyval.opval) = newANONATTRSUB((ps[-3].val.ival), (ps[-2].val.opval), (ps[-1].val.opval), (ps[0].val.opval)); } ++ + break; + + case 160: +-#line 862 "perly.y" ++#line 874 "perly.y" /* yacc.c:1646 */ + { + OP *body; +- if (parser->copline > (line_t)(ps[(6) - (8)].val.ival)) +- parser->copline = (line_t)(ps[(6) - (8)].val.ival); +- body = block_end((ps[(3) - (8)].val.ival), +- op_append_list(OP_LINESEQ, (ps[(4) - (8)].val.opval), (ps[(7) - (8)].val.opval))); ++ if (parser->copline > (line_t)(ps[-2].val.ival)) ++ parser->copline = (line_t)(ps[-2].val.ival); ++ body = block_end((ps[-5].val.ival), ++ op_append_list(OP_LINESEQ, (ps[-4].val.opval), (ps[-1].val.opval))); + SvREFCNT_inc_simple_void(PL_compcv); +- (yyval.opval) = newANONATTRSUB((ps[(2) - (8)].val.ival), NULL, (ps[(5) - (8)].val.opval), body); ++ (yyval.opval) = newANONATTRSUB((ps[-6].val.ival), NULL, (ps[-3].val.opval), body); + } ++ + break; + + case 161: +-#line 876 "perly.y" +- { (yyval.opval) = dofile((ps[(2) - (2)].val.opval), (ps[(1) - (2)].val.ival));} ++#line 888 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = dofile((ps[0].val.opval), (ps[-1].val.ival));} ++ + break; + + case 162: +-#line 878 "perly.y" +- { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[(2) - (2)].val.opval)));} ++#line 890 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[0].val.opval)));} ++ + break; + + case 167: +-#line 886 "perly.y" +- { (yyval.opval) = newCONDOP(0, (ps[(1) - (5)].val.opval), (ps[(3) - (5)].val.opval), (ps[(5) - (5)].val.opval)); } ++#line 898 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newCONDOP(0, (ps[-4].val.opval), (ps[-2].val.opval), (ps[0].val.opval)); } ++ + break; + + case 168: +-#line 888 "perly.y" +- { (yyval.opval) = newUNOP(OP_REFGEN, 0, (ps[(2) - (2)].val.opval)); } ++#line 900 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newUNOP(OP_REFGEN, 0, (ps[0].val.opval)); } ++ + break; + + case 169: +-#line 890 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 902 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 170: +-#line 892 "perly.y" +- { (yyval.opval) = localize((ps[(2) - (2)].val.opval),(ps[(1) - (2)].val.ival)); } ++#line 904 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = localize((ps[0].val.opval),(ps[-1].val.ival)); } ++ + break; + + case 171: +-#line 894 "perly.y" +- { (yyval.opval) = sawparens((ps[(2) - (3)].val.opval)); } ++#line 906 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = sawparens((ps[-1].val.opval)); } ++ + break; + + case 172: +-#line 896 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 908 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 173: +-#line 898 "perly.y" ++#line 910 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = sawparens(newNULLLIST()); } ++ + break; + + case 174: +-#line 900 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 912 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 175: +-#line 902 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 914 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 176: +-#line 904 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 916 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 177: +-#line 906 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 918 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 178: +-#line 908 "perly.y" +- { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[(1) - (1)].val.opval), OP_AV2ARYLEN));} ++#line 920 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[0].val.opval), OP_AV2ARYLEN));} ++ + break; + + case 179: +-#line 910 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 922 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 180: +-#line 912 "perly.y" ++#line 924 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = op_prepend_elem(OP_ASLICE, + newOP(OP_PUSHMARK, 0), + newLISTOP(OP_ASLICE, 0, +- list((ps[(3) - (4)].val.opval)), +- ref((ps[(1) - (4)].val.opval), OP_ASLICE))); +- if ((yyval.opval) && (ps[(1) - (4)].val.opval)) ++ list((ps[-1].val.opval)), ++ ref((ps[-3].val.opval), OP_ASLICE))); ++ if ((yyval.opval) && (ps[-3].val.opval)) + (yyval.opval)->op_private |= +- (ps[(1) - (4)].val.opval)->op_private & OPpSLICEWARNING; ++ (ps[-3].val.opval)->op_private & OPpSLICEWARNING; + } ++ + break; + + case 181: +-#line 922 "perly.y" ++#line 934 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = op_prepend_elem(OP_KVASLICE, + newOP(OP_PUSHMARK, 0), + newLISTOP(OP_KVASLICE, 0, +- list((ps[(3) - (4)].val.opval)), +- ref(oopsAV((ps[(1) - (4)].val.opval)), OP_KVASLICE))); +- if ((yyval.opval) && (ps[(1) - (4)].val.opval)) ++ list((ps[-1].val.opval)), ++ ref(oopsAV((ps[-3].val.opval)), OP_KVASLICE))); ++ if ((yyval.opval) && (ps[-3].val.opval)) + (yyval.opval)->op_private |= +- (ps[(1) - (4)].val.opval)->op_private & OPpSLICEWARNING; ++ (ps[-3].val.opval)->op_private & OPpSLICEWARNING; + } ++ + break; + + case 182: +-#line 932 "perly.y" ++#line 944 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = op_prepend_elem(OP_HSLICE, + newOP(OP_PUSHMARK, 0), + newLISTOP(OP_HSLICE, 0, +- list((ps[(3) - (5)].val.opval)), +- ref(oopsHV((ps[(1) - (5)].val.opval)), OP_HSLICE))); +- if ((yyval.opval) && (ps[(1) - (5)].val.opval)) ++ list((ps[-2].val.opval)), ++ ref(oopsHV((ps[-4].val.opval)), OP_HSLICE))); ++ if ((yyval.opval) && (ps[-4].val.opval)) + (yyval.opval)->op_private |= +- (ps[(1) - (5)].val.opval)->op_private & OPpSLICEWARNING; ++ (ps[-4].val.opval)->op_private & OPpSLICEWARNING; + } ++ + break; + + case 183: +-#line 942 "perly.y" ++#line 954 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = op_prepend_elem(OP_KVHSLICE, + newOP(OP_PUSHMARK, 0), + newLISTOP(OP_KVHSLICE, 0, +- list((ps[(3) - (5)].val.opval)), +- ref((ps[(1) - (5)].val.opval), OP_KVHSLICE))); +- if ((yyval.opval) && (ps[(1) - (5)].val.opval)) ++ list((ps[-2].val.opval)), ++ ref((ps[-4].val.opval), OP_KVHSLICE))); ++ if ((yyval.opval) && (ps[-4].val.opval)) + (yyval.opval)->op_private |= +- (ps[(1) - (5)].val.opval)->op_private & OPpSLICEWARNING; ++ (ps[-4].val.opval)->op_private & OPpSLICEWARNING; + } ++ + break; + + case 184: +-#line 952 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 964 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 185: +-#line 954 "perly.y" +- { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[(1) - (1)].val.opval))); } ++#line 966 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[0].val.opval))); } ++ + break; + + case 186: +-#line 956 "perly.y" +- { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (3)].val.opval))); ++#line 968 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[-2].val.opval))); + } ++ + break; + + case 187: +-#line 959 "perly.y" ++#line 971 "perly.y" /* yacc.c:1646 */ + { + (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, +- op_append_elem(OP_LIST, (ps[(3) - (4)].val.opval), scalar((ps[(1) - (4)].val.opval)))); ++ op_append_elem(OP_LIST, (ps[-1].val.opval), scalar((ps[-3].val.opval)))); + } ++ + break; + + case 188: +-#line 964 "perly.y" ++#line 976 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, +- op_append_elem(OP_LIST, (ps[(3) - (3)].val.opval), scalar((ps[(2) - (3)].val.opval)))); ++ op_append_elem(OP_LIST, (ps[0].val.opval), scalar((ps[-1].val.opval)))); + } ++ + break; + + case 189: +-#line 968 "perly.y" +- { (yyval.opval) = newSVREF((ps[(1) - (4)].val.opval)); } ++#line 980 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newSVREF((ps[-3].val.opval)); } ++ + break; + + case 190: +-#line 970 "perly.y" +- { (yyval.opval) = newAVREF((ps[(1) - (4)].val.opval)); } ++#line 982 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newAVREF((ps[-3].val.opval)); } ++ + break; + + case 191: +-#line 972 "perly.y" +- { (yyval.opval) = newHVREF((ps[(1) - (4)].val.opval)); } ++#line 984 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newHVREF((ps[-3].val.opval)); } ++ + break; + + case 192: +-#line 974 "perly.y" ++#line 986 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, +- scalar(newCVREF((ps[(3) - (4)].val.ival),(ps[(1) - (4)].val.opval)))); } ++ scalar(newCVREF((ps[-1].val.ival),(ps[-3].val.opval)))); } ++ + break; + + case 193: +-#line 977 "perly.y" +- { (yyval.opval) = newGVREF(0,(ps[(1) - (4)].val.opval)); } ++#line 989 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newGVREF(0,(ps[-3].val.opval)); } ++ + break; + + case 194: +-#line 979 "perly.y" +- { (yyval.opval) = newOP((ps[(1) - (1)].val.ival), OPf_SPECIAL); ++#line 991 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newOP((ps[0].val.ival), OPf_SPECIAL); + PL_hints |= HINT_BLOCK_SCOPE; } ++ + break; + + case 195: +-#line 982 "perly.y" +- { (yyval.opval) = newLOOPEX((ps[(1) - (2)].val.ival),(ps[(2) - (2)].val.opval)); } ++#line 994 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newLOOPEX((ps[-1].val.ival),(ps[0].val.opval)); } ++ + break; + + case 196: +-#line 984 "perly.y" +- { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval))); } ++#line 996 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); } ++ + break; + + case 197: +-#line 986 "perly.y" +- { (yyval.opval) = newOP((ps[(1) - (1)].val.ival), 0); } ++#line 998 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newOP((ps[0].val.ival), 0); } ++ + break; + + case 198: +-#line 988 "perly.y" +- { (yyval.opval) = newUNOP((ps[(1) - (2)].val.ival), 0, (ps[(2) - (2)].val.opval)); } ++#line 1000 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); } ++ + break; + + case 199: +-#line 990 "perly.y" +- { (yyval.opval) = newUNOP((ps[(1) - (2)].val.ival), 0, (ps[(2) - (2)].val.opval)); } ++#line 1002 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); } ++ + break; + + case 200: +-#line 992 "perly.y" +- { (yyval.opval) = newOP(OP_REQUIRE, (ps[(1) - (1)].val.ival) ? OPf_SPECIAL : 0); } ++#line 1004 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newOP(OP_REQUIRE, (ps[0].val.ival) ? OPf_SPECIAL : 0); } ++ + break; + + case 201: +-#line 994 "perly.y" +- { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[(1) - (2)].val.ival) ? OPf_SPECIAL : 0, (ps[(2) - (2)].val.opval)); } ++#line 1006 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[-1].val.ival) ? OPf_SPECIAL : 0, (ps[0].val.opval)); } ++ + break; + + case 202: +-#line 996 "perly.y" +- { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (1)].val.opval))); } ++#line 1008 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); } ++ + break; + + case 203: +-#line 998 "perly.y" ++#line 1010 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, +- op_append_elem(OP_LIST, (ps[(2) - (2)].val.opval), scalar((ps[(1) - (2)].val.opval)))); } ++ op_append_elem(OP_LIST, (ps[0].val.opval), scalar((ps[-1].val.opval)))); } ++ + break; + + case 204: +-#line 1001 "perly.y" +- { (yyval.opval) = newOP((ps[(1) - (1)].val.ival), 0); } ++#line 1013 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newOP((ps[0].val.ival), 0); } ++ + break; + + case 205: +-#line 1003 "perly.y" +- { (yyval.opval) = newOP((ps[(1) - (3)].val.ival), 0);} ++#line 1015 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newOP((ps[-2].val.ival), 0);} ++ + break; + + case 206: +-#line 1005 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 1017 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 207: +-#line 1007 "perly.y" +- { (yyval.opval) = (ps[(1) - (3)].val.opval); } ++#line 1019 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[-2].val.opval); } ++ + break; + + case 208: +-#line 1009 "perly.y" +- { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (1)].val.opval))); } ++#line 1021 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); } ++ + break; + + case 209: +-#line 1011 "perly.y" +- { (yyval.opval) = ((ps[(1) - (3)].val.ival) == OP_NOT) +- ? newUNOP((ps[(1) - (3)].val.ival), 0, newSVOP(OP_CONST, 0, newSViv(0))) +- : newOP((ps[(1) - (3)].val.ival), OPf_SPECIAL); } ++#line 1023 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = ((ps[-2].val.ival) == OP_NOT) ++ ? newUNOP((ps[-2].val.ival), 0, newSVOP(OP_CONST, 0, newSViv(0))) ++ : newOP((ps[-2].val.ival), OPf_SPECIAL); } ++ + break; + + case 210: +-#line 1015 "perly.y" +- { (yyval.opval) = newUNOP((ps[(1) - (4)].val.ival), 0, (ps[(3) - (4)].val.opval)); } ++#line 1027 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newUNOP((ps[-3].val.ival), 0, (ps[-1].val.opval)); } ++ + break; + + case 211: +-#line 1017 "perly.y" ++#line 1029 "perly.y" /* yacc.c:1646 */ + { +- if ( (ps[(1) - (1)].val.opval)->op_type != OP_TRANS +- && (ps[(1) - (1)].val.opval)->op_type != OP_TRANSR +- && (((PMOP*)(ps[(1) - (1)].val.opval))->op_pmflags & PMf_HAS_CV)) ++ if ( (ps[0].val.opval)->op_type != OP_TRANS ++ && (ps[0].val.opval)->op_type != OP_TRANSR ++ && (((PMOP*)(ps[0].val.opval))->op_pmflags & PMf_HAS_CV)) + { + (yyval.ival) = start_subparse(FALSE, CVf_ANON); + SAVEFREESV(PL_compcv); + } else + (yyval.ival) = 0; + } ++ + break; + + case 212: +-#line 1028 "perly.y" +- { (yyval.opval) = pmruntime((ps[(1) - (6)].val.opval), (ps[(4) - (6)].val.opval), (ps[(5) - (6)].val.opval), 1, (ps[(2) - (6)].val.ival)); } ++#line 1040 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = pmruntime((ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), 1, (ps[-4].val.ival)); } ++ + break; + + case 215: +-#line 1032 "perly.y" ++#line 1044 "perly.y" /* yacc.c:1646 */ + { + (yyval.opval) = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0), + newSVOP(OP_CONST, 0, newSVpvs("Unimplemented"))); + } ++ + break; + + case 217: +-#line 1041 "perly.y" +- { (yyval.opval) = my_attrs((ps[(2) - (3)].val.opval),(ps[(3) - (3)].val.opval)); } ++#line 1053 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = my_attrs((ps[-1].val.opval),(ps[0].val.opval)); } ++ + break; + + case 218: +-#line 1043 "perly.y" +- { (yyval.opval) = localize((ps[(2) - (2)].val.opval),(ps[(1) - (2)].val.ival)); } ++#line 1055 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = localize((ps[0].val.opval),(ps[-1].val.ival)); } ++ + break; + + case 219: +-#line 1048 "perly.y" +- { (yyval.opval) = sawparens((ps[(2) - (3)].val.opval)); } ++#line 1060 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = sawparens((ps[-1].val.opval)); } ++ + break; + + case 220: +-#line 1050 "perly.y" ++#line 1062 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = sawparens(newNULLLIST()); } ++ + break; + + case 221: +-#line 1053 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 1065 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 222: +-#line 1055 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 1067 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 223: +-#line 1057 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 1069 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 224: +-#line 1062 "perly.y" ++#line 1074 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = (OP*)NULL; } ++ + break; + + case 225: +-#line 1064 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 1076 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 226: +-#line 1068 "perly.y" ++#line 1080 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = (OP*)NULL; } ++ + break; + + case 227: +-#line 1070 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 1082 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 228: +-#line 1074 "perly.y" ++#line 1086 "perly.y" /* yacc.c:1646 */ + { (yyval.opval) = (OP*)NULL; } ++ + break; + + case 229: +-#line 1076 "perly.y" +- { (yyval.opval) = (ps[(2) - (2)].val.opval); } ++#line 1088 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + + case 230: +-#line 1082 "perly.y" +- { parser->in_my = 0; (yyval.opval) = my((ps[(1) - (1)].val.opval)); } ++#line 1094 "perly.y" /* yacc.c:1646 */ ++ { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); } ++ + break; + + case 236: +-#line 1095 "perly.y" +- { (yyval.opval) = newCVREF((ps[(1) - (2)].val.ival),(ps[(2) - (2)].val.opval)); } ++#line 1107 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newCVREF((ps[-1].val.ival),(ps[0].val.opval)); } ++ + break; + + case 237: +-#line 1099 "perly.y" +- { (yyval.opval) = newSVREF((ps[(2) - (2)].val.opval)); } ++#line 1111 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newSVREF((ps[0].val.opval)); } ++ + break; + + case 238: +-#line 1103 "perly.y" +- { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval)); +- if ((yyval.opval)) (yyval.opval)->op_private |= (ps[(1) - (2)].val.ival); ++#line 1115 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newAVREF((ps[0].val.opval)); ++ if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival); + } ++ + break; + + case 239: +-#line 1109 "perly.y" +- { (yyval.opval) = newHVREF((ps[(2) - (2)].val.opval)); +- if ((yyval.opval)) (yyval.opval)->op_private |= (ps[(1) - (2)].val.ival); ++#line 1121 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newHVREF((ps[0].val.opval)); ++ if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival); + } ++ + break; + + case 240: +-#line 1115 "perly.y" +- { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval)); } ++#line 1127 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newAVREF((ps[0].val.opval)); } ++ + break; + + case 241: +-#line 1117 "perly.y" +- { (yyval.opval) = newAVREF((ps[(1) - (4)].val.opval)); } ++#line 1129 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newAVREF((ps[-3].val.opval)); } ++ + break; + + case 242: +-#line 1121 "perly.y" +- { (yyval.opval) = newGVREF(0,(ps[(2) - (2)].val.opval)); } ++#line 1133 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newGVREF(0,(ps[0].val.opval)); } ++ + break; + + case 244: +-#line 1126 "perly.y" +- { (yyval.opval) = newAVREF((ps[(1) - (3)].val.opval)); } ++#line 1138 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newAVREF((ps[-2].val.opval)); } ++ + break; + + case 246: +-#line 1131 "perly.y" +- { (yyval.opval) = newHVREF((ps[(1) - (3)].val.opval)); } ++#line 1143 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newHVREF((ps[-2].val.opval)); } ++ + break; + + case 248: +-#line 1136 "perly.y" +- { (yyval.opval) = newGVREF(0,(ps[(1) - (3)].val.opval)); } ++#line 1148 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = newGVREF(0,(ps[-2].val.opval)); } ++ + break; + + case 249: +-#line 1141 "perly.y" +- { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); } ++#line 1153 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = scalar((ps[0].val.opval)); } ++ + break; + + case 250: +-#line 1143 "perly.y" +- { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); } ++#line 1155 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = scalar((ps[0].val.opval)); } ++ + break; + + case 251: +-#line 1145 "perly.y" +- { (yyval.opval) = op_scope((ps[(1) - (1)].val.opval)); } ++#line 1157 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = op_scope((ps[0].val.opval)); } ++ + break; + + case 252: +-#line 1148 "perly.y" +- { (yyval.opval) = (ps[(1) - (1)].val.opval); } ++#line 1160 "perly.y" /* yacc.c:1646 */ ++ { (yyval.opval) = (ps[0].val.opval); } ++ + break; + ++ ++ + default: break; + + + /* Generated from: +- * 703ebd267cf8ca45f9dee9bc0f4b21511117a0c1dca1c8bc9438ce91950217ae perly.y ++ * 4fd37fdbff6285ba6e9096c2229255ecc6264d2f26835e535cf1c38f387ceae6 perly.y + * a4923588f219644801577c514014847e1e5240f49413fa3b89d3306fa4874d07 regen_perly.pl + * ex: set ro: */ +diff --git a/perly.h b/perly.h +index acbdaae..4ecd16e 100644 +--- a/perly.h ++++ b/perly.h +@@ -1,28 +1,28 @@ + /* -*- buffer-read-only: t -*- + !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +- This file is built by regen_perly.pl from perly.y. ++ This file is built by ./regen_perly.pl from perly.y. + Any changes made here will be lost! + */ + +-#define PERL_BISON_VERSION 20007 ++#define PERL_BISON_VERSION 30000 + + #ifdef PERL_CORE +-/* A Bison parser, made by GNU Bison 2.7. */ ++/* A Bison parser, made by GNU Bison 3.0.4. */ + + /* Bison interface for Yacc-like parsers in C +- +- Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc. +- ++ ++ Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. ++ + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. +- ++ + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. +- ++ + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +@@ -35,11 +35,11 @@ + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. +- ++ + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +-/* Enabling traces. */ ++/* Debug traces. */ + #ifndef YYDEBUG + # define YYDEBUG 0 + #endif +@@ -47,178 +47,95 @@ + extern int yydebug; + #endif + +-/* Tokens. */ ++/* Token type. */ + #ifndef YYTOKENTYPE + # define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- GRAMPROG = 258, +- GRAMEXPR = 259, +- GRAMBLOCK = 260, +- GRAMBARESTMT = 261, +- GRAMFULLSTMT = 262, +- GRAMSTMTSEQ = 263, +- WORD = 264, +- METHOD = 265, +- FUNCMETH = 266, +- THING = 267, +- PMFUNC = 268, +- PRIVATEREF = 269, +- QWLIST = 270, +- FUNC0OP = 271, +- FUNC0SUB = 272, +- UNIOPSUB = 273, +- LSTOPSUB = 274, +- PLUGEXPR = 275, +- PLUGSTMT = 276, +- LABEL = 277, +- FORMAT = 278, +- SUB = 279, +- ANONSUB = 280, +- PACKAGE = 281, +- USE = 282, +- WHILE = 283, +- UNTIL = 284, +- IF = 285, +- UNLESS = 286, +- ELSE = 287, +- ELSIF = 288, +- CONTINUE = 289, +- FOR = 290, +- GIVEN = 291, +- WHEN = 292, +- DEFAULT = 293, +- LOOPEX = 294, +- DOTDOT = 295, +- YADAYADA = 296, +- FUNC0 = 297, +- FUNC1 = 298, +- FUNC = 299, +- UNIOP = 300, +- LSTOP = 301, +- RELOP = 302, +- EQOP = 303, +- MULOP = 304, +- ADDOP = 305, +- DOLSHARP = 306, +- DO = 307, +- HASHBRACK = 308, +- NOAMP = 309, +- LOCAL = 310, +- MY = 311, +- REQUIRE = 312, +- COLONATTR = 313, +- FORMLBRACK = 314, +- FORMRBRACK = 315, +- PREC_LOW = 316, +- DOROP = 317, +- OROP = 318, +- ANDOP = 319, +- NOTOP = 320, +- ASSIGNOP = 321, +- DORDOR = 322, +- OROR = 323, +- ANDAND = 324, +- BITOROP = 325, +- BITANDOP = 326, +- SHIFTOP = 327, +- MATCHOP = 328, +- REFGEN = 329, +- UMINUS = 330, +- POWOP = 331, +- POSTJOIN = 332, +- POSTDEC = 333, +- POSTINC = 334, +- PREDEC = 335, +- PREINC = 336, +- ARROW = 337 +- }; ++ enum yytokentype ++ { ++ GRAMPROG = 258, ++ GRAMEXPR = 259, ++ GRAMBLOCK = 260, ++ GRAMBARESTMT = 261, ++ GRAMFULLSTMT = 262, ++ GRAMSTMTSEQ = 263, ++ WORD = 264, ++ METHOD = 265, ++ FUNCMETH = 266, ++ THING = 267, ++ PMFUNC = 268, ++ PRIVATEREF = 269, ++ QWLIST = 270, ++ FUNC0OP = 271, ++ FUNC0SUB = 272, ++ UNIOPSUB = 273, ++ LSTOPSUB = 274, ++ PLUGEXPR = 275, ++ PLUGSTMT = 276, ++ LABEL = 277, ++ FORMAT = 278, ++ SUB = 279, ++ ANONSUB = 280, ++ PACKAGE = 281, ++ USE = 282, ++ WHILE = 283, ++ UNTIL = 284, ++ IF = 285, ++ UNLESS = 286, ++ ELSE = 287, ++ ELSIF = 288, ++ CONTINUE = 289, ++ FOR = 290, ++ GIVEN = 291, ++ WHEN = 292, ++ DEFAULT = 293, ++ LOOPEX = 294, ++ DOTDOT = 295, ++ YADAYADA = 296, ++ FUNC0 = 297, ++ FUNC1 = 298, ++ FUNC = 299, ++ UNIOP = 300, ++ LSTOP = 301, ++ RELOP = 302, ++ EQOP = 303, ++ MULOP = 304, ++ ADDOP = 305, ++ DOLSHARP = 306, ++ DO = 307, ++ HASHBRACK = 308, ++ NOAMP = 309, ++ LOCAL = 310, ++ MY = 311, ++ REQUIRE = 312, ++ COLONATTR = 313, ++ FORMLBRACK = 314, ++ FORMRBRACK = 315, ++ PREC_LOW = 316, ++ OROP = 317, ++ DOROP = 318, ++ ANDOP = 319, ++ NOTOP = 320, ++ ASSIGNOP = 321, ++ OROR = 322, ++ DORDOR = 323, ++ ANDAND = 324, ++ BITOROP = 325, ++ BITANDOP = 326, ++ SHIFTOP = 327, ++ MATCHOP = 328, ++ UMINUS = 329, ++ REFGEN = 330, ++ POWOP = 331, ++ PREINC = 332, ++ PREDEC = 333, ++ POSTINC = 334, ++ POSTDEC = 335, ++ POSTJOIN = 336, ++ ARROW = 337 ++ }; + #endif + +-/* Tokens. */ +-#define GRAMPROG 258 +-#define GRAMEXPR 259 +-#define GRAMBLOCK 260 +-#define GRAMBARESTMT 261 +-#define GRAMFULLSTMT 262 +-#define GRAMSTMTSEQ 263 +-#define WORD 264 +-#define METHOD 265 +-#define FUNCMETH 266 +-#define THING 267 +-#define PMFUNC 268 +-#define PRIVATEREF 269 +-#define QWLIST 270 +-#define FUNC0OP 271 +-#define FUNC0SUB 272 +-#define UNIOPSUB 273 +-#define LSTOPSUB 274 +-#define PLUGEXPR 275 +-#define PLUGSTMT 276 +-#define LABEL 277 +-#define FORMAT 278 +-#define SUB 279 +-#define ANONSUB 280 +-#define PACKAGE 281 +-#define USE 282 +-#define WHILE 283 +-#define UNTIL 284 +-#define IF 285 +-#define UNLESS 286 +-#define ELSE 287 +-#define ELSIF 288 +-#define CONTINUE 289 +-#define FOR 290 +-#define GIVEN 291 +-#define WHEN 292 +-#define DEFAULT 293 +-#define LOOPEX 294 +-#define DOTDOT 295 +-#define YADAYADA 296 +-#define FUNC0 297 +-#define FUNC1 298 +-#define FUNC 299 +-#define UNIOP 300 +-#define LSTOP 301 +-#define RELOP 302 +-#define EQOP 303 +-#define MULOP 304 +-#define ADDOP 305 +-#define DOLSHARP 306 +-#define DO 307 +-#define HASHBRACK 308 +-#define NOAMP 309 +-#define LOCAL 310 +-#define MY 311 +-#define REQUIRE 312 +-#define COLONATTR 313 +-#define FORMLBRACK 314 +-#define FORMRBRACK 315 +-#define PREC_LOW 316 +-#define DOROP 317 +-#define OROP 318 +-#define ANDOP 319 +-#define NOTOP 320 +-#define ASSIGNOP 321 +-#define DORDOR 322 +-#define OROR 323 +-#define ANDAND 324 +-#define BITOROP 325 +-#define BITANDOP 326 +-#define SHIFTOP 327 +-#define MATCHOP 328 +-#define REFGEN 329 +-#define UMINUS 330 +-#define POWOP 331 +-#define POSTJOIN 332 +-#define POSTDEC 333 +-#define POSTINC 334 +-#define PREDEC 335 +-#define PREINC 336 +-#define ARROW 337 +- +- ++/* Value type. */ + #ifdef PERL_IN_TOKE_C + static bool + S_is_opval_token(int type) { +@@ -243,9 +160,9 @@ S_is_opval_token(int type) { + #endif /* PERL_IN_TOKE_C */ + #endif /* PERL_CORE */ + #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +-typedef union YYSTYPE ++ ++union YYSTYPE + { +-/* Line 2058 of yacc.c */ + + I32 ival; /* __DEFAULT__ (marker for regen_perly.pl; + must always be 1st union member) */ +@@ -253,31 +170,19 @@ typedef union YYSTYPE + OP *opval; + GV *gvval; + ++}; + +-/* Line 2058 of yacc.c */ +-} YYSTYPE; ++typedef union YYSTYPE YYSTYPE; + # define YYSTYPE_IS_TRIVIAL 1 +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ + # define YYSTYPE_IS_DECLARED 1 + #endif + + +-#ifdef YYPARSE_PARAM +-#if defined __STDC__ || defined __cplusplus +-int yyparse (void *YYPARSE_PARAM); +-#else +-int yyparse (); +-#endif +-#else /* ! YYPARSE_PARAM */ +-#if defined __STDC__ || defined __cplusplus ++ + int yyparse (void); +-#else +-int yyparse (); +-#endif +-#endif /* ! YYPARSE_PARAM */ + + + /* Generated from: +- * 703ebd267cf8ca45f9dee9bc0f4b21511117a0c1dca1c8bc9438ce91950217ae perly.y ++ * 4fd37fdbff6285ba6e9096c2229255ecc6264d2f26835e535cf1c38f387ceae6 perly.y + * a4923588f219644801577c514014847e1e5240f49413fa3b89d3306fa4874d07 regen_perly.pl + * ex: set ro: */ +diff --git a/perly.tab b/perly.tab +index f5a9580..ac88c85 100644 +--- a/perly.tab ++++ b/perly.tab +@@ -1,12 +1,12 @@ + /* -*- buffer-read-only: t -*- + !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +- This file is built by regen_perly.pl from perly.y. ++ This file is built by ./regen_perly.pl from perly.y. + Any changes made here will be lost! + */ + + #define YYFINAL 14 + /* YYLAST -- Last index in YYTABLE. */ +-#define YYLAST 2913 ++#define YYLAST 2896 + + /* YYNTOKENS -- Number of terminals. */ + #define YYNTOKENS 105 +@@ -14,17 +14,19 @@ + #define YYNNTS 77 + /* YYNRULES -- Number of rules. */ + #define YYNRULES 252 +-/* YYNRULES -- Number of states. */ ++/* YYNSTATES -- Number of states. */ + #define YYNSTATES 508 + +-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ ++/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned ++ by yylex, with out-of-bounds checking. */ + #define YYUNDEFTOK 2 + #define YYMAXUTOK 337 + +-#define YYTRANSLATE(YYX) \ ++#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ ++/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM ++ as returned by yylex, without out-of-bounds checking. */ + static const yytype_uint8 yytranslate[] = + { + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, +@@ -64,133 +66,7 @@ static const yytype_uint8 yytranslate[] = + }; + + #if YYDEBUG +-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in +- YYRHS. */ +-static const yytype_uint16 yyprhs[] = +-{ +- 0, 0, 3, 4, 9, 10, 14, 15, 19, 20, +- 24, 25, 29, 30, 34, 39, 47, 48, 53, 54, +- 55, 58, 59, 62, 64, 66, 69, 72, 74, 79, +- 80, 88, 89, 100, 105, 106, 114, 122, 130, 137, +- 144, 147, 156, 165, 166, 167, 181, 191, 200, 201, +- 213, 223, 231, 234, 235, 244, 247, 249, 252, 253, +- 257, 259, 261, 265, 269, 273, 277, 281, 285, 286, +- 289, 296, 297, 300, 301, 302, 304, 305, 307, 309, +- 311, 313, 315, 316, 317, 318, 319, 321, 323, 324, +- 326, 327, 330, 332, 335, 337, 338, 342, 344, 346, +- 350, 354, 358, 360, 363, 367, 369, 373, 379, 386, +- 390, 394, 400, 403, 408, 409, 415, 417, 419, 425, +- 430, 436, 441, 447, 454, 460, 465, 471, 476, 480, +- 487, 492, 498, 502, 506, 510, 514, 518, 522, 526, +- 530, 534, 538, 542, 546, 550, 554, 557, 560, 563, +- 566, 569, 572, 575, 578, 581, 585, 588, 593, 597, +- 603, 612, 615, 618, 620, 622, 624, 626, 632, 635, +- 637, 640, 644, 646, 649, 651, 653, 655, 657, 659, +- 661, 666, 671, 677, 683, 685, 687, 691, 696, 700, +- 705, 710, 715, 720, 725, 727, 730, 733, 735, 738, +- 741, 743, 746, 748, 751, 753, 757, 759, 763, 765, +- 769, 774, 775, 782, 784, 786, 788, 790, 794, 797, +- 801, 804, 806, 808, 810, 811, 813, 814, 816, 817, +- 820, 822, 824, 826, 828, 830, 832, 835, 838, 841, +- 844, 847, 852, 855, 857, 861, 863, 867, 869, 873, +- 875, 877, 879 +-}; +- +-/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +-static const yytype_int16 yyrhs[] = +-{ +- 106, 0, -1, -1, 3, 107, 115, 118, -1, -1, +- 4, 108, 167, -1, -1, 5, 109, 113, -1, -1, +- 6, 110, 122, -1, -1, 7, 111, 120, -1, -1, +- 8, 112, 118, -1, 9, 115, 118, 10, -1, 18, +- 115, 101, 71, 119, 101, 19, -1, -1, 9, 117, +- 118, 10, -1, -1, -1, 118, 120, -1, -1, 119, +- 130, -1, 122, -1, 121, -1, 33, 122, -1, 33, +- 121, -1, 32, -1, 34, 144, 141, 114, -1, -1, +- 35, 145, 142, 123, 146, 147, 151, -1, -1, 35, +- 145, 142, 124, 115, 149, 147, 9, 118, 10, -1, +- 37, 20, 20, 101, -1, -1, 38, 142, 125, 20, +- 20, 166, 101, -1, 41, 100, 115, 139, 99, 116, +- 133, -1, 42, 100, 115, 139, 99, 116, 133, -1, +- 47, 100, 115, 139, 99, 116, -1, 48, 100, 115, +- 139, 99, 116, -1, 49, 113, -1, 39, 100, 115, +- 137, 99, 135, 116, 134, -1, 40, 100, 115, 138, +- 99, 135, 116, 134, -1, -1, -1, 46, 100, 115, +- 140, 101, 126, 137, 101, 127, 135, 140, 99, 116, +- -1, 46, 67, 115, 169, 100, 139, 99, 116, 134, +- -1, 46, 173, 100, 115, 139, 99, 116, 134, -1, +- -1, 46, 90, 67, 115, 170, 128, 100, 139, 99, +- 116, 134, -1, 46, 90, 171, 100, 115, 139, 99, +- 116, 134, -1, 46, 100, 115, 139, 99, 116, 134, +- -1, 113, 134, -1, -1, 37, 20, 20, 9, 115, +- 129, 118, 10, -1, 132, 101, -1, 101, -1, 23, +- 131, -1, -1, 70, 118, 71, -1, 1, -1, 152, +- -1, 152, 41, 152, -1, 152, 42, 152, -1, 152, +- 39, 152, -1, 152, 40, 138, -1, 152, 46, 152, +- -1, 152, 48, 152, -1, -1, 43, 116, -1, 44, +- 100, 139, 99, 116, 133, -1, -1, 45, 113, -1, +- -1, -1, 132, -1, -1, 152, -1, 152, -1, 152, +- -1, 136, -1, 20, -1, -1, -1, -1, -1, 20, +- -1, 25, -1, -1, 23, -1, -1, 69, 23, -1, +- 69, -1, 69, 23, -1, 69, -1, -1, 100, 150, +- 99, -1, 113, -1, 101, -1, 152, 75, 152, -1, +- 152, 74, 152, -1, 152, 73, 152, -1, 153, -1, +- 153, 77, -1, 153, 77, 162, -1, 162, -1, 57, +- 181, 153, -1, 55, 100, 181, 152, 99, -1, 162, +- 98, 156, 100, 167, 99, -1, 162, 98, 156, -1, +- 21, 181, 166, -1, 22, 181, 100, 167, 99, -1, +- 57, 166, -1, 55, 100, 167, 99, -1, -1, 30, +- 143, 113, 155, 166, -1, 21, -1, 173, -1, 180, +- 9, 152, 101, 10, -1, 173, 11, 152, 12, -1, +- 162, 98, 11, 152, 12, -1, 157, 11, 152, 12, +- -1, 173, 9, 152, 101, 10, -1, 162, 98, 9, +- 152, 101, 10, -1, 157, 9, 152, 101, 10, -1, +- 162, 98, 100, 99, -1, 162, 98, 100, 152, 99, +- -1, 157, 100, 152, 99, -1, 157, 100, 99, -1, +- 100, 152, 99, 11, 152, 12, -1, 26, 11, 152, +- 12, -1, 100, 99, 11, 152, 12, -1, 162, 78, +- 162, -1, 162, 92, 162, -1, 162, 60, 162, -1, +- 162, 61, 162, -1, 162, 86, 162, -1, 162, 58, +- 162, -1, 162, 59, 162, -1, 162, 85, 162, -1, +- 162, 84, 162, -1, 162, 51, 162, -1, 162, 83, +- 162, -1, 162, 82, 162, -1, 162, 81, 162, -1, +- 162, 87, 162, -1, 13, 162, -1, 14, 162, -1, +- 88, 162, -1, 89, 162, -1, 162, 95, -1, 162, +- 94, -1, 162, 93, -1, 97, 162, -1, 96, 162, +- -1, 11, 152, 12, -1, 11, 12, -1, 64, 152, +- 101, 10, -1, 64, 101, 10, -1, 36, 143, 146, +- 147, 113, -1, 36, 143, 115, 149, 147, 9, 118, +- 10, -1, 63, 162, -1, 63, 113, -1, 158, -1, +- 159, -1, 160, -1, 161, -1, 162, 79, 162, 80, +- 162, -1, 90, 162, -1, 164, -1, 66, 162, -1, +- 100, 152, 99, -1, 26, -1, 100, 99, -1, 173, +- -1, 177, -1, 175, -1, 174, -1, 176, -1, 157, +- -1, 178, 11, 152, 12, -1, 179, 11, 152, 12, +- -1, 178, 9, 152, 101, 10, -1, 179, 9, 152, +- 101, 10, -1, 23, -1, 172, -1, 172, 100, 99, +- -1, 172, 100, 152, 99, -1, 65, 145, 166, -1, +- 162, 98, 102, 103, -1, 162, 98, 15, 103, -1, +- 162, 98, 16, 103, -1, 162, 98, 17, 103, -1, +- 162, 98, 103, 103, -1, 50, -1, 50, 162, -1, +- 76, 153, -1, 56, -1, 56, 113, -1, 56, 162, +- -1, 68, -1, 68, 162, -1, 29, -1, 29, 162, +- -1, 53, -1, 53, 100, 99, -1, 27, -1, 27, +- 100, 99, -1, 28, -1, 54, 100, 99, -1, 54, +- 100, 152, 99, -1, -1, 24, 163, 100, 153, 168, +- 99, -1, 20, -1, 154, -1, 52, -1, 31, -1, +- 67, 165, 148, -1, 67, 165, -1, 100, 152, 99, +- -1, 100, 99, -1, 173, -1, 175, -1, 174, -1, +- -1, 153, -1, -1, 152, -1, -1, 104, 152, -1, +- 173, -1, 173, -1, 174, -1, 175, -1, 170, -1, +- 172, -1, 17, 181, -1, 102, 181, -1, 15, 181, +- -1, 16, 181, -1, 62, 181, -1, 162, 98, 62, +- 103, -1, 103, 181, -1, 174, -1, 162, 98, 15, +- -1, 175, -1, 162, 98, 16, -1, 177, -1, 162, +- 98, 103, -1, 20, -1, 173, -1, 113, -1, 25, +- -1 +-}; +- +-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ ++ /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ + static const yytype_uint16 yyrline[] = + { + 0, 115, 115, 114, 125, 124, 134, 133, 146, 145, +@@ -205,20 +81,20 @@ static const yytype_uint16 yyrline[] = + 617, 618, 620, 625, 627, 633, 632, 651, 652, 656, + 658, 660, 662, 666, 668, 673, 677, 681, 685, 691, + 696, 702, 708, 710, 713, 712, 723, 724, 728, 732, +- 735, 740, 745, 748, 752, 756, 759, 764, 768, 771, +- 773, 775, 780, 782, 784, 789, 791, 793, 795, 797, +- 799, 801, 803, 805, 807, 809, 814, 816, 819, 821, +- 823, 826, 829, 840, 843, 850, 852, 854, 856, 858, +- 861, 875, 877, 881, 882, 883, 884, 885, 887, 889, +- 891, 893, 895, 897, 899, 901, 903, 905, 907, 909, +- 911, 921, 931, 941, 951, 953, 955, 958, 963, 967, +- 969, 971, 973, 976, 978, 981, 983, 985, 987, 989, +- 991, 993, 995, 997, 1000, 1002, 1004, 1006, 1008, 1010, +- 1014, 1017, 1016, 1029, 1030, 1031, 1036, 1040, 1042, 1047, +- 1049, 1052, 1054, 1056, 1061, 1063, 1068, 1069, 1074, 1075, +- 1081, 1085, 1086, 1087, 1090, 1091, 1094, 1098, 1102, 1108, +- 1114, 1116, 1120, 1124, 1125, 1129, 1130, 1134, 1135, 1140, +- 1142, 1144, 1147 ++ 735, 740, 745, 748, 752, 756, 762, 770, 777, 783, ++ 785, 787, 792, 794, 796, 801, 803, 805, 807, 809, ++ 811, 813, 815, 817, 819, 821, 826, 828, 831, 833, ++ 835, 838, 841, 852, 855, 862, 864, 866, 868, 870, ++ 873, 887, 889, 893, 894, 895, 896, 897, 899, 901, ++ 903, 905, 907, 909, 911, 913, 915, 917, 919, 921, ++ 923, 933, 943, 953, 963, 965, 967, 970, 975, 979, ++ 981, 983, 985, 988, 990, 993, 995, 997, 999, 1001, ++ 1003, 1005, 1007, 1009, 1012, 1014, 1016, 1018, 1020, 1022, ++ 1026, 1029, 1028, 1041, 1042, 1043, 1048, 1052, 1054, 1059, ++ 1061, 1064, 1066, 1068, 1073, 1075, 1080, 1081, 1086, 1087, ++ 1093, 1097, 1098, 1099, 1102, 1103, 1106, 1110, 1114, 1120, ++ 1126, 1128, 1132, 1136, 1137, 1141, 1142, 1146, 1147, 1152, ++ 1154, 1156, 1159 + }; + #endif + +@@ -237,10 +113,10 @@ static const char *const yytname[] = + "LOOPEX", "DOTDOT", "YADAYADA", "FUNC0", "FUNC1", "FUNC", "UNIOP", + "LSTOP", "RELOP", "EQOP", "MULOP", "ADDOP", "DOLSHARP", "DO", + "HASHBRACK", "NOAMP", "LOCAL", "MY", "REQUIRE", "COLONATTR", +- "FORMLBRACK", "FORMRBRACK", "PREC_LOW", "DOROP", "OROP", "ANDOP", +- "NOTOP", "','", "ASSIGNOP", "'?'", "':'", "DORDOR", "OROR", "ANDAND", +- "BITOROP", "BITANDOP", "SHIFTOP", "MATCHOP", "'!'", "'~'", "REFGEN", +- "UMINUS", "POWOP", "POSTJOIN", "POSTDEC", "POSTINC", "PREDEC", "PREINC", ++ "FORMLBRACK", "FORMRBRACK", "PREC_LOW", "OROP", "DOROP", "ANDOP", ++ "NOTOP", "','", "ASSIGNOP", "'?'", "':'", "OROR", "DORDOR", "ANDAND", ++ "BITOROP", "BITANDOP", "SHIFTOP", "MATCHOP", "'!'", "'~'", "UMINUS", ++ "REFGEN", "POWOP", "PREINC", "PREDEC", "POSTINC", "POSTDEC", "POSTJOIN", + "ARROW", "')'", "'('", "';'", "'$'", "'*'", "'/'", "$accept", "grammar", + "$@1", "$@2", "$@3", "$@4", "$@5", "$@6", "block", "formblock", + "remember", "mblock", "mremember", "stmtseq", "formstmtseq", "fullstmt", +@@ -253,13 +129,13 @@ static const char *const yytname[] = + "anonymous", "termdo", "term", "@16", "myattrterm", "myterm", + "optlistexpr", "optexpr", "optrepl", "my_scalar", "my_var", + "refgen_topic", "amper", "scalar", "ary", "hsh", "arylen", "star", +- "sliceme", "kvslice", "gelem", "indirob", YY_NULL ++ "sliceme", "kvslice", "gelem", "indirob", YY_NULLPTR + }; + #endif + + # ifdef YYPRINT +-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to +- token YYLEX-NUM. */ ++/* YYTOKNUM[NUM] -- (External) token number corresponding to the ++ (internal) symbol number NUM (which must be that of a token). */ + static const yytype_uint16 yytoknum[] = + { + 0, 256, 257, 258, 259, 260, 261, 262, 263, 123, +@@ -276,71 +152,76 @@ static const yytype_uint16 yytoknum[] = + }; + # endif + +-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +-static const yytype_uint8 yyr1[] = +-{ +- 0, 105, 107, 106, 108, 106, 109, 106, 110, 106, +- 111, 106, 112, 106, 113, 114, 115, 116, 117, 118, +- 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, +- 122, 124, 122, 122, 125, 122, 122, 122, 122, 122, +- 122, 122, 122, 126, 127, 122, 122, 122, 128, 122, +- 122, 122, 122, 129, 122, 122, 122, 130, 131, 131, +- 132, 132, 132, 132, 132, 132, 132, 132, 133, 133, +- 133, 134, 134, 135, 136, 136, 137, 137, 138, 139, +- 140, 141, 141, 142, 143, 144, 145, 145, 146, 146, +- 147, 147, 147, 148, 148, 150, 149, 151, 151, 152, +- 152, 152, 152, 153, 153, 153, 154, 154, 154, 154, +- 154, 154, 154, 154, 155, 154, 156, 156, 157, 157, +- 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, +- 157, 157, 158, 158, 158, 158, 158, 158, 158, 158, +- 158, 158, 158, 158, 158, 158, 159, 159, 159, 159, +- 159, 159, 159, 159, 159, 160, 160, 160, 160, 160, +- 160, 161, 161, 162, 162, 162, 162, 162, 162, 162, +- 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +- 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +- 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +- 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, +- 162, 163, 162, 162, 162, 162, 162, 164, 164, 165, +- 165, 165, 165, 165, 166, 166, 167, 167, 168, 168, +- 169, 170, 170, 170, 171, 171, 172, 173, 174, 175, +- 176, 176, 177, 178, 178, 179, 179, 180, 180, 181, +- 181, 181, 181 +-}; ++#define YYPACT_NINF -400 + +-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +-static const yytype_uint8 yyr2[] = ++#define yypact_value_is_default(Yystate) \ ++ (!!((Yystate) == (-400))) ++ ++#define YYTABLE_NINF -248 ++ ++#define yytable_value_is_error(Yytable_value) \ ++ (!!((Yytable_value) == (-248))) ++ ++ /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing ++ STATE-NUM. */ ++static const yytype_int16 yypact[] = + { +- 0, 2, 0, 4, 0, 3, 0, 3, 0, 3, +- 0, 3, 0, 3, 4, 7, 0, 4, 0, 0, +- 2, 0, 2, 1, 1, 2, 2, 1, 4, 0, +- 7, 0, 10, 4, 0, 7, 7, 7, 6, 6, +- 2, 8, 8, 0, 0, 13, 9, 8, 0, 11, +- 9, 7, 2, 0, 8, 2, 1, 2, 0, 3, +- 1, 1, 3, 3, 3, 3, 3, 3, 0, 2, +- 6, 0, 2, 0, 0, 1, 0, 1, 1, 1, +- 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, +- 0, 2, 1, 2, 1, 0, 3, 1, 1, 3, +- 3, 3, 1, 2, 3, 1, 3, 5, 6, 3, +- 3, 5, 2, 4, 0, 5, 1, 1, 5, 4, +- 5, 4, 5, 6, 5, 4, 5, 4, 3, 6, +- 4, 5, 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 3, 2, 4, 3, 5, +- 8, 2, 2, 1, 1, 1, 1, 5, 2, 1, +- 2, 3, 1, 2, 1, 1, 1, 1, 1, 1, +- 4, 4, 5, 5, 1, 1, 3, 4, 3, 4, +- 4, 4, 4, 4, 1, 2, 2, 1, 2, 2, +- 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, +- 4, 0, 6, 1, 1, 1, 1, 3, 2, 3, +- 2, 1, 1, 1, 0, 1, 0, 1, 0, 2, +- 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, +- 2, 4, 2, 1, 3, 1, 3, 1, 3, 1, +- 1, 1, 1 ++ 365, -400, -400, -400, -400, -400, -400, 73, -400, 2688, ++ 78, 1473, 1378, -400, -400, -400, 1944, 2688, 2688, 49, ++ 49, 49, -400, 49, 49, -400, -400, 68, -8, -400, ++ 2688, -400, -400, -400, 2688, -400, -3, 8, 11, 1851, ++ 1756, 49, 1851, 2037, 22, 2688, 1, 2688, 2688, 2688, ++ 2688, 2688, 2688, 2688, 2130, 49, 49, -19, 14, -400, ++ 9, -400, -400, -400, -400, 2756, -400, -400, 24, 67, ++ 72, 106, -400, 105, 118, 165, 109, -400, -400, -400, ++ -400, -400, 22, 111, -400, 39, 50, 62, 65, -14, ++ 69, 77, 78, -400, 87, -400, 48, 506, 1378, -400, ++ -400, -400, 618, 713, -400, 70, 398, 398, -400, -400, ++ -400, -400, -400, -400, -400, 2688, 95, 96, 2688, 102, ++ 368, 78, 16, 2756, 107, 2223, 1756, -400, 368, 516, ++ 14, -400, 440, 2688, -400, -400, 368, 195, 93, -400, ++ -400, 2688, 368, 2316, 150, -400, -400, -400, 368, 14, ++ 398, 398, 398, 414, 414, 210, 152, -400, -400, 2688, ++ 2688, 2688, 2688, 2688, 2688, 2409, 2688, 2688, 2688, 2688, ++ 2688, 2688, 2688, 2688, 2688, 2688, 2688, 2688, 2688, 2688, ++ 2688, -400, -400, -400, 131, 2502, 2688, 2688, 2688, 2688, ++ 2688, 2688, 2688, -400, 200, -400, 223, -400, -400, -400, ++ -400, -400, -400, 55, -400, 146, -400, -400, -400, 78, ++ -400, -400, 2688, 2688, 2688, 2688, 2688, 2688, -400, -400, ++ -400, -400, -400, 2688, 2688, 98, -400, -400, -400, 148, ++ 160, -400, -400, 163, 151, 2688, 14, -400, 239, -400, ++ -400, 292, 232, -400, 2688, 245, 192, 192, -400, 2756, ++ 209, 125, -400, 531, 1555, 473, 1927, 349, 203, 2756, ++ 2714, 1647, 1647, 1741, 1836, 2020, 410, 398, 398, 2688, ++ 2688, 170, 172, 182, -400, 183, 2595, 32, 184, 168, ++ -400, -400, 588, 249, 129, 273, 141, 278, 149, 357, ++ 808, -400, 252, 189, -6, 276, 2688, 2688, 2688, 2688, ++ 205, -400, -400, 197, -400, -400, -400, -400, 1567, -400, ++ 2688, 2688, -400, -19, -400, -19, -19, -19, -19, -19, ++ 217, -29, -400, 2688, -400, 160, 279, 78, -400, -400, ++ 603, -400, -400, -400, 167, 2688, 298, -400, -400, 2688, ++ 509, 179, -400, -400, -400, -400, -400, 616, -400, -400, ++ 2688, -400, 299, -400, 308, -400, 319, -400, 328, -400, ++ -400, -400, 316, -400, -400, -400, 322, 244, -19, 250, ++ 257, -19, 258, 262, -400, 21, -400, -400, -400, 259, ++ 275, 286, 2688, 264, 281, -400, 2688, 284, -400, 287, ++ 378, -400, -400, -400, -400, 185, -400, 2798, 380, -400, ++ -400, 289, -400, -400, -400, -400, 291, 160, 148, -400, ++ 2688, -400, -400, 399, 399, 2688, -400, 2688, 399, -400, ++ 318, 399, 399, -19, -400, -400, -400, -400, -400, -400, ++ 344, 6, 160, -400, 320, 399, 399, -400, 18, 18, ++ 321, 323, 325, 87, 2688, 399, -400, -400, 903, -400, ++ -400, -400, -400, 424, 998, -400, 87, 87, -400, 399, ++ 334, -400, -400, 399, 2688, 399, -400, 336, 87, -400, ++ 3, -400, -400, -400, -400, 1093, -400, 2688, 87, 343, ++ 87, -400, -400, 383, 438, -400, 1188, -400, 362, -400, ++ 399, -400, -400, -400, -400, -400, -400, 399, 87, 1661, ++ 1283, 18, -400, 363, -400, -400, 399, -400 + }; + +-/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. +- Performed when YYTABLE doesn't specify something else to do. Zero +- means the default is an error. */ ++ /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. ++ Performed when YYTABLE does not specify something else to do. Zero ++ means the default is an error. */ + static const yytype_uint8 yydefact[] = + { + 0, 2, 4, 6, 8, 10, 12, 0, 16, 226, +@@ -358,18 +239,18 @@ static const yytype_uint8 yydefact[] = + 203, 0, 88, 195, 0, 0, 226, 198, 199, 249, + 225, 112, 250, 0, 240, 162, 161, 0, 0, 86, + 87, 224, 170, 0, 218, 221, 223, 222, 201, 196, +- 148, 149, 168, 154, 153, 173, 0, 237, 242, 0, ++ 148, 149, 168, 153, 154, 173, 0, 237, 242, 0, + 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 152, 151, 150, 0, 0, 0, 0, 0, 0, ++ 0, 150, 151, 152, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 82, 83, 0, 34, 16, 16, + 16, 16, 16, 0, 16, 0, 16, 16, 40, 0, + 52, 55, 0, 0, 0, 0, 0, 0, 26, 25, + 20, 155, 110, 226, 0, 0, 207, 114, 89, 0, + 90, 205, 209, 0, 0, 0, 106, 158, 0, 188, +- 220, 0, 94, 217, 0, 171, 101, 100, 99, 104, ++ 220, 0, 94, 217, 0, 171, 100, 101, 99, 104, + 0, 0, 128, 0, 141, 137, 138, 134, 135, 132, +- 0, 144, 143, 142, 140, 139, 136, 145, 133, 0, ++ 0, 143, 144, 142, 140, 139, 136, 145, 133, 0, + 0, 244, 246, 0, 116, 0, 0, 0, 248, 109, + 117, 186, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 81, 0, 29, 0, 0, 76, 0, 0, 0, +@@ -396,7 +277,20 @@ static const yytype_uint8 yydefact[] = + 0, 68, 49, 0, 59, 70, 0, 45 + }; + +-/* YYDEFGOTO[NTERM-NUM]. */ ++ /* YYPGOTO[NTERM-NUM]. */ ++static const yytype_int16 yypgoto[] = ++{ ++ -400, -400, -400, -400, -400, -400, -400, -400, 4, -400, ++ 113, -81, -400, -15, -400, 455, 371, -9, -400, -400, ++ -400, -400, -400, -400, -400, -400, -400, -307, -399, -30, ++ -380, -400, 30, 178, -289, -16, -400, 290, 451, -400, ++ 405, 130, -313, -400, 121, -400, -400, -5, -35, -400, ++ -400, -400, -400, -400, -400, -400, -400, 227, -400, -400, ++ -400, -106, -118, -400, -400, 128, -400, 301, 44, -40, ++ -39, -400, -400, -400, -400, -400, 10 ++}; ++ ++ /* YYDEFGOTO[NTERM-NUM]. */ + static const yytype_int16 yydefgoto[] = + { + -1, 7, 8, 9, 10, 11, 12, 13, 94, 361, +@@ -409,81 +303,9 @@ static const yytype_int16 yydefgoto[] = + 71, 72, 73, 74, 75, 76, 157 + }; + +-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing +- STATE-NUM. */ +-#define YYPACT_NINF -400 +-static const yytype_int16 yypact[] = +-{ +- 565, -400, -400, -400, -400, -400, -400, 73, -400, 2699, +- 69, 1486, 1389, -400, -400, -400, 1955, 2699, 2699, 49, +- 49, 49, -400, 49, 49, -400, -400, 76, -8, -400, +- 2699, -400, -400, -400, 2699, -400, -3, 8, 11, 1862, +- 1767, 49, 1862, 2048, 22, 2699, 1, 2699, 2699, 2699, +- 2699, 2699, 2699, 2699, 2141, 49, 49, -19, 14, -400, +- 9, -400, -400, -400, -400, 2770, -400, -400, 24, 68, +- 72, 106, -400, 105, 118, 165, 109, -400, -400, -400, +- -400, -400, 22, 111, -400, 39, 50, 62, 65, -14, +- 77, 95, 69, -400, 87, -400, 48, 506, 1389, -400, +- -400, -400, 612, 710, -400, 70, 490, 490, -400, -400, +- -400, -400, -400, -400, -400, 2699, 96, 101, 2699, 107, +- 410, 69, 16, 2770, 120, 2234, 1767, -400, 410, 516, +- 14, -400, 440, 2699, -400, -400, 410, 159, 93, -400, +- -400, 2699, 410, 2327, 136, -400, -400, -400, 410, 14, +- 490, 490, 490, 258, 258, 210, 152, -400, -400, 2699, +- 2699, 2699, 2699, 2699, 2699, 2420, 2699, 2699, 2699, 2699, +- 2699, 2699, 2699, 2699, 2699, 2699, 2699, 2699, 2699, 2699, +- 2699, -400, -400, -400, 131, 2513, 2699, 2699, 2699, 2699, +- 2699, 2699, 2699, -400, 200, -400, 223, -400, -400, -400, +- -400, -400, -400, 55, -400, 146, -400, -400, -400, 69, +- -400, -400, 2699, 2699, 2699, 2699, 2699, 2699, -400, -400, +- -400, -400, -400, 2699, 2699, 98, -400, -400, -400, 148, +- 160, -400, -400, 163, 150, 2699, 14, -400, 240, -400, +- -400, 293, 232, -400, 2699, 245, 192, 192, -400, 2770, +- 209, 125, -400, 531, 1567, 2033, 371, 695, 203, 2770, +- 2725, 1658, 1658, 1752, 1847, 1940, 278, 490, 490, 2699, +- 2699, 170, 172, 182, -400, 183, 2606, 32, 184, 168, +- -400, -400, 597, 249, 129, 273, 141, 436, 149, 486, +- 807, -400, 252, 189, -6, 279, 2699, 2699, 2699, 2699, +- 198, -400, -400, 202, -400, -400, -400, -400, 1579, -400, +- 2699, 2699, -400, -19, -400, -19, -19, -19, -19, -19, +- 208, -29, -400, 2699, -400, 160, 285, 69, -400, -400, +- 617, -400, -400, -400, 167, 2699, 299, -400, -400, 2699, +- 582, 179, -400, -400, -400, -400, -400, 630, -400, -400, +- 2699, -400, 306, -400, 308, -400, 319, -400, 332, -400, +- -400, -400, 320, -400, -400, -400, 329, 259, -19, 263, +- 264, -19, 270, 257, -400, 21, -400, -400, -400, 280, +- 282, 286, 2699, 281, 287, -400, 2699, 288, -400, 289, +- 381, -400, -400, -400, -400, 185, -400, 2815, 398, -400, +- -400, 292, -400, -400, -400, -400, 314, 160, 148, -400, +- 2699, -400, -400, 408, 408, 2699, -400, 2699, 408, -400, +- 321, 408, 408, -19, -400, -400, -400, -400, -400, -400, +- 350, 6, 160, -400, 322, 408, 408, -400, 18, 18, +- 325, 328, 334, 87, 2699, 408, -400, -400, 904, -400, +- -400, -400, -400, 425, 1001, -400, 87, 87, -400, 408, +- 336, -400, -400, 408, 2699, 408, -400, 340, 87, -400, +- 3, -400, -400, -400, -400, 1098, -400, 2699, 87, 338, +- 87, -400, -400, 372, 426, -400, 1195, -400, 345, -400, +- 408, -400, -400, -400, -400, -400, -400, 408, 87, 1672, +- 1292, 18, -400, 347, -400, -400, 408, -400 +-}; +- +-/* YYPGOTO[NTERM-NUM]. */ +-static const yytype_int16 yypgoto[] = +-{ +- -400, -400, -400, -400, -400, -400, -400, -400, 4, -400, +- 113, -81, -400, -15, -400, 435, 355, -9, -400, -400, +- -400, -400, -400, -400, -400, -400, -400, -307, -399, -30, +- -380, -400, 17, 157, -289, -44, -400, 265, 429, -400, +- 385, 112, -313, -400, 67, -400, -400, -5, -35, -400, +- -400, -400, -400, -400, -400, -400, -400, 227, -400, -400, +- -400, -106, -118, -400, -400, 108, -400, 284, 44, -40, +- -39, -400, -400, -400, -400, -400, 10 +-}; +- +-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If +- positive, shift that token. If negative, reduce the rule which +- number is the opposite. If YYTABLE_NINF, syntax error. */ +-#define YYTABLE_NINF -248 ++ /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If ++ positive, shift that token. If negative, reduce the rule whose ++ number is the opposite. If YYTABLE_NINF, syntax error. */ + static const yytype_int16 yytable[] = + { + 103, 377, 95, 364, 57, 130, 146, 147, 234, 222, +@@ -493,8 +315,8 @@ static const yytype_int16 yytable[] = + 462, 77, 139, 127, 110, 110, 135, 140, 162, 156, + 133, 134, 108, 202, 159, 160, 161, 109, 77, 110, + 110, 459, 460, 111, 111, 111, 158, 111, 111, 108, +- 19, 20, 21, 14, 109, 386, 203, 186, 77, 187, +- 130, -243, 221, -243, 132, 111, 204, 118, 55, 219, ++ 19, 20, 21, 14, 109, 386, 186, 203, 187, 118, ++ 130, -243, 221, -243, 132, 111, 204, 77, 55, 219, + 145, 162, 119, 420, 431, 365, 208, 124, 236, 111, + 111, 143, 505, 55, 484, 320, 130, 450, 125, 165, + 322, 126, 499, 225, -247, -245, -16, -245, 192, 453, +@@ -502,101 +324,72 @@ static const yytype_int16 yytable[] = + 110, 196, 209, 205, 55, 348, 235, 337, 241, 198, + 269, 353, 270, 159, 160, 161, 271, 272, 273, 211, + 199, 55, 274, 355, 246, 247, 248, 55, 250, 251, +- 253, 357, 200, 306, 307, 201, 159, 160, 161, 237, +- 132, 159, 160, 161, 190, 479, 191, 206, 290, 394, ++ 253, 357, 200, 306, 307, 201, 159, 160, 161, 206, ++ 132, 159, 160, 161, 190, 479, 191, 207, 290, 394, + 282, 283, 284, 285, 286, 287, 288, 289, 488, 321, +- 193, 399, 377, 275, 238, 207, 223, 427, 159, 160, +- 161, 224, 159, 160, 161, 242, 226, 313, 315, 316, +- 317, 318, 319, 312, 159, 160, 161, 388, 57, 231, ++ 193, 399, 377, 275, 238, 223, 224, 427, 159, 160, ++ 161, 226, 159, 160, 161, 237, 231, 313, 315, 316, ++ 317, 318, 319, 312, 159, 160, 161, 388, 57, 242, + 291, 244, 159, 160, 161, 159, 160, 161, 280, 326, + 330, 276, 401, 277, 278, 229, 159, 160, 161, 334, +- 159, 160, 161, 294, 106, 107, 309, 305, 324, 329, +- 331, 245, 159, 160, 161, 333, 335, 120, 159, 160, ++ 159, 160, 161, 294, 106, 107, 309, 305, 324, 331, ++ 329, 245, 159, 160, 161, 333, 335, 120, 159, 160, + 161, 123, 328, 169, 340, 341, 128, 161, 350, 136, + 360, 347, 142, 342, 148, 343, 150, 151, 152, 153, + 154, 110, 159, 160, 161, 344, 345, 349, 130, -31, +- 179, 368, 315, 371, 371, 180, 181, 182, 183, 366, +- 55, 184, 376, 381, 434, 371, 371, 385, 391, 396, +- 336, 296, 297, 298, 299, 300, 402, 308, 403, 310, ++ 179, 368, 315, 371, 371, 180, 366, 376, 181, 182, ++ 183, 184, 391, 381, 434, 371, 371, 55, 396, 402, ++ 336, 296, 297, 298, 299, 300, 385, 308, 403, 310, + 311, 111, 159, 160, 161, 212, 213, 214, 215, 404, +- 395, 392, 216, 439, 217, 306, 307, 443, 169, 170, +- 446, 447, 405, 228, 374, 57, 159, 160, 161, 410, +- 352, -248, -248, -248, 456, 457, 184, 415, 411, 159, +- 160, 161, 412, 413, 468, 179, 159, 160, 161, 414, +- 180, 181, 182, 183, 354, 130, 184, 371, 476, 418, +- 421, 423, 478, 419, 480, -79, 422, 424, 425, 249, +- 426, 429, 332, 254, 255, 256, 257, 258, 259, 260, +- 261, 262, 263, 264, 265, 266, 267, 268, 428, 498, +- 371, 448, 371, 466, 375, 430, 501, 437, 454, 305, +- 445, 449, 382, 455, 463, 507, 473, 474, 464, 167, +- -248, 169, 170, 465, 471, 451, 477, 490, 482, 368, +- -174, 481, 493, 475, 497, 495, 506, 99, 489, 186, +- 491, 187, -174, 218, 369, 503, 486, 178, 179, 371, +- 293, 467, 122, 180, 181, 182, 183, 195, 502, 184, +- 169, 170, 371, 406, 407, 432, 408, 409, 500, -174, +- -174, -174, -174, 416, 0, 0, -174, 304, -174, 417, +- 0, -174, 0, 0, 0, 0, 178, 179, -174, -174, +- -174, -174, 180, 181, 182, 183, 0, 0, 184, 159, +- 160, 161, 0, -174, -174, -174, -213, -174, -174, -174, +- -174, -174, -174, -174, -174, -174, -174, -174, -213, 0, +- 0, 0, -174, -174, -174, -174, 0, 356, -174, -174, ++ 395, 392, 216, 439, 217, 306, 307, 443, 405, 228, ++ 446, 447, 410, 411, 374, 57, 159, 160, 161, 412, ++ 352, 159, 160, 161, 456, 457, 413, 414, 418, 159, ++ 160, 161, 415, 421, 468, 159, 160, 161, 1, 2, ++ 3, 4, 5, 6, 354, 130, 419, 371, 476, 356, ++ 422, 423, 478, 424, 480, -79, 425, 426, 429, 249, ++ 428, 332, 430, 254, 255, 256, 257, 258, 259, 260, ++ 261, 262, 263, 264, 265, 266, 267, 268, 437, 498, ++ 371, 448, 371, 466, 375, 449, 501, 445, 454, 305, ++ 463, 455, 382, 464, 465, 507, 473, 474, 169, 170, ++ 159, 160, 161, 471, 477, 451, 179, 481, 482, 368, ++ -174, 180, 490, 475, 181, 182, 183, 184, 489, 186, ++ 491, 187, -174, 493, 178, 179, 486, 495, 358, 371, ++ 180, 497, 506, 181, 182, 183, 184, 99, 502, 218, ++ 169, 170, 371, 406, 467, 369, 408, 409, 500, -174, ++ -174, -174, -174, 503, 122, 293, -174, 195, -174, 417, ++ 180, -174, 407, 181, 182, 183, 184, 179, -174, -174, ++ -174, -174, 180, 416, 304, 181, 182, 183, 184, -248, ++ -248, -248, 184, -174, -174, -174, -213, -174, -174, -174, ++ -174, -174, -174, -174, -174, -174, -174, -174, -213, 432, ++ 0, -248, -174, 169, 170, -174, -174, -174, -174, -174, + 0, -174, 0, 0, -174, 212, 213, 214, 215, 0, +- 0, 0, 216, 0, 217, -213, -213, -213, -213, 159, +- 160, 161, -213, 0, -213, 0, 397, -213, 1, 2, +- 3, 4, 5, 6, -213, -213, -213, -213, 0, 159, +- 160, 161, 180, 181, 182, 183, 0, 358, 184, -213, ++ 0, 0, 216, 0, 217, -213, -213, -213, -213, 178, ++ 179, 0, -213, 0, -213, 180, 397, -213, 181, 182, ++ 183, 184, 0, 0, -213, -213, -213, -213, 0, 159, ++ 160, 161, 159, 160, 161, 0, 0, 0, 0, -213, + -213, -213, 0, -213, -213, -213, -213, -213, -213, -213, +- -213, -213, -213, -213, 159, 160, 161, 0, -213, -213, +- -213, -213, -13, 79, -213, -213, 0, -213, 0, 0, +- -213, 77, 0, 16, 0, 17, 18, 19, 20, 21, +- 338, 0, 22, 23, 24, 25, 26, 0, 27, 28, +- 29, 30, 31, 32, 80, 98, 81, 82, 33, 83, +- 84, 85, 86, 87, 88, 159, 160, 161, 89, 90, +- 91, 92, 34, 0, 35, 36, 37, 38, 39, 40, +- 159, 160, 161, 0, 41, 42, 43, 44, 45, 46, +- 47, 0, 0, 398, 0, 0, 0, 0, 48, 0, +- 159, 160, 161, 0, 0, 0, 351, 0, 0, 0, +- 49, 50, 51, 159, 160, 161, 0, 0, 52, 53, +- -3, 79, 54, 93, 55, 56, 393, 0, 0, 77, +- 0, 16, 0, 17, 18, 19, 20, 21, 0, 400, +- 22, 23, 24, 25, 26, 0, 27, 28, 29, 30, +- 31, 32, 80, 98, 81, 82, 33, 83, 84, 85, +- 86, 87, 88, 0, 0, 0, 89, 90, 91, 92, +- 34, 0, 35, 36, 37, 38, 39, 40, 0, 0, +- 0, 0, 41, 42, 43, 44, 45, 46, 47, 0, +- 0, 0, 179, 0, 0, 0, 48, 180, 181, 182, +- 183, 0, 0, 184, 0, 0, 0, 0, 49, 50, +- 51, 0, 0, 0, 0, 0, 52, 53, 79, 0, +- 54, 93, 55, 56, 0, 0, 77, 359, 16, 0, +- 17, 18, 19, 20, 21, 0, 0, 22, 23, 24, +- 25, 26, 0, 27, 28, 29, 30, 31, 32, 80, +- 98, 81, 82, 33, 83, 84, 85, 86, 87, 88, +- 0, 0, 0, 89, 90, 91, 92, 34, 0, 35, +- 36, 37, 38, 39, 40, 0, 0, 0, 0, 41, +- 42, 43, 44, 45, 46, 47, 0, 0, 0, 0, +- 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 49, 50, 51, 0, 0, +- 0, 0, 0, 52, 53, 79, 0, 54, 93, 55, +- 56, 0, 0, 77, 469, 16, 0, 17, 18, 19, +- 20, 21, 0, 0, 22, 23, 24, 25, 26, 0, +- 27, 28, 29, 30, 31, 32, 80, 98, 81, 82, +- 33, 83, 84, 85, 86, 87, 88, 0, 0, 0, +- 89, 90, 91, 92, 34, 0, 35, 36, 37, 38, +- 39, 40, 0, 0, 0, 0, 41, 42, 43, 44, +- 45, 46, 47, 0, 0, 0, 0, 0, 0, 0, +- 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 49, 50, 51, 0, 0, 0, 0, 0, +- 52, 53, 79, 0, 54, 93, 55, 56, 0, 0, +- 77, 472, 16, 0, 17, 18, 19, 20, 21, 0, +- 0, 22, 23, 24, 25, 26, 0, 27, 28, 29, +- 30, 31, 32, 80, 98, 81, 82, 33, 83, 84, +- 85, 86, 87, 88, 0, 0, 0, 89, 90, 91, +- 92, 34, 0, 35, 36, 37, 38, 39, 40, 0, +- 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, +- 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, +- 50, 51, 0, 0, 0, 0, 0, 52, 53, 79, +- 0, 54, 93, 55, 56, 0, 0, 77, 487, 16, ++ -213, -213, -213, -213, 159, 160, 161, 0, -213, 0, ++ 398, -213, -213, -213, -213, -213, 0, -213, -13, 79, ++ -213, 0, 0, 0, 0, 0, 0, 77, 0, 16, ++ 338, 17, 18, 19, 20, 21, 0, 0, 22, 23, ++ 24, 25, 26, 0, 27, 28, 29, 30, 31, 32, ++ 80, 98, 81, 82, 33, 83, 84, 85, 86, 87, ++ 88, 159, 160, 161, 89, 90, 91, 92, 34, 0, ++ 35, 36, 37, 38, 39, 40, 159, 160, 161, 0, ++ 41, 42, 43, 44, 45, 46, 47, 351, 0, 159, ++ 160, 161, 0, 0, 48, 0, 0, 0, 0, 0, ++ 0, 0, 393, 0, 0, 0, 49, 50, 0, 51, ++ 0, 52, 53, -3, 79, 400, 0, 0, 54, 93, ++ 55, 56, 77, 0, 16, 0, 17, 18, 19, 20, ++ 21, 0, 0, 22, 23, 24, 25, 26, 0, 27, ++ 28, 29, 30, 31, 32, 80, 98, 81, 82, 33, ++ 83, 84, 85, 86, 87, 88, 0, 0, 0, 89, ++ 90, 91, 92, 34, 0, 35, 36, 37, 38, 39, ++ 40, 0, 0, 0, 0, 41, 42, 43, 44, 45, ++ 46, 47, 0, 0, 0, 0, 0, 0, 0, 48, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 49, 50, 0, 51, 0, 52, 53, 0, 79, ++ 0, 0, 0, 54, 93, 55, 56, 77, 359, 16, + 0, 17, 18, 19, 20, 21, 0, 0, 22, 23, + 24, 25, 26, 0, 27, 28, 29, 30, 31, 32, + 80, 98, 81, 82, 33, 83, 84, 85, 86, 87, +@@ -604,131 +397,131 @@ static const yytype_int16 yytable[] = + 35, 36, 37, 38, 39, 40, 0, 0, 0, 0, + 41, 42, 43, 44, 45, 46, 47, 0, 0, 0, + 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 49, 50, 51, 0, +- 0, 0, 0, 0, 52, 53, 79, 0, 54, 93, +- 55, 56, 0, 0, 77, 496, 16, 0, 17, 18, +- 19, 20, 21, 0, 0, 22, 23, 24, 25, 26, +- 0, 27, 28, 29, 30, 31, 32, 80, 98, 81, +- 82, 33, 83, 84, 85, 86, 87, 88, 0, 0, +- 0, 89, 90, 91, 92, 34, 0, 35, 36, 37, +- 38, 39, 40, 0, 0, 0, 0, 41, 42, 43, +- 44, 45, 46, 47, 0, 0, 0, 0, 0, 0, +- 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 49, 50, 51, 0, 0, 0, 0, +- 0, 52, 53, 79, 0, 54, 93, 55, 56, 0, +- 0, 77, 0, 16, 0, 17, 18, 19, 20, 21, +- 0, 0, 22, 23, 24, 25, 26, 0, 27, 28, +- 29, 30, 31, 32, 80, 98, 81, 82, 33, 83, +- 84, 85, 86, 87, 88, 0, 0, 0, 89, 90, +- 91, 92, 34, 0, 35, 36, 37, 38, 39, 40, +- 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, +- 47, 0, 0, 504, 0, 0, 0, 0, 48, 0, ++ 0, 0, 0, 0, 0, 0, 49, 50, 0, 51, ++ 0, 52, 53, 0, 79, 0, 0, 0, 54, 93, ++ 55, 56, 77, 469, 16, 0, 17, 18, 19, 20, ++ 21, 0, 0, 22, 23, 24, 25, 26, 0, 27, ++ 28, 29, 30, 31, 32, 80, 98, 81, 82, 33, ++ 83, 84, 85, 86, 87, 88, 0, 0, 0, 89, ++ 90, 91, 92, 34, 0, 35, 36, 37, 38, 39, ++ 40, 0, 0, 0, 0, 41, 42, 43, 44, 45, ++ 46, 47, 0, 0, 0, 0, 0, 0, 0, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 49, 50, 51, 0, 0, 0, 0, 0, 52, 53, +- 79, 0, 54, 93, 55, 56, 0, 0, 77, 0, +- 16, 0, 17, 18, 19, 20, 21, 0, 0, 22, +- 23, 24, 25, 26, 0, 27, 28, 29, 30, 31, +- 32, 80, 98, 81, 82, 33, 83, 84, 85, 86, +- 87, 88, 0, 0, 0, 89, 90, 91, 92, 34, +- 0, 35, 36, 37, 38, 39, 40, 0, 0, 0, +- 0, 41, 42, 43, 44, 45, 46, 47, 0, 0, +- 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 49, 50, 51, +- 0, 0, 0, 0, 0, 52, 53, 79, 0, 54, +- 93, 55, 56, 0, 0, 77, 0, 16, 0, 17, +- 18, 19, 20, 21, 0, 0, 22, 23, 24, 25, +- 26, 0, 27, 28, 29, 30, 31, 32, 80, 0, +- 81, 82, 33, 83, 84, 85, 86, 87, 88, 0, +- 0, 0, 89, 90, 91, 92, 34, 0, 35, 36, +- 37, 38, 39, 40, 0, 0, 0, 0, 41, 42, +- 43, 44, 45, 46, 47, 0, 0, 0, 0, 0, +- 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 49, 50, 51, 0, 0, 0, +- 79, 0, 52, 53, 0, 0, 54, 93, 55, 56, +- 16, 0, 17, 18, 19, 20, 21, 0, 0, 22, +- 23, 24, 25, 26, 0, 27, 28, 29, 30, 31, +- 32, 0, 0, 0, 0, 33, 0, 0, -248, 0, +- 0, 0, 0, 0, 0, 167, 168, 169, 170, 34, +- 0, 35, 36, 37, 38, 39, 40, 0, 0, 0, +- 0, 41, 42, 43, 44, 45, 46, 47, 173, 174, +- 175, 176, 177, 178, 179, 48, 0, 0, 0, 180, +- 181, 182, 183, 0, 0, 184, 0, 49, 50, 51, +- 0, 0, 0, 79, 0, 52, 53, 0, 0, 54, +- -74, 55, 56, 16, 0, 17, 18, 19, 20, 21, +- 0, 0, 22, 23, 24, 25, 26, 0, 27, 28, +- 29, 30, 31, 32, 0, 0, 0, 0, 33, 0, +- 0, 0, 0, 0, 0, 0, 167, 168, 169, 170, +- 0, 0, 34, 0, 35, 36, 37, 38, 39, 40, +- 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, +- 47, 175, 176, 177, 178, 179, 0, 0, 48, 0, +- 180, 181, 182, 183, 0, 0, 184, 0, 0, 0, +- 49, 50, 51, 0, 0, 0, 0, 0, 52, 53, +- 0, -74, 54, 0, 55, 56, 77, 0, 16, 0, +- 17, 18, 19, 20, 21, 0, 0, 129, 23, 24, +- 25, 26, 109, 27, 28, 29, 30, 31, 32, 0, +- 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, +- 167, 168, 169, 170, 0, 0, 0, 34, 0, 35, +- 36, 37, 38, 39, 40, 0, 0, 0, 0, 41, +- 42, 43, 44, 45, 46, 47, 176, 177, 178, 179, +- 0, 0, 0, 48, 180, 181, 182, 183, 0, 0, +- 184, 0, 0, 0, 0, 49, 50, 51, 0, 0, +- 0, 0, 0, 52, 53, 0, 0, 54, 0, 55, +- 56, 77, 0, 16, 0, 17, 18, 19, 20, 21, +- 0, 0, 22, 23, 24, 25, 26, 0, 27, 28, +- 29, 30, 31, 32, 0, 0, 0, 0, 33, 0, +- 0, 0, 0, 0, 0, 167, 168, 169, 170, 0, +- 0, 0, 34, 0, 35, 36, 37, 38, 39, 40, +- 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, +- 47, 0, 177, 178, 179, 0, 0, 0, 48, 180, +- 181, 182, 183, 0, 0, 184, 0, 0, 0, 0, +- 49, 50, 51, 0, 0, 0, 0, 0, 52, 53, +- 0, 0, 54, 0, 55, 56, 16, 104, 17, 18, +- 19, 20, 21, 0, 0, 22, 23, 24, 25, 26, +- 0, 27, 28, 29, 30, 31, 32, 0, 0, 0, +- 0, 33, 0, 0, 0, 0, 0, 0, 167, 168, +- 169, 170, 0, 0, 0, 34, 0, 35, 36, 37, +- 38, 39, 40, 0, 0, 0, 0, 41, 42, 43, +- 44, 45, 46, 47, 0, 0, 178, 179, 0, 0, +- 0, 48, 180, 181, 182, 183, 0, 0, 184, 0, +- 0, 0, 0, 49, 50, 51, 0, 0, 0, 0, +- 0, 52, 53, 0, 0, 54, 0, 55, 56, 16, ++ 0, 49, 50, 0, 51, 0, 52, 53, 0, 79, ++ 0, 0, 0, 54, 93, 55, 56, 77, 472, 16, + 0, 17, 18, 19, 20, 21, 0, 0, 22, 23, + 24, 25, 26, 0, 27, 28, 29, 30, 31, 32, +- 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, +- 0, -248, 0, 169, 170, 0, 0, 0, 34, 0, ++ 80, 98, 81, 82, 33, 83, 84, 85, 86, 87, ++ 88, 0, 0, 0, 89, 90, 91, 92, 34, 0, ++ 35, 36, 37, 38, 39, 40, 0, 0, 0, 0, ++ 41, 42, 43, 44, 45, 46, 47, 0, 0, 0, ++ 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 49, 50, 0, 51, ++ 0, 52, 53, 0, 79, 0, 0, 0, 54, 93, ++ 55, 56, 77, 487, 16, 0, 17, 18, 19, 20, ++ 21, 0, 0, 22, 23, 24, 25, 26, 0, 27, ++ 28, 29, 30, 31, 32, 80, 98, 81, 82, 33, ++ 83, 84, 85, 86, 87, 88, 0, 0, 0, 89, ++ 90, 91, 92, 34, 0, 35, 36, 37, 38, 39, ++ 40, 0, 0, 0, 0, 41, 42, 43, 44, 45, ++ 46, 47, 0, 0, 0, 0, 0, 0, 0, 48, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 49, 50, 0, 51, 0, 52, 53, 0, 79, ++ 0, 0, 0, 54, 93, 55, 56, 77, 496, 16, ++ 0, 17, 18, 19, 20, 21, 0, 0, 22, 23, ++ 24, 25, 26, 0, 27, 28, 29, 30, 31, 32, ++ 80, 98, 81, 82, 33, 83, 84, 85, 86, 87, ++ 88, 0, 0, 0, 89, 90, 91, 92, 34, 0, + 35, 36, 37, 38, 39, 40, 0, 0, 0, 0, +- 41, 42, 43, 44, 45, 46, 47, 0, 0, 178, +- 179, 0, 0, 0, 48, 180, 181, 182, 183, 0, +- 0, 184, 0, 0, 0, 0, 49, 50, 51, 0, +- 0, 0, 0, 0, 52, 53, 0, 0, 54, 137, +- 55, 56, 16, 0, 17, 18, 19, 20, 21, 0, ++ 41, 42, 43, 44, 45, 46, 47, 0, 0, 0, ++ 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 49, 50, 0, 51, ++ 0, 52, 53, 0, 79, 0, 0, 0, 54, 93, ++ 55, 56, 77, 0, 16, 0, 17, 18, 19, 20, ++ 21, 0, 0, 22, 23, 24, 25, 26, 0, 27, ++ 28, 29, 30, 31, 32, 80, 98, 81, 82, 33, ++ 83, 84, 85, 86, 87, 88, 0, 0, 0, 89, ++ 90, 91, 92, 34, 0, 35, 36, 37, 38, 39, ++ 40, 0, 0, 0, 0, 41, 42, 43, 44, 45, ++ 46, 47, 0, 0, 504, 0, 0, 0, 0, 48, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 49, 50, 0, 51, 0, 52, 53, 0, 79, ++ 0, 0, 0, 54, 93, 55, 56, 77, 0, 16, ++ 0, 17, 18, 19, 20, 21, 0, 0, 22, 23, ++ 24, 25, 26, 0, 27, 28, 29, 30, 31, 32, ++ 80, 98, 81, 82, 33, 83, 84, 85, 86, 87, ++ 88, 0, 0, 0, 89, 90, 91, 92, 34, 0, ++ 35, 36, 37, 38, 39, 40, 0, 0, 0, 0, ++ 41, 42, 43, 44, 45, 46, 47, 0, 0, 0, ++ 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 49, 50, 0, 51, ++ 0, 52, 53, 0, 79, 0, 0, 0, 54, 93, ++ 55, 56, 77, 0, 16, 0, 17, 18, 19, 20, ++ 21, 0, 0, 22, 23, 24, 25, 26, 0, 27, ++ 28, 29, 30, 31, 32, 80, 0, 81, 82, 33, ++ 83, 84, 85, 86, 87, 88, 0, 0, 0, 89, ++ 90, 91, 92, 34, 0, 35, 36, 37, 38, 39, ++ 40, 0, 0, 0, 0, 41, 42, 43, 44, 45, ++ 46, 47, 0, 0, 0, 0, 0, 0, 0, 48, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 49, 50, 0, 51, 0, 52, 53, 79, 0, ++ 0, 0, 0, 54, 93, 55, 56, 0, 16, 0, ++ 17, 18, 19, 20, 21, 0, 0, 22, 23, 24, ++ 25, 26, 0, 27, 28, 29, 30, 31, 32, 0, ++ 0, 0, 0, 33, 0, 0, -248, 0, 0, 0, ++ 0, 0, 0, 167, 168, 169, 170, 34, 0, 35, ++ 36, 37, 38, 39, 40, 0, 0, 0, 0, 41, ++ 42, 43, 44, 45, 46, 47, 173, 174, 175, 176, ++ 177, 178, 179, 48, 0, 0, 0, 180, 0, 0, ++ 181, 182, 183, 184, 0, 49, 50, 0, 51, 0, ++ 52, 53, 79, 0, 0, 0, 0, 54, -74, 55, ++ 56, 0, 16, 0, 17, 18, 19, 20, 21, 0, + 0, 22, 23, 24, 25, 26, 0, 27, 28, 29, + 30, 31, 32, 0, 0, 0, 0, 33, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 167, 168, 169, 170, 0, + 0, 34, 0, 35, 36, 37, 38, 39, 40, 0, + 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, +- 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, +- 50, 51, 0, 0, 0, 0, 0, 52, 53, 0, +- 155, 54, 0, 55, 56, 16, 0, 17, 18, 19, ++ 175, 176, 177, 178, 179, 0, 0, 48, 0, 180, ++ 0, 0, 181, 182, 183, 184, 0, 0, 0, 49, ++ 50, 0, 51, 0, 52, 53, 0, 0, 0, 0, ++ -74, 54, 0, 55, 56, 77, 0, 16, 0, 17, ++ 18, 19, 20, 21, 0, 0, 129, 23, 24, 25, ++ 26, 109, 27, 28, 29, 30, 31, 32, 0, 0, ++ 0, 0, 33, 0, 0, 0, 0, 0, 0, 167, ++ 168, 169, 170, 0, 0, 0, 34, 0, 35, 36, ++ 37, 38, 39, 40, 0, 0, 0, 0, 41, 42, ++ 43, 44, 45, 46, 47, 176, 177, 178, 179, 0, ++ 0, 0, 48, 180, 0, 0, 181, 182, 183, 184, ++ 0, 0, 0, 0, 49, 50, 0, 51, 0, 52, ++ 53, 0, 0, 0, 0, 0, 54, 0, 55, 56, ++ 77, 0, 16, 0, 17, 18, 19, 20, 21, 0, ++ 0, 22, 23, 24, 25, 26, 0, 27, 28, 29, ++ 30, 31, 32, 0, 0, 0, 0, 33, 0, 0, ++ 0, 0, 0, 0, 167, 168, 169, 170, 0, 0, ++ 0, 34, 0, 35, 36, 37, 38, 39, 40, 0, ++ 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, ++ 0, 177, 178, 179, 0, 0, 0, 48, 180, 0, ++ 0, 181, 182, 183, 184, 0, 0, 0, 0, 49, ++ 50, 0, 51, 0, 52, 53, 0, 0, 0, 0, ++ 0, 54, 0, 55, 56, 16, 104, 17, 18, 19, + 20, 21, 0, 0, 22, 23, 24, 25, 26, 0, + 27, 28, 29, 30, 31, 32, 0, 0, 0, 0, +- 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 33, 0, 0, 0, 0, 167, -248, 169, 170, 0, + 0, 0, 0, 0, 34, 0, 35, 36, 37, 38, + 39, 40, 0, 0, 0, 0, 41, 42, 43, 44, +- 45, 46, 47, 0, 0, 0, 0, 0, 0, 0, +- 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 49, 50, 51, 0, 0, 0, 0, 0, +- 52, 53, 0, 232, 54, 0, 55, 56, 16, 0, ++ 45, 46, 47, 178, 179, 0, 0, 0, 0, 180, ++ 48, 0, 181, 182, 183, 184, 0, 0, 0, 0, ++ 0, 0, 49, 50, 0, 51, 0, 52, 53, 0, ++ 0, 0, 0, 0, 54, 0, 55, 56, 16, 0, + 17, 18, 19, 20, 21, 0, 0, 22, 23, 24, + 25, 26, 0, 27, 28, 29, 30, 31, 32, 0, +- 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 34, 0, 35, ++ 0, 0, 0, 33, 0, 0, 0, 0, 167, 168, ++ 169, 170, 0, 0, 0, 0, 0, 34, 0, 35, + 36, 37, 38, 39, 40, 0, 0, 0, 0, 41, +- 42, 43, 44, 45, 46, 47, 0, 0, 0, 0, +- 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 49, 50, 51, 0, 0, +- 0, 0, 0, 52, 53, 0, 240, 54, 0, 55, ++ 42, 43, 44, 45, 46, 47, 178, 179, 0, 0, ++ 0, 0, 180, 48, 0, 181, 182, 183, 184, 0, ++ 0, 0, 0, 0, 0, 49, 50, 0, 51, 0, ++ 52, 53, 0, 0, 0, 0, 0, 54, 137, 55, + 56, 16, 0, 17, 18, 19, 20, 21, 0, 0, + 22, 23, 24, 25, 26, 0, 27, 28, 29, 30, + 31, 32, 0, 0, 0, 0, 33, 0, 0, 0, +@@ -737,7 +530,7 @@ static const yytype_int16 yytable[] = + 0, 0, 41, 42, 43, 44, 45, 46, 47, 0, + 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, +- 51, 0, 0, 0, 0, 0, 52, 53, 0, 252, ++ 0, 51, 0, 52, 53, 0, 0, 0, 0, 155, + 54, 0, 55, 56, 16, 0, 17, 18, 19, 20, + 21, 0, 0, 22, 23, 24, 25, 26, 0, 27, + 28, 29, 30, 31, 32, 0, 0, 0, 0, 33, +@@ -746,8 +539,8 @@ static const yytype_int16 yytable[] = + 40, 0, 0, 0, 0, 41, 42, 43, 44, 45, + 46, 47, 0, 0, 0, 0, 0, 0, 0, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 49, 50, 51, 0, 0, 0, 0, 0, 52, +- 53, 0, 281, 54, 0, 55, 56, 16, 0, 17, ++ 0, 49, 50, 0, 51, 0, 52, 53, 0, 0, ++ 0, 0, 232, 54, 0, 55, 56, 16, 0, 17, + 18, 19, 20, 21, 0, 0, 22, 23, 24, 25, + 26, 0, 27, 28, 29, 30, 31, 32, 0, 0, + 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, +@@ -755,37 +548,58 @@ static const yytype_int16 yytable[] = + 37, 38, 39, 40, 0, 0, 0, 0, 41, 42, + 43, 44, 45, 46, 47, 0, 0, 0, 0, 0, + 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 49, 50, 51, 0, 0, 0, +- 0, 0, 52, 53, 0, 346, 54, 0, 55, 56, ++ 0, 0, 0, 0, 49, 50, 0, 51, 0, 52, ++ 53, 0, 0, 0, 0, 240, 54, 0, 55, 56, + 16, 0, 17, 18, 19, 20, 21, 0, 0, 22, + 23, 24, 25, 26, 0, 27, 28, 29, 30, 31, + 32, 0, 0, 0, 0, 33, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 0, 35, 36, 37, 38, 39, 40, 0, 0, 0, + 0, 41, 42, 43, 44, 45, 46, 47, 0, 0, +- 0, 0, 0, 0, 0, 48, 166, 0, 0, 0, +- 0, 0, 0, 167, 168, 169, 170, 49, 50, 51, +- 0, 0, 0, 0, 0, 52, 53, 0, 0, 54, +- 0, 55, 56, 171, 172, 339, 173, 174, 175, 176, +- 177, 178, 179, 0, 0, 0, 0, 180, 181, 182, +- 183, 166, 0, 184, 0, 0, 0, 0, 167, 168, +- 169, 170, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 171, 172, +- 0, 173, 174, 175, 176, 177, 178, 179, 0, 0, +- 0, 0, 180, 181, 182, 183, 166, 0, 184, 0, +- 0, 0, 0, 167, 168, 169, 170, 0, 0, 0, ++ 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 49, 50, 0, ++ 51, 0, 52, 53, 0, 0, 0, 0, 252, 54, ++ 0, 55, 56, 16, 0, 17, 18, 19, 20, 21, ++ 0, 0, 22, 23, 24, 25, 26, 0, 27, 28, ++ 29, 30, 31, 32, 0, 0, 0, 0, 33, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 172, 0, 173, 174, 175, 176, +- 177, 178, 179, 0, 0, 0, 0, 180, 181, 182, +- 183, 0, 0, 184 ++ 0, 0, 34, 0, 35, 36, 37, 38, 39, 40, ++ 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, ++ 47, 0, 0, 0, 0, 0, 0, 0, 48, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 49, 50, 0, 51, 0, 52, 53, 0, 0, 0, ++ 0, 281, 54, 0, 55, 56, 16, 0, 17, 18, ++ 19, 20, 21, 0, 0, 22, 23, 24, 25, 26, ++ 0, 27, 28, 29, 30, 31, 32, 0, 0, 0, ++ 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 34, 0, 35, 36, 37, ++ 38, 39, 40, 0, 0, 0, 0, 41, 42, 43, ++ 44, 45, 46, 47, 0, 0, 0, 0, 0, 0, ++ 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 49, 50, 0, 51, 0, 52, 53, ++ 0, 0, 0, 0, 346, 54, 0, 55, 56, 16, ++ 0, 17, 18, 19, 20, 21, 0, 0, 22, 23, ++ 24, 25, 26, 0, 27, 28, 29, 30, 31, 32, ++ 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, ++ 35, 36, 37, 38, 39, 40, 0, 0, 0, 0, ++ 41, 42, 43, 44, 45, 46, 47, 0, 0, 0, ++ 0, 0, 0, 0, 48, 166, 0, 0, 0, 0, ++ 0, 0, 167, 168, 169, 170, 49, 50, 0, 51, ++ 0, 52, 53, 0, 0, 0, 0, 0, 54, 0, ++ 55, 56, 171, 172, 339, 173, 174, 175, 176, 177, ++ 178, 179, 0, 0, 0, 0, 180, 166, 0, 181, ++ 182, 183, 184, 0, 167, 168, 169, 170, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 171, 172, 0, 173, 174, 175, ++ 176, 177, 178, 179, 0, 0, 0, 0, 180, 166, ++ 0, 181, 182, 183, 184, 0, 167, 168, 169, 170, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 172, 0, 173, ++ 174, 175, 176, 177, 178, 179, 0, 0, 0, 0, ++ 180, 0, 0, 181, 182, 183, 184 + }; + +-#define yypact_value_is_default(Yystate) \ +- (!!((Yystate) == (-400))) +- +-#define yytable_value_is_error(Yytable_value) \ +- (!!((Yytable_value) == (-248))) +- + static const yytype_int16 yycheck[] = + { + 15, 308, 11, 9, 9, 40, 46, 46, 126, 115, +@@ -795,8 +609,8 @@ static const yytype_int16 yycheck[] = + 439, 9, 20, 39, 40, 41, 42, 25, 77, 54, + 40, 41, 20, 67, 73, 74, 75, 25, 9, 55, + 56, 43, 44, 19, 20, 21, 56, 23, 24, 20, +- 15, 16, 17, 0, 25, 104, 90, 9, 9, 11, +- 115, 9, 12, 11, 40, 41, 100, 11, 102, 98, ++ 15, 16, 17, 0, 25, 104, 9, 91, 11, 11, ++ 115, 9, 12, 11, 40, 41, 100, 9, 102, 98, + 46, 77, 100, 382, 407, 101, 92, 100, 133, 55, + 56, 100, 501, 102, 101, 223, 141, 101, 100, 100, + 12, 100, 492, 118, 9, 9, 100, 11, 9, 432, +@@ -804,101 +618,72 @@ static const yytype_int16 yycheck[] = + 126, 20, 45, 89, 102, 103, 126, 12, 143, 100, + 9, 12, 11, 73, 74, 75, 15, 16, 17, 101, + 100, 102, 21, 12, 159, 160, 161, 102, 163, 164, +- 165, 12, 100, 203, 203, 100, 73, 74, 75, 10, ++ 165, 12, 100, 203, 203, 100, 73, 74, 75, 100, + 126, 73, 74, 75, 9, 464, 11, 100, 193, 12, + 185, 186, 187, 188, 189, 190, 191, 192, 477, 224, + 77, 12, 499, 62, 101, 100, 100, 12, 73, 74, +- 75, 100, 73, 74, 75, 69, 99, 212, 213, 214, +- 215, 216, 217, 209, 73, 74, 75, 323, 223, 99, ++ 75, 99, 73, 74, 75, 10, 99, 212, 213, 214, ++ 215, 216, 217, 209, 73, 74, 75, 323, 223, 69, + 20, 11, 73, 74, 75, 73, 74, 75, 184, 69, + 235, 100, 350, 102, 103, 122, 73, 74, 75, 244, +- 73, 74, 75, 20, 17, 18, 100, 203, 100, 99, +- 10, 99, 73, 74, 75, 23, 11, 30, 73, 74, ++ 73, 74, 75, 20, 17, 18, 100, 203, 100, 10, ++ 99, 99, 73, 74, 75, 23, 11, 30, 73, 74, + 75, 34, 99, 60, 269, 270, 39, 75, 100, 42, + 18, 276, 45, 103, 47, 103, 49, 50, 51, 52, + 53, 277, 73, 74, 75, 103, 103, 103, 323, 100, +- 87, 296, 297, 298, 299, 92, 93, 94, 95, 20, +- 102, 98, 100, 308, 410, 310, 311, 99, 23, 10, +- 101, 198, 199, 200, 201, 202, 10, 204, 10, 206, ++ 87, 296, 297, 298, 299, 92, 20, 100, 95, 96, ++ 97, 98, 23, 308, 410, 310, 311, 102, 10, 10, ++ 101, 198, 199, 200, 201, 202, 99, 204, 10, 206, + 207, 277, 73, 74, 75, 39, 40, 41, 42, 10, +- 335, 327, 46, 414, 48, 375, 375, 418, 60, 61, +- 421, 422, 10, 23, 300, 350, 73, 74, 75, 20, +- 101, 93, 94, 95, 435, 436, 98, 100, 99, 73, +- 74, 75, 99, 99, 445, 87, 73, 74, 75, 99, +- 92, 93, 94, 95, 101, 410, 98, 382, 459, 99, +- 99, 386, 463, 101, 465, 99, 99, 99, 99, 162, +- 9, 99, 99, 166, 167, 168, 169, 170, 171, 172, +- 173, 174, 175, 176, 177, 178, 179, 180, 10, 490, +- 415, 426, 417, 443, 301, 101, 497, 9, 433, 375, +- 99, 71, 309, 101, 99, 506, 456, 457, 100, 58, +- 59, 60, 61, 99, 9, 431, 100, 99, 468, 444, +- 0, 101, 70, 458, 99, 19, 99, 12, 478, 9, +- 480, 11, 12, 98, 297, 499, 471, 86, 87, 464, +- 195, 444, 33, 92, 93, 94, 95, 82, 498, 98, +- 60, 61, 477, 360, 362, 408, 363, 364, 493, 39, +- 40, 41, 42, 375, -1, -1, 46, 203, 48, 376, +- -1, 51, -1, -1, -1, -1, 86, 87, 58, 59, +- 60, 61, 92, 93, 94, 95, -1, -1, 98, 73, +- 74, 75, -1, 73, 74, 75, 0, 77, 78, 79, +- 80, 81, 82, 83, 84, 85, 86, 87, 12, -1, +- -1, -1, 92, 93, 94, 95, -1, 101, 98, 99, ++ 335, 327, 46, 414, 48, 375, 375, 418, 10, 23, ++ 421, 422, 20, 99, 300, 350, 73, 74, 75, 99, ++ 101, 73, 74, 75, 435, 436, 99, 99, 99, 73, ++ 74, 75, 100, 99, 445, 73, 74, 75, 3, 4, ++ 5, 6, 7, 8, 101, 410, 101, 382, 459, 101, ++ 99, 386, 463, 99, 465, 99, 99, 9, 99, 162, ++ 10, 99, 101, 166, 167, 168, 169, 170, 171, 172, ++ 173, 174, 175, 176, 177, 178, 179, 180, 9, 490, ++ 415, 426, 417, 443, 301, 71, 497, 99, 433, 375, ++ 99, 101, 309, 100, 99, 506, 456, 457, 60, 61, ++ 73, 74, 75, 9, 100, 431, 87, 101, 468, 444, ++ 0, 92, 99, 458, 95, 96, 97, 98, 478, 9, ++ 480, 11, 12, 70, 86, 87, 471, 19, 101, 464, ++ 92, 99, 99, 95, 96, 97, 98, 12, 498, 98, ++ 60, 61, 477, 360, 444, 297, 363, 364, 493, 39, ++ 40, 41, 42, 499, 33, 195, 46, 82, 48, 376, ++ 92, 51, 362, 95, 96, 97, 98, 87, 58, 59, ++ 60, 61, 92, 375, 203, 95, 96, 97, 98, 95, ++ 96, 97, 98, 73, 74, 75, 0, 77, 78, 79, ++ 80, 81, 82, 83, 84, 85, 86, 87, 12, 408, ++ -1, 58, 92, 60, 61, 95, 96, 97, 98, 99, + -1, 101, -1, -1, 104, 39, 40, 41, 42, -1, +- -1, -1, 46, -1, 48, 39, 40, 41, 42, 73, +- 74, 75, 46, -1, 48, -1, 339, 51, 3, 4, +- 5, 6, 7, 8, 58, 59, 60, 61, -1, 73, +- 74, 75, 92, 93, 94, 95, -1, 101, 98, 73, ++ -1, -1, 46, -1, 48, 39, 40, 41, 42, 86, ++ 87, -1, 46, -1, 48, 92, 339, 51, 95, 96, ++ 97, 98, -1, -1, 58, 59, 60, 61, -1, 73, ++ 74, 75, 73, 74, 75, -1, -1, -1, -1, 73, + 74, 75, -1, 77, 78, 79, 80, 81, 82, 83, +- 84, 85, 86, 87, 73, 74, 75, -1, 92, 93, +- 94, 95, 0, 1, 98, 99, -1, 101, -1, -1, +- 104, 9, -1, 11, -1, 13, 14, 15, 16, 17, +- 99, -1, 20, 21, 22, 23, 24, -1, 26, 27, +- 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, +- 38, 39, 40, 41, 42, 73, 74, 75, 46, 47, +- 48, 49, 50, -1, 52, 53, 54, 55, 56, 57, +- 73, 74, 75, -1, 62, 63, 64, 65, 66, 67, +- 68, -1, -1, 101, -1, -1, -1, -1, 76, -1, +- 73, 74, 75, -1, -1, -1, 99, -1, -1, -1, +- 88, 89, 90, 73, 74, 75, -1, -1, 96, 97, +- 0, 1, 100, 101, 102, 103, 99, -1, -1, 9, +- -1, 11, -1, 13, 14, 15, 16, 17, -1, 99, +- 20, 21, 22, 23, 24, -1, 26, 27, 28, 29, +- 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, +- 40, 41, 42, -1, -1, -1, 46, 47, 48, 49, +- 50, -1, 52, 53, 54, 55, 56, 57, -1, -1, +- -1, -1, 62, 63, 64, 65, 66, 67, 68, -1, +- -1, -1, 87, -1, -1, -1, 76, 92, 93, 94, +- 95, -1, -1, 98, -1, -1, -1, -1, 88, 89, +- 90, -1, -1, -1, -1, -1, 96, 97, 1, -1, +- 100, 101, 102, 103, -1, -1, 9, 10, 11, -1, +- 13, 14, 15, 16, 17, -1, -1, 20, 21, 22, +- 23, 24, -1, 26, 27, 28, 29, 30, 31, 32, +- 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, +- -1, -1, -1, 46, 47, 48, 49, 50, -1, 52, +- 53, 54, 55, 56, 57, -1, -1, -1, -1, 62, +- 63, 64, 65, 66, 67, 68, -1, -1, -1, -1, +- -1, -1, -1, 76, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, 88, 89, 90, -1, -1, +- -1, -1, -1, 96, 97, 1, -1, 100, 101, 102, +- 103, -1, -1, 9, 10, 11, -1, 13, 14, 15, +- 16, 17, -1, -1, 20, 21, 22, 23, 24, -1, +- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, +- 36, 37, 38, 39, 40, 41, 42, -1, -1, -1, +- 46, 47, 48, 49, 50, -1, 52, 53, 54, 55, +- 56, 57, -1, -1, -1, -1, 62, 63, 64, 65, +- 66, 67, 68, -1, -1, -1, -1, -1, -1, -1, +- 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, 88, 89, 90, -1, -1, -1, -1, -1, +- 96, 97, 1, -1, 100, 101, 102, 103, -1, -1, +- 9, 10, 11, -1, 13, 14, 15, 16, 17, -1, +- -1, 20, 21, 22, 23, 24, -1, 26, 27, 28, +- 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, +- 39, 40, 41, 42, -1, -1, -1, 46, 47, 48, +- 49, 50, -1, 52, 53, 54, 55, 56, 57, -1, +- -1, -1, -1, 62, 63, 64, 65, 66, 67, 68, +- -1, -1, -1, -1, -1, -1, -1, 76, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, +- 89, 90, -1, -1, -1, -1, -1, 96, 97, 1, +- -1, 100, 101, 102, 103, -1, -1, 9, 10, 11, ++ 84, 85, 86, 87, 73, 74, 75, -1, 92, -1, ++ 101, 95, 96, 97, 98, 99, -1, 101, 0, 1, ++ 104, -1, -1, -1, -1, -1, -1, 9, -1, 11, ++ 99, 13, 14, 15, 16, 17, -1, -1, 20, 21, ++ 22, 23, 24, -1, 26, 27, 28, 29, 30, 31, ++ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, ++ 42, 73, 74, 75, 46, 47, 48, 49, 50, -1, ++ 52, 53, 54, 55, 56, 57, 73, 74, 75, -1, ++ 62, 63, 64, 65, 66, 67, 68, 99, -1, 73, ++ 74, 75, -1, -1, 76, -1, -1, -1, -1, -1, ++ -1, -1, 99, -1, -1, -1, 88, 89, -1, 91, ++ -1, 93, 94, 0, 1, 99, -1, -1, 100, 101, ++ 102, 103, 9, -1, 11, -1, 13, 14, 15, 16, ++ 17, -1, -1, 20, 21, 22, 23, 24, -1, 26, ++ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, ++ 37, 38, 39, 40, 41, 42, -1, -1, -1, 46, ++ 47, 48, 49, 50, -1, 52, 53, 54, 55, 56, ++ 57, -1, -1, -1, -1, 62, 63, 64, 65, 66, ++ 67, 68, -1, -1, -1, -1, -1, -1, -1, 76, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, 88, 89, -1, 91, -1, 93, 94, -1, 1, ++ -1, -1, -1, 100, 101, 102, 103, 9, 10, 11, + -1, 13, 14, 15, 16, 17, -1, -1, 20, 21, + 22, 23, 24, -1, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, +@@ -906,131 +691,131 @@ static const yytype_int16 yycheck[] = + 52, 53, 54, 55, 56, 57, -1, -1, -1, -1, + 62, 63, 64, 65, 66, 67, 68, -1, -1, -1, + -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, 88, 89, 90, -1, +- -1, -1, -1, -1, 96, 97, 1, -1, 100, 101, +- 102, 103, -1, -1, 9, 10, 11, -1, 13, 14, +- 15, 16, 17, -1, -1, 20, 21, 22, 23, 24, +- -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, +- 35, 36, 37, 38, 39, 40, 41, 42, -1, -1, +- -1, 46, 47, 48, 49, 50, -1, 52, 53, 54, +- 55, 56, 57, -1, -1, -1, -1, 62, 63, 64, +- 65, 66, 67, 68, -1, -1, -1, -1, -1, -1, +- -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, 88, 89, 90, -1, -1, -1, -1, +- -1, 96, 97, 1, -1, 100, 101, 102, 103, -1, +- -1, 9, -1, 11, -1, 13, 14, 15, 16, 17, +- -1, -1, 20, 21, 22, 23, 24, -1, 26, 27, +- 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, +- 38, 39, 40, 41, 42, -1, -1, -1, 46, 47, +- 48, 49, 50, -1, 52, 53, 54, 55, 56, 57, +- -1, -1, -1, -1, 62, 63, 64, 65, 66, 67, +- 68, -1, -1, 71, -1, -1, -1, -1, 76, -1, ++ -1, -1, -1, -1, -1, -1, 88, 89, -1, 91, ++ -1, 93, 94, -1, 1, -1, -1, -1, 100, 101, ++ 102, 103, 9, 10, 11, -1, 13, 14, 15, 16, ++ 17, -1, -1, 20, 21, 22, 23, 24, -1, 26, ++ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, ++ 37, 38, 39, 40, 41, 42, -1, -1, -1, 46, ++ 47, 48, 49, 50, -1, 52, 53, 54, 55, 56, ++ 57, -1, -1, -1, -1, 62, 63, 64, 65, 66, ++ 67, 68, -1, -1, -1, -1, -1, -1, -1, 76, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, +- 1, -1, 100, 101, 102, 103, -1, -1, 9, -1, +- 11, -1, 13, 14, 15, 16, 17, -1, -1, 20, +- 21, 22, 23, 24, -1, 26, 27, 28, 29, 30, +- 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, +- 41, 42, -1, -1, -1, 46, 47, 48, 49, 50, +- -1, 52, 53, 54, 55, 56, 57, -1, -1, -1, +- -1, 62, 63, 64, 65, 66, 67, 68, -1, -1, +- -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, 88, 89, 90, +- -1, -1, -1, -1, -1, 96, 97, 1, -1, 100, +- 101, 102, 103, -1, -1, 9, -1, 11, -1, 13, +- 14, 15, 16, 17, -1, -1, 20, 21, 22, 23, +- 24, -1, 26, 27, 28, 29, 30, 31, 32, -1, +- 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, +- -1, -1, 46, 47, 48, 49, 50, -1, 52, 53, +- 54, 55, 56, 57, -1, -1, -1, -1, 62, 63, +- 64, 65, 66, 67, 68, -1, -1, -1, -1, -1, +- -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 88, 89, 90, -1, -1, -1, +- 1, -1, 96, 97, -1, -1, 100, 101, 102, 103, +- 11, -1, 13, 14, 15, 16, 17, -1, -1, 20, +- 21, 22, 23, 24, -1, 26, 27, 28, 29, 30, +- 31, -1, -1, -1, -1, 36, -1, -1, 51, -1, +- -1, -1, -1, -1, -1, 58, 59, 60, 61, 50, +- -1, 52, 53, 54, 55, 56, 57, -1, -1, -1, +- -1, 62, 63, 64, 65, 66, 67, 68, 81, 82, +- 83, 84, 85, 86, 87, 76, -1, -1, -1, 92, +- 93, 94, 95, -1, -1, 98, -1, 88, 89, 90, +- -1, -1, -1, 1, -1, 96, 97, -1, -1, 100, +- 101, 102, 103, 11, -1, 13, 14, 15, 16, 17, +- -1, -1, 20, 21, 22, 23, 24, -1, 26, 27, +- 28, 29, 30, 31, -1, -1, -1, -1, 36, -1, +- -1, -1, -1, -1, -1, -1, 58, 59, 60, 61, +- -1, -1, 50, -1, 52, 53, 54, 55, 56, 57, +- -1, -1, -1, -1, 62, 63, 64, 65, 66, 67, +- 68, 83, 84, 85, 86, 87, -1, -1, 76, -1, +- 92, 93, 94, 95, -1, -1, 98, -1, -1, -1, +- 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, +- -1, 99, 100, -1, 102, 103, 9, -1, 11, -1, +- 13, 14, 15, 16, 17, -1, -1, 20, 21, 22, +- 23, 24, 25, 26, 27, 28, 29, 30, 31, -1, +- -1, -1, -1, 36, -1, -1, -1, -1, -1, -1, +- 58, 59, 60, 61, -1, -1, -1, 50, -1, 52, +- 53, 54, 55, 56, 57, -1, -1, -1, -1, 62, +- 63, 64, 65, 66, 67, 68, 84, 85, 86, 87, +- -1, -1, -1, 76, 92, 93, 94, 95, -1, -1, +- 98, -1, -1, -1, -1, 88, 89, 90, -1, -1, +- -1, -1, -1, 96, 97, -1, -1, 100, -1, 102, +- 103, 9, -1, 11, -1, 13, 14, 15, 16, 17, +- -1, -1, 20, 21, 22, 23, 24, -1, 26, 27, +- 28, 29, 30, 31, -1, -1, -1, -1, 36, -1, +- -1, -1, -1, -1, -1, 58, 59, 60, 61, -1, +- -1, -1, 50, -1, 52, 53, 54, 55, 56, 57, +- -1, -1, -1, -1, 62, 63, 64, 65, 66, 67, +- 68, -1, 85, 86, 87, -1, -1, -1, 76, 92, +- 93, 94, 95, -1, -1, 98, -1, -1, -1, -1, +- 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, +- -1, -1, 100, -1, 102, 103, 11, 12, 13, 14, +- 15, 16, 17, -1, -1, 20, 21, 22, 23, 24, +- -1, 26, 27, 28, 29, 30, 31, -1, -1, -1, +- -1, 36, -1, -1, -1, -1, -1, -1, 58, 59, +- 60, 61, -1, -1, -1, 50, -1, 52, 53, 54, +- 55, 56, 57, -1, -1, -1, -1, 62, 63, 64, +- 65, 66, 67, 68, -1, -1, 86, 87, -1, -1, +- -1, 76, 92, 93, 94, 95, -1, -1, 98, -1, +- -1, -1, -1, 88, 89, 90, -1, -1, -1, -1, +- -1, 96, 97, -1, -1, 100, -1, 102, 103, 11, ++ -1, 88, 89, -1, 91, -1, 93, 94, -1, 1, ++ -1, -1, -1, 100, 101, 102, 103, 9, 10, 11, + -1, 13, 14, 15, 16, 17, -1, -1, 20, 21, + 22, 23, 24, -1, 26, 27, 28, 29, 30, 31, +- -1, -1, -1, -1, 36, -1, -1, -1, -1, -1, +- -1, 58, -1, 60, 61, -1, -1, -1, 50, -1, ++ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, ++ 42, -1, -1, -1, 46, 47, 48, 49, 50, -1, ++ 52, 53, 54, 55, 56, 57, -1, -1, -1, -1, ++ 62, 63, 64, 65, 66, 67, 68, -1, -1, -1, ++ -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, 88, 89, -1, 91, ++ -1, 93, 94, -1, 1, -1, -1, -1, 100, 101, ++ 102, 103, 9, 10, 11, -1, 13, 14, 15, 16, ++ 17, -1, -1, 20, 21, 22, 23, 24, -1, 26, ++ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, ++ 37, 38, 39, 40, 41, 42, -1, -1, -1, 46, ++ 47, 48, 49, 50, -1, 52, 53, 54, 55, 56, ++ 57, -1, -1, -1, -1, 62, 63, 64, 65, 66, ++ 67, 68, -1, -1, -1, -1, -1, -1, -1, 76, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, 88, 89, -1, 91, -1, 93, 94, -1, 1, ++ -1, -1, -1, 100, 101, 102, 103, 9, 10, 11, ++ -1, 13, 14, 15, 16, 17, -1, -1, 20, 21, ++ 22, 23, 24, -1, 26, 27, 28, 29, 30, 31, ++ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, ++ 42, -1, -1, -1, 46, 47, 48, 49, 50, -1, ++ 52, 53, 54, 55, 56, 57, -1, -1, -1, -1, ++ 62, 63, 64, 65, 66, 67, 68, -1, -1, -1, ++ -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, 88, 89, -1, 91, ++ -1, 93, 94, -1, 1, -1, -1, -1, 100, 101, ++ 102, 103, 9, -1, 11, -1, 13, 14, 15, 16, ++ 17, -1, -1, 20, 21, 22, 23, 24, -1, 26, ++ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, ++ 37, 38, 39, 40, 41, 42, -1, -1, -1, 46, ++ 47, 48, 49, 50, -1, 52, 53, 54, 55, 56, ++ 57, -1, -1, -1, -1, 62, 63, 64, 65, 66, ++ 67, 68, -1, -1, 71, -1, -1, -1, -1, 76, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, 88, 89, -1, 91, -1, 93, 94, -1, 1, ++ -1, -1, -1, 100, 101, 102, 103, 9, -1, 11, ++ -1, 13, 14, 15, 16, 17, -1, -1, 20, 21, ++ 22, 23, 24, -1, 26, 27, 28, 29, 30, 31, ++ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, ++ 42, -1, -1, -1, 46, 47, 48, 49, 50, -1, + 52, 53, 54, 55, 56, 57, -1, -1, -1, -1, +- 62, 63, 64, 65, 66, 67, 68, -1, -1, 86, +- 87, -1, -1, -1, 76, 92, 93, 94, 95, -1, +- -1, 98, -1, -1, -1, -1, 88, 89, 90, -1, +- -1, -1, -1, -1, 96, 97, -1, -1, 100, 101, +- 102, 103, 11, -1, 13, 14, 15, 16, 17, -1, ++ 62, 63, 64, 65, 66, 67, 68, -1, -1, -1, ++ -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, 88, 89, -1, 91, ++ -1, 93, 94, -1, 1, -1, -1, -1, 100, 101, ++ 102, 103, 9, -1, 11, -1, 13, 14, 15, 16, ++ 17, -1, -1, 20, 21, 22, 23, 24, -1, 26, ++ 27, 28, 29, 30, 31, 32, -1, 34, 35, 36, ++ 37, 38, 39, 40, 41, 42, -1, -1, -1, 46, ++ 47, 48, 49, 50, -1, 52, 53, 54, 55, 56, ++ 57, -1, -1, -1, -1, 62, 63, 64, 65, 66, ++ 67, 68, -1, -1, -1, -1, -1, -1, -1, 76, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, 88, 89, -1, 91, -1, 93, 94, 1, -1, ++ -1, -1, -1, 100, 101, 102, 103, -1, 11, -1, ++ 13, 14, 15, 16, 17, -1, -1, 20, 21, 22, ++ 23, 24, -1, 26, 27, 28, 29, 30, 31, -1, ++ -1, -1, -1, 36, -1, -1, 51, -1, -1, -1, ++ -1, -1, -1, 58, 59, 60, 61, 50, -1, 52, ++ 53, 54, 55, 56, 57, -1, -1, -1, -1, 62, ++ 63, 64, 65, 66, 67, 68, 81, 82, 83, 84, ++ 85, 86, 87, 76, -1, -1, -1, 92, -1, -1, ++ 95, 96, 97, 98, -1, 88, 89, -1, 91, -1, ++ 93, 94, 1, -1, -1, -1, -1, 100, 101, 102, ++ 103, -1, 11, -1, 13, 14, 15, 16, 17, -1, + -1, 20, 21, 22, 23, 24, -1, 26, 27, 28, + 29, 30, 31, -1, -1, -1, -1, 36, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, 58, 59, 60, 61, -1, ++ -1, 50, -1, 52, 53, 54, 55, 56, 57, -1, ++ -1, -1, -1, 62, 63, 64, 65, 66, 67, 68, ++ 83, 84, 85, 86, 87, -1, -1, 76, -1, 92, ++ -1, -1, 95, 96, 97, 98, -1, -1, -1, 88, ++ 89, -1, 91, -1, 93, 94, -1, -1, -1, -1, ++ 99, 100, -1, 102, 103, 9, -1, 11, -1, 13, ++ 14, 15, 16, 17, -1, -1, 20, 21, 22, 23, ++ 24, 25, 26, 27, 28, 29, 30, 31, -1, -1, ++ -1, -1, 36, -1, -1, -1, -1, -1, -1, 58, ++ 59, 60, 61, -1, -1, -1, 50, -1, 52, 53, ++ 54, 55, 56, 57, -1, -1, -1, -1, 62, 63, ++ 64, 65, 66, 67, 68, 84, 85, 86, 87, -1, ++ -1, -1, 76, 92, -1, -1, 95, 96, 97, 98, ++ -1, -1, -1, -1, 88, 89, -1, 91, -1, 93, ++ 94, -1, -1, -1, -1, -1, 100, -1, 102, 103, ++ 9, -1, 11, -1, 13, 14, 15, 16, 17, -1, ++ -1, 20, 21, 22, 23, 24, -1, 26, 27, 28, ++ 29, 30, 31, -1, -1, -1, -1, 36, -1, -1, ++ -1, -1, -1, -1, 58, 59, 60, 61, -1, -1, + -1, 50, -1, 52, 53, 54, 55, 56, 57, -1, + -1, -1, -1, 62, 63, 64, 65, 66, 67, 68, +- -1, -1, -1, -1, -1, -1, -1, 76, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, +- 89, 90, -1, -1, -1, -1, -1, 96, 97, -1, +- 99, 100, -1, 102, 103, 11, -1, 13, 14, 15, ++ -1, 85, 86, 87, -1, -1, -1, 76, 92, -1, ++ -1, 95, 96, 97, 98, -1, -1, -1, -1, 88, ++ 89, -1, 91, -1, 93, 94, -1, -1, -1, -1, ++ -1, 100, -1, 102, 103, 11, 12, 13, 14, 15, + 16, 17, -1, -1, 20, 21, 22, 23, 24, -1, + 26, 27, 28, 29, 30, 31, -1, -1, -1, -1, +- 36, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ 36, -1, -1, -1, -1, 58, 59, 60, 61, -1, + -1, -1, -1, -1, 50, -1, 52, 53, 54, 55, + 56, 57, -1, -1, -1, -1, 62, 63, 64, 65, +- 66, 67, 68, -1, -1, -1, -1, -1, -1, -1, +- 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, 88, 89, 90, -1, -1, -1, -1, -1, +- 96, 97, -1, 99, 100, -1, 102, 103, 11, -1, ++ 66, 67, 68, 86, 87, -1, -1, -1, -1, 92, ++ 76, -1, 95, 96, 97, 98, -1, -1, -1, -1, ++ -1, -1, 88, 89, -1, 91, -1, 93, 94, -1, ++ -1, -1, -1, -1, 100, -1, 102, 103, 11, -1, + 13, 14, 15, 16, 17, -1, -1, 20, 21, 22, + 23, 24, -1, 26, 27, 28, 29, 30, 31, -1, +- -1, -1, -1, 36, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, 50, -1, 52, ++ -1, -1, -1, 36, -1, -1, -1, -1, 58, 59, ++ 60, 61, -1, -1, -1, -1, -1, 50, -1, 52, + 53, 54, 55, 56, 57, -1, -1, -1, -1, 62, +- 63, 64, 65, 66, 67, 68, -1, -1, -1, -1, +- -1, -1, -1, 76, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, 88, 89, 90, -1, -1, +- -1, -1, -1, 96, 97, -1, 99, 100, -1, 102, ++ 63, 64, 65, 66, 67, 68, 86, 87, -1, -1, ++ -1, -1, 92, 76, -1, 95, 96, 97, 98, -1, ++ -1, -1, -1, -1, -1, 88, 89, -1, 91, -1, ++ 93, 94, -1, -1, -1, -1, -1, 100, 101, 102, + 103, 11, -1, 13, 14, 15, 16, 17, -1, -1, + 20, 21, 22, 23, 24, -1, 26, 27, 28, 29, + 30, 31, -1, -1, -1, -1, 36, -1, -1, -1, +@@ -1039,7 +824,7 @@ static const yytype_int16 yycheck[] = + -1, -1, 62, 63, 64, 65, 66, 67, 68, -1, + -1, -1, -1, -1, -1, -1, 76, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, 89, +- 90, -1, -1, -1, -1, -1, 96, 97, -1, 99, ++ -1, 91, -1, 93, 94, -1, -1, -1, -1, 99, + 100, -1, 102, 103, 11, -1, 13, 14, 15, 16, + 17, -1, -1, 20, 21, 22, 23, 24, -1, 26, + 27, 28, 29, 30, 31, -1, -1, -1, -1, 36, +@@ -1048,8 +833,8 @@ static const yytype_int16 yycheck[] = + 57, -1, -1, -1, -1, 62, 63, 64, 65, 66, + 67, 68, -1, -1, -1, -1, -1, -1, -1, 76, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, 88, 89, 90, -1, -1, -1, -1, -1, 96, +- 97, -1, 99, 100, -1, 102, 103, 11, -1, 13, ++ -1, 88, 89, -1, 91, -1, 93, 94, -1, -1, ++ -1, -1, 99, 100, -1, 102, 103, 11, -1, 13, + 14, 15, 16, 17, -1, -1, 20, 21, 22, 23, + 24, -1, 26, 27, 28, 29, 30, 31, -1, -1, + -1, -1, 36, -1, -1, -1, -1, -1, -1, -1, +@@ -1057,33 +842,60 @@ static const yytype_int16 yycheck[] = + 54, 55, 56, 57, -1, -1, -1, -1, 62, 63, + 64, 65, 66, 67, 68, -1, -1, -1, -1, -1, + -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 88, 89, 90, -1, -1, -1, +- -1, -1, 96, 97, -1, 99, 100, -1, 102, 103, ++ -1, -1, -1, -1, 88, 89, -1, 91, -1, 93, ++ 94, -1, -1, -1, -1, 99, 100, -1, 102, 103, + 11, -1, 13, 14, 15, 16, 17, -1, -1, 20, + 21, 22, 23, 24, -1, 26, 27, 28, 29, 30, + 31, -1, -1, -1, -1, 36, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, + -1, 52, 53, 54, 55, 56, 57, -1, -1, -1, + -1, 62, 63, 64, 65, 66, 67, 68, -1, -1, +- -1, -1, -1, -1, -1, 76, 51, -1, -1, -1, +- -1, -1, -1, 58, 59, 60, 61, 88, 89, 90, +- -1, -1, -1, -1, -1, 96, 97, -1, -1, 100, +- -1, 102, 103, 78, 79, 80, 81, 82, 83, 84, +- 85, 86, 87, -1, -1, -1, -1, 92, 93, 94, +- 95, 51, -1, 98, -1, -1, -1, -1, 58, 59, +- 60, 61, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1, 78, 79, +- -1, 81, 82, 83, 84, 85, 86, 87, -1, -1, +- -1, -1, 92, 93, 94, 95, 51, -1, 98, -1, +- -1, -1, -1, 58, 59, 60, 61, -1, -1, -1, ++ -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, 88, 89, -1, ++ 91, -1, 93, 94, -1, -1, -1, -1, 99, 100, ++ -1, 102, 103, 11, -1, 13, 14, 15, 16, 17, ++ -1, -1, 20, 21, 22, 23, 24, -1, 26, 27, ++ 28, 29, 30, 31, -1, -1, -1, -1, 36, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 50, -1, 52, 53, 54, 55, 56, 57, ++ -1, -1, -1, -1, 62, 63, 64, 65, 66, 67, ++ 68, -1, -1, -1, -1, -1, -1, -1, 76, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ 88, 89, -1, 91, -1, 93, 94, -1, -1, -1, ++ -1, 99, 100, -1, 102, 103, 11, -1, 13, 14, ++ 15, 16, 17, -1, -1, 20, 21, 22, 23, 24, ++ -1, 26, 27, 28, 29, 30, 31, -1, -1, -1, ++ -1, 36, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, 50, -1, 52, 53, 54, ++ 55, 56, 57, -1, -1, -1, -1, 62, 63, 64, ++ 65, 66, 67, 68, -1, -1, -1, -1, -1, -1, ++ -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, 88, 89, -1, 91, -1, 93, 94, ++ -1, -1, -1, -1, 99, 100, -1, 102, 103, 11, ++ -1, 13, 14, 15, 16, 17, -1, -1, 20, 21, ++ 22, 23, 24, -1, 26, 27, 28, 29, 30, 31, ++ -1, -1, -1, -1, 36, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, ++ 52, 53, 54, 55, 56, 57, -1, -1, -1, -1, ++ 62, 63, 64, 65, 66, 67, 68, -1, -1, -1, ++ -1, -1, -1, -1, 76, 51, -1, -1, -1, -1, ++ -1, -1, 58, 59, 60, 61, 88, 89, -1, 91, ++ -1, 93, 94, -1, -1, -1, -1, -1, 100, -1, ++ 102, 103, 78, 79, 80, 81, 82, 83, 84, 85, ++ 86, 87, -1, -1, -1, -1, 92, 51, -1, 95, ++ 96, 97, 98, -1, 58, 59, 60, 61, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, 78, 79, -1, 81, 82, 83, ++ 84, 85, 86, 87, -1, -1, -1, -1, 92, 51, ++ -1, 95, 96, 97, 98, -1, 58, 59, 60, 61, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, 79, -1, 81, 82, 83, 84, +- 85, 86, 87, -1, -1, -1, -1, 92, 93, 94, +- 95, -1, -1, 98 ++ -1, -1, -1, -1, -1, -1, -1, 79, -1, 81, ++ 82, 83, 84, 85, 86, 87, -1, -1, -1, -1, ++ 92, -1, -1, 95, 96, 97, 98 + }; + +-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing +- symbol of state STATE-NUM. */ ++ /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing ++ symbol of state STATE-NUM. */ + static const yytype_uint8 yystos[] = + { + 0, 3, 4, 5, 6, 7, 8, 106, 107, 108, +@@ -1091,7 +903,7 @@ static const yytype_uint8 yystos[] = + 16, 17, 20, 21, 22, 23, 24, 26, 27, 28, + 29, 30, 31, 36, 50, 52, 53, 54, 55, 56, + 57, 62, 63, 64, 65, 66, 67, 68, 76, 88, +- 89, 90, 96, 97, 100, 102, 103, 152, 153, 154, ++ 89, 91, 93, 94, 100, 102, 103, 152, 153, 154, + 157, 158, 159, 160, 161, 162, 164, 167, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 9, 113, 1, + 32, 34, 35, 37, 38, 39, 40, 41, 42, 46, +@@ -1104,9 +916,9 @@ static const yytype_uint8 yystos[] = + 162, 162, 162, 162, 162, 99, 152, 181, 181, 73, + 74, 75, 77, 9, 11, 100, 51, 58, 59, 60, + 61, 78, 79, 81, 82, 83, 84, 85, 86, 87, +- 92, 93, 94, 95, 98, 100, 9, 11, 9, 11, ++ 92, 95, 96, 97, 98, 100, 9, 11, 9, 11, + 9, 11, 9, 115, 144, 145, 20, 142, 100, 100, +- 100, 100, 67, 90, 100, 173, 100, 100, 113, 45, ++ 100, 100, 67, 91, 100, 173, 100, 100, 113, 45, + 134, 101, 39, 40, 41, 42, 46, 48, 121, 122, + 120, 12, 166, 100, 100, 152, 99, 113, 23, 115, + 146, 99, 99, 152, 167, 181, 153, 10, 101, 166, +@@ -1139,6 +951,68 @@ static const yytype_uint8 yystos[] = + 118, 116, 134, 140, 71, 133, 99, 116 + }; + ++ /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ ++static const yytype_uint8 yyr1[] = ++{ ++ 0, 105, 107, 106, 108, 106, 109, 106, 110, 106, ++ 111, 106, 112, 106, 113, 114, 115, 116, 117, 118, ++ 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, ++ 122, 124, 122, 122, 125, 122, 122, 122, 122, 122, ++ 122, 122, 122, 126, 127, 122, 122, 122, 128, 122, ++ 122, 122, 122, 129, 122, 122, 122, 130, 131, 131, ++ 132, 132, 132, 132, 132, 132, 132, 132, 133, 133, ++ 133, 134, 134, 135, 136, 136, 137, 137, 138, 139, ++ 140, 141, 141, 142, 143, 144, 145, 145, 146, 146, ++ 147, 147, 147, 148, 148, 150, 149, 151, 151, 152, ++ 152, 152, 152, 153, 153, 153, 154, 154, 154, 154, ++ 154, 154, 154, 154, 155, 154, 156, 156, 157, 157, ++ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, ++ 157, 157, 158, 158, 158, 158, 158, 158, 158, 158, ++ 158, 158, 158, 158, 158, 158, 159, 159, 159, 159, ++ 159, 159, 159, 159, 159, 160, 160, 160, 160, 160, ++ 160, 161, 161, 162, 162, 162, 162, 162, 162, 162, ++ 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, ++ 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, ++ 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, ++ 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, ++ 162, 163, 162, 162, 162, 162, 162, 164, 164, 165, ++ 165, 165, 165, 165, 166, 166, 167, 167, 168, 168, ++ 169, 170, 170, 170, 171, 171, 172, 173, 174, 175, ++ 176, 176, 177, 178, 178, 179, 179, 180, 180, 181, ++ 181, 181, 181 ++}; ++ ++ /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ ++static const yytype_uint8 yyr2[] = ++{ ++ 0, 2, 0, 4, 0, 3, 0, 3, 0, 3, ++ 0, 3, 0, 3, 4, 7, 0, 4, 0, 0, ++ 2, 0, 2, 1, 1, 2, 2, 1, 4, 0, ++ 7, 0, 10, 4, 0, 7, 7, 7, 6, 6, ++ 2, 8, 8, 0, 0, 13, 9, 8, 0, 11, ++ 9, 7, 2, 0, 8, 2, 1, 2, 0, 3, ++ 1, 1, 3, 3, 3, 3, 3, 3, 0, 2, ++ 6, 0, 2, 0, 0, 1, 0, 1, 1, 1, ++ 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, ++ 0, 2, 1, 2, 1, 0, 3, 1, 1, 3, ++ 3, 3, 1, 2, 3, 1, 3, 5, 6, 3, ++ 3, 5, 2, 4, 0, 5, 1, 1, 5, 4, ++ 5, 4, 5, 6, 5, 4, 5, 4, 3, 6, ++ 4, 5, 3, 3, 3, 3, 3, 3, 3, 3, ++ 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 3, 2, 4, 3, 5, ++ 8, 2, 2, 1, 1, 1, 1, 5, 2, 1, ++ 2, 3, 1, 2, 1, 1, 1, 1, 1, 1, ++ 4, 4, 5, 5, 1, 1, 3, 4, 3, 4, ++ 4, 4, 4, 4, 1, 2, 2, 1, 2, 2, ++ 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, ++ 4, 0, 6, 1, 1, 1, 1, 3, 2, 3, ++ 2, 1, 1, 1, 0, 1, 0, 1, 0, 2, ++ 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, ++ 2, 4, 2, 1, 3, 1, 3, 1, 3, 1, ++ 1, 1, 1 ++}; ++ + typedef enum { + toketype_ival, toketype_opval, toketype_pval + } toketypes; +@@ -1176,6 +1050,6 @@ static const toketypes yy_type_tab[] = + }; + + /* Generated from: +- * 703ebd267cf8ca45f9dee9bc0f4b21511117a0c1dca1c8bc9438ce91950217ae perly.y ++ * 4fd37fdbff6285ba6e9096c2229255ecc6264d2f26835e535cf1c38f387ceae6 perly.y + * a4923588f219644801577c514014847e1e5240f49413fa3b89d3306fa4874d07 regen_perly.pl + * ex: set ro: */ +diff --git a/perly.y b/perly.y +index 200964d..8717258 100644 +--- a/perly.y ++++ b/perly.y +@@ -755,19 +755,31 @@ subscripted: gelem '{' expr ';' '}' /* *main::{something} */ + jmaybe($3)); } + | term ARROW '(' ')' /* $subref->() */ + { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, +- newCVREF(0, scalar($1))); } ++ newCVREF(0, scalar($1))); ++ if (parser->expect == XBLOCK) ++ parser->expect = XOPERATOR; ++ } + | term ARROW '(' expr ')' /* $subref->(@args) */ + { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, + op_append_elem(OP_LIST, $4, +- newCVREF(0, scalar($1)))); } ++ newCVREF(0, scalar($1)))); ++ if (parser->expect == XBLOCK) ++ parser->expect = XOPERATOR; ++ } + + | subscripted '(' expr ')' /* $foo->{bar}->(@args) */ + { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, + op_append_elem(OP_LIST, $3, +- newCVREF(0, scalar($1)))); } ++ newCVREF(0, scalar($1)))); ++ if (parser->expect == XBLOCK) ++ parser->expect = XOPERATOR; ++ } + | subscripted '(' ')' /* $foo->{bar}->() */ + { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, +- newCVREF(0, scalar($1))); } ++ newCVREF(0, scalar($1))); ++ if (parser->expect == XBLOCK) ++ parser->expect = XOPERATOR; ++ } + | '(' expr ')' '[' expr ']' /* list slice */ + { $$ = newSLICEOP(0, $5, $2); } + | QWLIST '[' expr ']' /* list literal slice */ +diff --git a/t/op/postfixderef.t b/t/op/postfixderef.t +index 77988bf..fa066aa 100644 +--- a/t/op/postfixderef.t ++++ b/t/op/postfixderef.t +@@ -16,7 +16,7 @@ BEGIN { + + use strict qw(refs subs); + +-plan(115); ++plan(129); + + { + no strict 'refs'; +@@ -353,3 +353,26 @@ is "$_->@{foo}", "foo->7 8 9", '->@{ does not interpolate without feature'; + is "@{[foo->@[0,1]]}", "7 8", '->@[ inside "@{...}"'; + is "@{[foo->@{foo}]}", "oof", '->@{ inside "@{...}"'; + } ++ ++# parsing of {} subscript as subscript rather than block ++{ ++ sub ppp { "qqq" } ++ my $h = { ppp => "pp", qqq => "qq", rrr => 7 }; ++ is ${$h}{ppp}, "pp"; ++ is ${$h}{"rrr"} - 2, 5; ++ my $ar = [$h]; ++ is $ar->[0]->{ppp}, "pp"; ++ is $ar->[0]->{"rrr"} - 2, 5; ++ is $ar->[0]{ppp}, "pp"; ++ is $ar->[0]{"rrr"} - 2, 5; ++ my $hr = {h=>$h}; ++ is $hr->{"h"}->{ppp}, "pp"; ++ is $hr->{"h"}->{"rrr"} - 2, 5; ++ is $hr->{"h"}{ppp}, "pp"; ++ is $hr->{"h"}{"rrr"} - 2, 5; ++ my $cr = sub { $h }; ++ is $cr->()->{ppp}, "pp"; ++ is $cr->()->{"rrr"} - 2, 5; ++ is $cr->(){ppp}, "pp"; ++ is $cr->(){"rrr"} - 2, 5; ++} +-- +2.13.6 + diff --git a/SOURCES/perl-5.24.3-fix-tainting-of-s-with-overloaded-replacement.patch b/SOURCES/perl-5.24.3-fix-tainting-of-s-with-overloaded-replacement.patch new file mode 100644 index 0000000..f01f478 --- /dev/null +++ b/SOURCES/perl-5.24.3-fix-tainting-of-s-with-overloaded-replacement.patch @@ -0,0 +1,594 @@ +From a56b6643ac9d2bae70dc93d49a08ba1eafa62c30 Mon Sep 17 00:00:00 2001 +From: Zefram +Date: Sun, 19 Nov 2017 09:15:53 +0000 +Subject: [PATCH] fix tainting of s/// with overloaded replacement +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The substitution code was trying to track the taintedness of the +replacement string itself, but it didn't account for the replacement +being an untainted object with overloading that returns a tainted +stringification. It looked at the taintedness of the object value, not +realising that taint could arise during the string concatenation per se. +Change the taint checks to look at the actual TAINT_get flag after string +concatenation. This may falsely ascribe to the replacement taint that +actually came from somewhere else, but the end result is the same anyway: +there's no visible behaviour that distinguishes taint specifically from +the replacement. Also remove a related taint check that seems to be +not needed at all. Fixes [perl #115266]. + +Petr Písař: Ported to 5.24.3. + +Signed-off-by: Petr Písař +--- + pp_ctl.c | 4 +- + pp_hot.c | 4 +- + t/op/taint.t | 429 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- + 3 files changed, 423 insertions(+), 14 deletions(-) + +diff --git a/pp_ctl.c b/pp_ctl.c +index 9150142..97a4607 100644 +--- a/pp_ctl.c ++++ b/pp_ctl.c +@@ -218,9 +218,9 @@ PP(pp_substcont) + SvGETMAGIC(TOPs); /* possibly clear taint on $1 etc: #67962 */ + + /* See "how taint works" above pp_subst() */ +- if (SvTAINTED(TOPs)) +- cx->sb_rxtainted |= SUBST_TAINT_REPL; + sv_catsv_nomg(dstr, POPs); ++ if (UNLIKELY(TAINT_get)) ++ cx->sb_rxtainted |= SUBST_TAINT_REPL; + if (CxONCE(cx) || s < orig || + !CALLREGEXEC(rx, s, cx->sb_strend, orig, + (s == m), cx->sb_targ, NULL, +diff --git a/pp_hot.c b/pp_hot.c +index 243f43a..e80d991 100644 +--- a/pp_hot.c ++++ b/pp_hot.c +@@ -3004,7 +3004,7 @@ PP(pp_subst) + doutf8 = DO_UTF8(dstr); + } + +- if (SvTAINTED(dstr)) ++ if (UNLIKELY(TAINT_get)) + rxtainted |= SUBST_TAINT_REPL; + } + else { +@@ -3181,8 +3181,6 @@ PP(pp_subst) + sv_catsv(dstr, nsv); + } + else sv_catsv(dstr, repl); +- if (UNLIKELY(SvTAINTED(repl))) +- rxtainted |= SUBST_TAINT_REPL; + } + if (once) + break; +diff --git a/t/op/taint.t b/t/op/taint.t +index 846ac23..dbcc418 100644 +--- a/t/op/taint.t ++++ b/t/op/taint.t +@@ -17,7 +17,7 @@ BEGIN { + use strict; + use Config; + +-plan tests => 812; ++plan tests => 1024; + + $| = 1; + +@@ -83,6 +83,8 @@ EndOfCleanup + # Sources of taint: + # The empty tainted value, for tainting strings + my $TAINT = substr($^X, 0, 0); ++# A tainted non-empty string ++my $TAINTXYZ = "xyz".$TAINT; + # A tainted zero, useful for tainting numbers + my $TAINT0; + { +@@ -565,7 +567,7 @@ my $TEST = 'TEST'; + is($one, 'abcd', "$desc: \$1 value"); + } + +- $desc = "substitution with replacement tainted"; ++ $desc = "substitution with partial replacement tainted"; + + $s = 'abcd'; + $res = $s =~ s/(.+)/xyz$TAINT/; +@@ -577,7 +579,7 @@ my $TEST = 'TEST'; + is($res, 1, "$desc: res value"); + is($one, 'abcd', "$desc: \$1 value"); + +- $desc = "substitution /g with replacement tainted"; ++ $desc = "substitution /g with partial replacement tainted"; + + $s = 'abcd'; + $res = $s =~ s/(.)/x$TAINT/g; +@@ -589,7 +591,7 @@ my $TEST = 'TEST'; + is($res, 4, "$desc: res value"); + is($one, 'd', "$desc: \$1 value"); + +- $desc = "substitution /ge with replacement tainted"; ++ $desc = "substitution /ge with partial replacement tainted"; + + $s = 'abc'; + { +@@ -618,7 +620,7 @@ my $TEST = 'TEST'; + is($res, 3, "$desc: res value"); + is($one, 'c', "$desc: \$1 value"); + +- $desc = "substitution /r with replacement tainted"; ++ $desc = "substitution /r with partial replacement tainted"; + + $s = 'abcd'; + $res = $s =~ s/(.+)/xyz$TAINT/r; +@@ -630,6 +632,71 @@ my $TEST = 'TEST'; + is($res, 'xyz', "$desc: res value"); + is($one, 'abcd', "$desc: \$1 value"); + ++ $desc = "substitution with whole replacement tainted"; ++ ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/$TAINTXYZ/; ++ $one = $1; ++ is_tainted($s, "$desc: s tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'xyz', "$desc: s value"); ++ is($res, 1, "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution /g with whole replacement tainted"; ++ ++ $s = 'abcd'; ++ $res = $s =~ s/(.)/$TAINTXYZ/g; ++ $one = $1; ++ is_tainted($s, "$desc: s tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'xyz' x 4, "$desc: s value"); ++ is($res, 4, "$desc: res value"); ++ is($one, 'd', "$desc: \$1 value"); ++ ++ $desc = "substitution /ge with whole replacement tainted"; ++ ++ $s = 'abc'; ++ { ++ my $i = 0; ++ my $j; ++ $res = $s =~ s{(.)}{ ++ $j = $i; # make sure code not tainted ++ $one = $1; ++ isnt_tainted($j, "$desc: code not tainted within /e"); ++ $i++; ++ if ($i == 1) { ++ isnt_tainted($s, "$desc: s not tainted loop 1"); ++ } ++ else { ++ is_tainted($s, "$desc: s tainted loop $i"); ++ } ++ isnt_tainted($one, "$desc: \$1 not tainted within /e"); ++ $TAINTXYZ; ++ }ge; ++ $one = $1; ++ } ++ is_tainted($s, "$desc: s tainted"); ++ isnt_tainted($res, "$desc: res tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'xyz' x 3, "$desc: s value"); ++ is($res, 3, "$desc: res value"); ++ is($one, 'c', "$desc: \$1 value"); ++ ++ $desc = "substitution /r with whole replacement tainted"; ++ ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/$TAINTXYZ/r; ++ $one = $1; ++ isnt_tainted($s, "$desc: s not tainted"); ++ is_tainted($res, "$desc: res tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'abcd', "$desc: s value"); ++ is($res, 'xyz', "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ + { + # now do them all again with "use re 'taint" + +@@ -955,7 +1022,7 @@ my $TEST = 'TEST'; + is($one, 'abcd', "$desc: \$1 value"); + } + +- $desc = "use re 'taint': substitution with replacement tainted"; ++ $desc = "use re 'taint': substitution with partial replacement tainted"; + + $s = 'abcd'; + $res = $s =~ s/(.+)/xyz$TAINT/; +@@ -967,7 +1034,7 @@ my $TEST = 'TEST'; + is($res, 1, "$desc: res value"); + is($one, 'abcd', "$desc: \$1 value"); + +- $desc = "use re 'taint': substitution /g with replacement tainted"; ++ $desc = "use re 'taint': substitution /g with partial replacement tainted"; + + $s = 'abcd'; + $res = $s =~ s/(.)/x$TAINT/g; +@@ -979,7 +1046,7 @@ my $TEST = 'TEST'; + is($res, 4, "$desc: res value"); + is($one, 'd', "$desc: \$1 value"); + +- $desc = "use re 'taint': substitution /ge with replacement tainted"; ++ $desc = "use re 'taint': substitution /ge with partial replacement tainted"; + + $s = 'abc'; + { +@@ -1008,7 +1075,7 @@ my $TEST = 'TEST'; + is($res, 3, "$desc: res value"); + is($one, 'c', "$desc: \$1 value"); + +- $desc = "use re 'taint': substitution /r with replacement tainted"; ++ $desc = "use re 'taint': substitution /r with partial replacement tainted"; + + $s = 'abcd'; + $res = $s =~ s/(.+)/xyz$TAINT/r; +@@ -1020,6 +1087,71 @@ my $TEST = 'TEST'; + is($res, 'xyz', "$desc: res value"); + is($one, 'abcd', "$desc: \$1 value"); + ++ $desc = "use re 'taint': substitution with whole replacement tainted"; ++ ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/$TAINTXYZ/; ++ $one = $1; ++ is_tainted($s, "$desc: s tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'xyz', "$desc: s value"); ++ is($res, 1, "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "use re 'taint': substitution /g with whole replacement tainted"; ++ ++ $s = 'abcd'; ++ $res = $s =~ s/(.)/$TAINTXYZ/g; ++ $one = $1; ++ is_tainted($s, "$desc: s tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'xyz' x 4, "$desc: s value"); ++ is($res, 4, "$desc: res value"); ++ is($one, 'd', "$desc: \$1 value"); ++ ++ $desc = "use re 'taint': substitution /ge with whole replacement tainted"; ++ ++ $s = 'abc'; ++ { ++ my $i = 0; ++ my $j; ++ $res = $s =~ s{(.)}{ ++ $j = $i; # make sure code not tainted ++ $one = $1; ++ isnt_tainted($j, "$desc: code not tainted within /e"); ++ $i++; ++ if ($i == 1) { ++ isnt_tainted($s, "$desc: s not tainted loop 1"); ++ } ++ else { ++ is_tainted($s, "$desc: s tainted loop $i"); ++ } ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ $TAINTXYZ; ++ }ge; ++ $one = $1; ++ } ++ is_tainted($s, "$desc: s tainted"); ++ isnt_tainted($res, "$desc: res tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'xyz' x 3, "$desc: s value"); ++ is($res, 3, "$desc: res value"); ++ is($one, 'c', "$desc: \$1 value"); ++ ++ $desc = "use re 'taint': substitution /r with whole replacement tainted"; ++ ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/$TAINTXYZ/r; ++ $one = $1; ++ isnt_tainted($s, "$desc: s not tainted"); ++ is_tainted($res, "$desc: res tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'abcd', "$desc: s value"); ++ is($res, 'xyz', "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ + # [perl #121854] match taintedness became sticky + # when one match has a taintess result, subseqent matches + # using the same pattern shouldn't necessarily be tainted +@@ -2408,6 +2540,285 @@ is eval { eval $::x.1 }, 1, 'reset does not taint undef'; + } + + ++# taint passing through overloading ++package OvTaint { ++ sub new { bless({ t => $_[1] }, $_[0]) } ++ use overload '""' => sub { $_[0]->{t} ? "hi".$TAINT : "hello" }; ++} ++my $ovclean = OvTaint->new(0); ++my $ovtaint = OvTaint->new(1); ++isnt_tainted("$ovclean", "overload preserves cleanliness"); ++is_tainted("$ovtaint", "overload preserves taint"); ++ ++# substitutions with overloaded replacement ++{ ++ my ($desc, $s, $res, $one); ++ ++ $desc = "substitution with partial replacement overloaded and clean"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/xyz$ovclean/; ++ $one = $1; ++ isnt_tainted($s, "$desc: s not tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'xyzhello', "$desc: s value"); ++ is($res, 1, "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution with partial replacement overloaded and tainted"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/xyz$ovtaint/; ++ $one = $1; ++ is_tainted($s, "$desc: s tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'xyzhi', "$desc: s value"); ++ is($res, 1, "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution with whole replacement overloaded and clean"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/$ovclean/; ++ $one = $1; ++ isnt_tainted($s, "$desc: s not tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'hello', "$desc: s value"); ++ is($res, 1, "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution with whole replacement overloaded and tainted"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/$ovtaint/; ++ $one = $1; ++ is_tainted($s, "$desc: s tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'hi', "$desc: s value"); ++ is($res, 1, "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution /e with partial replacement overloaded and clean"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/"xyz".$ovclean/e; ++ $one = $1; ++ isnt_tainted($s, "$desc: s not tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'xyzhello', "$desc: s value"); ++ is($res, 1, "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution /e with partial replacement overloaded and tainted"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/"xyz".$ovtaint/e; ++ $one = $1; ++ is_tainted($s, "$desc: s tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'xyzhi', "$desc: s value"); ++ is($res, 1, "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution /e with whole replacement overloaded and clean"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/$ovclean/e; ++ $one = $1; ++ isnt_tainted($s, "$desc: s not tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'hello', "$desc: s value"); ++ is($res, 1, "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution /e with whole replacement overloaded and tainted"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/$ovtaint/e; ++ $one = $1; ++ is_tainted($s, "$desc: s tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'hi', "$desc: s value"); ++ is($res, 1, "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution /e with extra code and partial replacement overloaded and clean"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/(my $z++), "xyz".$ovclean/e; ++ $one = $1; ++ isnt_tainted($s, "$desc: s not tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'xyzhello', "$desc: s value"); ++ is($res, 1, "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution /e with extra code and partial replacement overloaded and tainted"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/(my $z++), "xyz".$ovtaint/e; ++ $one = $1; ++ is_tainted($s, "$desc: s tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'xyzhi', "$desc: s value"); ++ is($res, 1, "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution /e with extra code and whole replacement overloaded and clean"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/(my $z++), $ovclean/e; ++ $one = $1; ++ isnt_tainted($s, "$desc: s not tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'hello', "$desc: s value"); ++ is($res, 1, "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution /e with extra code and whole replacement overloaded and tainted"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/(my $z++), $ovtaint/e; ++ $one = $1; ++ is_tainted($s, "$desc: s tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'hi', "$desc: s value"); ++ is($res, 1, "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution /r with partial replacement overloaded and clean"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/xyz$ovclean/r; ++ $one = $1; ++ isnt_tainted($s, "$desc: s not tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'abcd', "$desc: s value"); ++ is($res, 'xyzhello', "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution /r with partial replacement overloaded and tainted"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/xyz$ovtaint/r; ++ $one = $1; ++ isnt_tainted($s, "$desc: s not tainted"); ++ is_tainted($res, "$desc: res tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'abcd', "$desc: s value"); ++ is($res, 'xyzhi', "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution /r with whole replacement overloaded and clean"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/$ovclean/r; ++ $one = $1; ++ isnt_tainted($s, "$desc: s not tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'abcd', "$desc: s value"); ++ is($res, 'hello', "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution /r with whole replacement overloaded and tainted"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.+)/$ovtaint/r; ++ $one = $1; ++ isnt_tainted($s, "$desc: s not tainted"); ++ is_tainted($res, "$desc: res tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'abcd', "$desc: s value"); ++ is($res, 'hi', "$desc: res value"); ++ is($one, 'abcd', "$desc: \$1 value"); ++ ++ $desc = "substitution /g with partial replacement overloaded and clean"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.)/x$ovclean/g; ++ $one = $1; ++ isnt_tainted($s, "$desc: s not tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'xhello' x 4, "$desc: s value"); ++ is($res, 4, "$desc: res value"); ++ is($one, 'd', "$desc: \$1 value"); ++ ++ $desc = "substitution /g with partial replacement overloaded and tainted"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.)/x$ovtaint/g; ++ $one = $1; ++ is_tainted($s, "$desc: s tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'xhi' x 4, "$desc: s value"); ++ is($res, 4, "$desc: res value"); ++ is($one, 'd', "$desc: \$1 value"); ++ ++ $desc = "substitution /g with whole replacement overloaded and clean"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.)/$ovclean/g; ++ $one = $1; ++ isnt_tainted($s, "$desc: s not tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'hello' x 4, "$desc: s value"); ++ is($res, 4, "$desc: res value"); ++ is($one, 'd', "$desc: \$1 value"); ++ ++ $desc = "substitution /g with whole replacement overloaded and tainted"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.)/$ovtaint/g; ++ $one = $1; ++ is_tainted($s, "$desc: s tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'hi' x 4, "$desc: s value"); ++ is($res, 4, "$desc: res value"); ++ is($one, 'd', "$desc: \$1 value"); ++ ++ $desc = "substitution /ge with partial replacement overloaded and clean"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.)/"x".$ovclean/ge; ++ $one = $1; ++ isnt_tainted($s, "$desc: s not tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'xhello' x 4, "$desc: s value"); ++ is($res, 4, "$desc: res value"); ++ is($one, 'd', "$desc: \$1 value"); ++ ++ $desc = "substitution /ge with partial replacement overloaded and tainted"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.)/"x".$ovtaint/ge; ++ $one = $1; ++ is_tainted($s, "$desc: s tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'xhi' x 4, "$desc: s value"); ++ is($res, 4, "$desc: res value"); ++ is($one, 'd', "$desc: \$1 value"); ++ ++ $desc = "substitution /ge with whole replacement overloaded and clean"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.)/$ovclean/ge; ++ $one = $1; ++ isnt_tainted($s, "$desc: s not tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'hello' x 4, "$desc: s value"); ++ is($res, 4, "$desc: res value"); ++ is($one, 'd', "$desc: \$1 value"); ++ ++ $desc = "substitution /ge with whole replacement overloaded and tainted"; ++ $s = 'abcd'; ++ $res = $s =~ s/(.)/$ovtaint/ge; ++ $one = $1; ++ is_tainted($s, "$desc: s tainted"); ++ isnt_tainted($res, "$desc: res not tainted"); ++ isnt_tainted($one, "$desc: \$1 not tainted"); ++ is($s, 'hi' x 4, "$desc: s value"); ++ is($res, 4, "$desc: res value"); ++ is($one, 'd', "$desc: \$1 value"); ++} ++ + # This may bomb out with the alarm signal so keep it last + SKIP: { + skip "No alarm()" unless $Config{d_alarm}; +-- +2.13.6 + diff --git a/SOURCES/perl-5.24.3-perl-131597-ensure-the-GV-slot-is-filled-for-our-foo.patch b/SOURCES/perl-5.24.3-perl-131597-ensure-the-GV-slot-is-filled-for-our-foo.patch new file mode 100644 index 0000000..6fc0fff --- /dev/null +++ b/SOURCES/perl-5.24.3-perl-131597-ensure-the-GV-slot-is-filled-for-our-foo.patch @@ -0,0 +1,64 @@ +From b890486ff0c482cbdec59a0f9beb28275aeee19b Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Mon, 19 Jun 2017 14:59:53 +1000 +Subject: [PATCH] (perl #131597) ensure the GV slot is filled for our [%$@]foo: + attr +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Petr Písař: Ported to 5.24.3. + +Signed-off-by: Petr Písař +--- + op.c | 6 +++--- + t/op/attrs.t | 18 ++++++++++++++++++ + 2 files changed, 21 insertions(+), 3 deletions(-) + +diff --git a/op.c b/op.c +index 2960dd5..8a5fc3f 100644 +--- a/op.c ++++ b/op.c +@@ -3671,9 +3671,9 @@ S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp) + PL_parser->in_my = FALSE; + PL_parser->in_my_stash = NULL; + apply_attrs(GvSTASH(gv), +- (type == OP_RV2SV ? GvSV(gv) : +- type == OP_RV2AV ? MUTABLE_SV(GvAV(gv)) : +- type == OP_RV2HV ? MUTABLE_SV(GvHV(gv)) : MUTABLE_SV(gv)), ++ (type == OP_RV2SV ? GvSVn(gv) : ++ type == OP_RV2AV ? MUTABLE_SV(GvAVn(gv)) : ++ type == OP_RV2HV ? MUTABLE_SV(GvHVn(gv)) : MUTABLE_SV(gv)), + attrs); + } + o->op_private |= OPpOUR_INTRO; +diff --git a/t/op/attrs.t b/t/op/attrs.t +index 219db03..b038c87 100644 +--- a/t/op/attrs.t ++++ b/t/op/attrs.t +@@ -447,4 +447,22 @@ package P126257 { + ::is $@, "", "RT 126257 sub"; + } + ++fresh_perl_is('sub dummy {} our $dummy : Dummy', < +Date: Thu, 2 Nov 2017 20:18:56 +0000 +Subject: [PATCH] (perl #131895) fail stat on names with \0 embedded +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Also lstat() and the file test ops. + +Petr Písař: Port to 5.24.3. + +Signed-off-by: Petr Písař +--- + doio.c | 21 ++++++++++++++++----- + pp_sys.c | 29 +++++++++++++++++++++++------ + t/lib/warnings/pp_sys | 14 ++++++++++++++ + t/op/filetest.t | 10 +++++++++- + t/op/stat.t | 12 +++++++++++- + 5 files changed, 73 insertions(+), 13 deletions(-) + +diff --git a/doio.c b/doio.c +index 6704862..2792c66 100644 +--- a/doio.c ++++ b/doio.c +@@ -1458,7 +1458,7 @@ Perl_my_stat_flags(pTHX_ const U32 flags) + return PL_laststatval; + else { + SV* const sv = TOPs; +- const char *s; ++ const char *s, *d; + STRLEN len; + if ((gv = MAYBE_DEREF_GV_flags(sv,flags))) { + goto do_fstat; +@@ -1472,9 +1472,14 @@ Perl_my_stat_flags(pTHX_ const U32 flags) + s = SvPV_flags_const(sv, len, flags); + PL_statgv = NULL; + sv_setpvn(PL_statname, s, len); +- s = SvPVX_const(PL_statname); /* s now NUL-terminated */ ++ d = SvPVX_const(PL_statname); /* s now NUL-terminated */ + PL_laststype = OP_STAT; +- PL_laststatval = PerlLIO_stat(s, &PL_statcache); ++ if (!IS_SAFE_PATHNAME(s, len, OP_NAME(PL_op))) { ++ PL_laststatval = -1; ++ } ++ else { ++ PL_laststatval = PerlLIO_stat(d, &PL_statcache); ++ } + if (PL_laststatval < 0 && ckWARN(WARN_NEWLINE) && should_warn_nl(s)) { + GCC_DIAG_IGNORE(-Wformat-nonliteral); /* PL_warn_nl is constant */ + Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat"); +@@ -1491,6 +1496,7 @@ Perl_my_lstat_flags(pTHX_ const U32 flags) + static const char* const no_prev_lstat = "The stat preceding -l _ wasn't an lstat"; + dSP; + const char *file; ++ STRLEN len; + SV* const sv = TOPs; + bool isio = FALSE; + if (PL_op->op_flags & OPf_REF) { +@@ -1534,9 +1540,14 @@ Perl_my_lstat_flags(pTHX_ const U32 flags) + HEKfARG(GvENAME_HEK((const GV *) + (SvROK(sv) ? SvRV(sv) : sv)))); + } +- file = SvPV_flags_const_nolen(sv, flags); ++ file = SvPV_flags_const(sv, len, flags); + sv_setpv(PL_statname,file); +- PL_laststatval = PerlLIO_lstat(file,&PL_statcache); ++ if (!IS_SAFE_PATHNAME(file, len, OP_NAME(PL_op))) { ++ PL_laststatval = -1; ++ } ++ else { ++ PL_laststatval = PerlLIO_lstat(file,&PL_statcache); ++ } + if (PL_laststatval < 0 && ckWARN(WARN_NEWLINE) && should_warn_nl(file)) { + GCC_DIAG_IGNORE(-Wformat-nonliteral); /* PL_warn_nl is constant */ + Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "lstat"); +diff --git a/pp_sys.c b/pp_sys.c +index bd55043..1a72e60 100644 +--- a/pp_sys.c ++++ b/pp_sys.c +@@ -2927,19 +2927,24 @@ PP(pp_stat) + } + else { + const char *file; ++ const char *temp; ++ STRLEN len; + if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) { + io = MUTABLE_IO(SvRV(sv)); + if (PL_op->op_type == OP_LSTAT) + goto do_fstat_warning_check; + goto do_fstat_have_io; + } +- + SvTAINTED_off(PL_statname); /* previous tainting irrelevant */ +- sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv)); ++ temp = SvPV_nomg_const(sv, len); ++ sv_setpv(PL_statname, temp); + PL_statgv = NULL; + PL_laststype = PL_op->op_type; + file = SvPV_nolen_const(PL_statname); +- if (PL_op->op_type == OP_LSTAT) ++ if (!IS_SAFE_PATHNAME(temp, len, OP_NAME(PL_op))) { ++ PL_laststatval = -1; ++ } ++ else if (PL_op->op_type == OP_LSTAT) + PL_laststatval = PerlLIO_lstat(file, &PL_statcache); + else + PL_laststatval = PerlLIO_stat(file, &PL_statcache); +@@ -3175,8 +3180,12 @@ PP(pp_ftrread) + + if (use_access) { + #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS) +- const char *name = SvPV_nolen(*PL_stack_sp); +- if (effective) { ++ STRLEN len; ++ const char *name = SvPV(*PL_stack_sp, len); ++ if (!IS_SAFE_PATHNAME(name, len, OP_NAME(PL_op))) { ++ result = -1; ++ } ++ else if (effective) { + # ifdef PERL_EFF_ACCESS + result = PERL_EFF_ACCESS(name, access_mode); + # else +@@ -3501,10 +3510,18 @@ PP(pp_fttext) + } + else { + const char *file; ++ const char *temp; ++ STRLEN temp_len; + int fd; + + assert(sv); +- sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv)); ++ temp = SvPV_nomg_const(sv, temp_len); ++ sv_setpv(PL_statname, temp); ++ if (!IS_SAFE_PATHNAME(temp, temp_len, OP_NAME(PL_op))) { ++ PL_laststatval = -1; ++ PL_laststype = OP_STAT; ++ FT_RETURNUNDEF; ++ } + really_filename: + file = SvPVX_const(PL_statname); + PL_statgv = NULL; +diff --git a/t/lib/warnings/pp_sys b/t/lib/warnings/pp_sys +index 6338964..ded5d7d 100644 +--- a/t/lib/warnings/pp_sys ++++ b/t/lib/warnings/pp_sys +@@ -962,3 +962,17 @@ close $fh; + unlink $file; + EXPECT + syswrite() is deprecated on :utf8 handles at - line 6. ++######## ++# NAME stat on name with \0 ++use warnings; ++my @x = stat("./\0-"); ++my @y = lstat("./\0-"); ++-T ".\0-"; ++-x ".\0-"; ++-l ".\0-"; ++EXPECT ++Invalid \0 character in pathname for stat: ./\0- at - line 2. ++Invalid \0 character in pathname for lstat: ./\0- at - line 3. ++Invalid \0 character in pathname for fttext: .\0- at - line 4. ++Invalid \0 character in pathname for fteexec: .\0- at - line 5. ++Invalid \0 character in pathname for ftlink: .\0- at - line 6. +diff --git a/t/op/filetest.t b/t/op/filetest.t +index 8883381..bd1d08c 100644 +--- a/t/op/filetest.t ++++ b/t/op/filetest.t +@@ -9,7 +9,7 @@ BEGIN { + set_up_inc(qw '../lib ../cpan/Perl-OSType/lib'); + } + +-plan(tests => 53 + 27*14); ++plan(tests => 57 + 27*14); + + if ($^O =~ /MSWin32|cygwin|msys/ && !is_miniperl) { + require Win32; # for IsAdminUser() +@@ -393,3 +393,11 @@ SKIP: { + is $failed_stat2, $failed_stat1, + 'failed -r($gv_with_io_but_no_fp) with and w/out fatal warnings'; + } ++ ++{ ++ # [perl #131895] stat() doesn't fail on filenames containing \0 / NUL ++ ok(!-T "TEST\0-", '-T on name with \0'); ++ ok(!-B "TEST\0-", '-B on name with \0'); ++ ok(!-f "TEST\0-", '-f on name with \0'); ++ ok(!-r "TEST\0-", '-r on name with \0'); ++} +diff --git a/t/op/stat.t b/t/op/stat.t +index 637a902..71193ad 100644 +--- a/t/op/stat.t ++++ b/t/op/stat.t +@@ -25,7 +25,7 @@ if ($^O eq 'MSWin32') { + ${^WIN32_SLOPPY_STAT} = 0; + } + +-plan tests => 118; ++plan tests => 120; + + my $Perl = which_perl(); + +@@ -651,6 +651,16 @@ SKIP: + 'stat on an array of valid paths should return ENOENT'; + } + ++# [perl #131895] stat() doesn't fail on filenames containing \0 / NUL ++ok !stat("TEST\0-"), 'stat on filename with \0'; ++SKIP: { ++ my $link = "TEST.symlink.$$"; ++ my $can_symlink = eval { symlink "TEST", $link }; ++ skip "cannot symlink", 1 unless $can_symlink; ++ ok !lstat("$link\0-"), 'lstat on filename with \0'; ++ unlink $link; ++} ++ + END { + chmod 0666, $tmpfile; + unlink_all $tmpfile; +-- +2.13.6 + diff --git a/SOURCES/perl-5.24.3-perl-132245-don-t-try-to-process-a-char-range-with-n.patch b/SOURCES/perl-5.24.3-perl-132245-don-t-try-to-process-a-char-range-with-n.patch new file mode 100644 index 0000000..b2af6f4 --- /dev/null +++ b/SOURCES/perl-5.24.3-perl-132245-don-t-try-to-process-a-char-range-with-n.patch @@ -0,0 +1,52 @@ +From 86a48d83a7caf38c553000a250ed1359c235f55e Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Thu, 19 Oct 2017 10:46:04 +1100 +Subject: [PATCH] (perl #132245) don't try to process a char range with no + preceding char +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +A range like \N{}-0 eventually results in compilation failing, but +before that, get_and_check_backslash_N_name() attempts to treat +the memory before the empty output of \N{} as a character. + +Petr Písař: Ported to 5.24.3. + +Signed-off-by: Petr Písař +--- + t/lib/warnings/toke | 5 +++++ + toke.c | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +diff --git a/t/lib/warnings/toke b/t/lib/warnings/toke +index 493c8a2..4a521e0 100644 +--- a/t/lib/warnings/toke ++++ b/t/lib/warnings/toke +@@ -1509,3 +1509,8 @@ my $v = 𝛃 - 5; + EXPECT + OPTION regex + (Wide character.*\n)?Warning: Use of "𝛃" without parentheses is ambiguous ++######## ++# NAME tr/// range with empty \N{} at the start ++tr//\N{}-0/; ++EXPECT ++Unknown charname '' is deprecated at - line 1. +diff --git a/toke.c b/toke.c +index f2310cc..3d93fac 100644 +--- a/toke.c ++++ b/toke.c +@@ -2906,8 +2906,8 @@ S_scan_const(pTHX_ char *start) + * at least one character, then see if this next one is a '-', + * indicating the previous one was the start of a range. But + * don't bother if we're too close to the end for the minus to +- * mean that. */ +- if (*s != '-' || s >= send - 1 || s == start) { ++ * mean that, or if we haven't output any characters yet. */ ++ if (*s != '-' || s >= send - 1 || s == start || d == SvPVX(sv)) { + + /* A regular character. Process like any other, but first + * clear any flags */ +-- +2.13.6 + diff --git a/SOURCES/perl-5.24.3-perl-132442-Fix-stack-with-do-my-sub-l-1.patch b/SOURCES/perl-5.24.3-perl-132442-Fix-stack-with-do-my-sub-l-1.patch new file mode 100644 index 0000000..b3eda86 --- /dev/null +++ b/SOURCES/perl-5.24.3-perl-132442-Fix-stack-with-do-my-sub-l-1.patch @@ -0,0 +1,107 @@ +From 264472b6e83dd1a9d0e0e58d75f7162471a5b29b Mon Sep 17 00:00:00 2001 +From: Father Chrysostomos +Date: Tue, 14 Nov 2017 18:55:55 -0800 +Subject: [PATCH] Fix stack with do {my sub l; 1} +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +A block in perl usually compiles to a leave op with an enter inside +it, followed by the statements: + + leave + enter + nextstate + ... expr ... + nextstate + ... expr ... + +If a block contains only one statement, and that statement is suffic- +iently innocuous, then the enter/leave pair to create the scope at run +time get skipped, and instead we have a simple scope op which is not +even executed: + + scope + ex-nextstate + ... expr ... + +The nextstate in this case also gets nulled. + +In the case of do { my sub l; 1 } we were getting a variation of the +latter, that looked like this: + + scope + introcv + clonecv + nextstate + ... expr ... + +The problem here is that nextstate resets the stack, even though a new +scope has not been pushed, so we end up with all existing stack items +from the *outer* scope getting clobbered. + +One can have fun with this and erase everything pushed on to the stack +so far in a given statement: + +$ ./perl -le 'print join "-", 1..10, do {my sub l; ","}, 11..20' +11,12,13,14,15,16,17,18,19,20 + +Here I replaced the first argument to join() from within the do{} +block, after having cleared the stack. + +Why was the op tree was getting muddled up like this? The ‘my sub’ +declaration does not immediately add any ops to the op tree; those ops +get added when the current scope finishing compiling, since those ops +must be inserted at the beginning of the block. + +I have not fully looked into the order that things happen, and why the +nextstate op does not get nulled; but it did not matter, because of +the simple fix: Treat lexical sub declarations as ‘not innocuous’ by +setting the HINT_BLOCK_SCOPE flag when a lexical sub is declared. +Thus, we end up with an enter/leave pair, which creates a +proper scope. + +Petr Písař: Ported to 5.24.3. + +Signed-off-by: Petr Písař +--- + op.c | 2 ++ + t/op/lexsub.t | 5 ++++- + 2 files changed, 6 insertions(+), 1 deletion(-) + +diff --git a/op.c b/op.c +index 8a5fc3f..695bfa4 100644 +--- a/op.c ++++ b/op.c +@@ -7936,6 +7936,8 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block) + + PERL_ARGS_ASSERT_NEWMYSUB; + ++ PL_hints |= HINT_BLOCK_SCOPE; ++ + /* Find the pad slot for storing the new sub. + We cannot use PL_comppad, as it is the pad owned by the new sub. We + need to look in CvOUTSIDE and find the pad belonging to the enclos- +diff --git a/t/op/lexsub.t b/t/op/lexsub.t +index adccf4c..cf90a76 100644 +--- a/t/op/lexsub.t ++++ b/t/op/lexsub.t +@@ -7,7 +7,7 @@ BEGIN { + *bar::is = *is; + *bar::like = *like; + } +-plan 151; ++plan 152; + + # -------------------- Errors with feature disabled -------------------- # + +@@ -967,3 +967,6 @@ like runperl( + { + my sub h; sub{my $x; sub{h}} + } ++ ++is join("-", qw(aa bb), do { my sub lleexx; 123 }, qw(cc dd)), ++ "aa-bb-123-cc-dd", 'do { my sub...} in a list [perl #132442]'; +-- +2.13.6 + diff --git a/SOURCES/perl-5.24.3-set-when-statting-a-closed-filehandle.patch b/SOURCES/perl-5.24.3-set-when-statting-a-closed-filehandle.patch new file mode 100644 index 0000000..a62c5ef --- /dev/null +++ b/SOURCES/perl-5.24.3-set-when-statting-a-closed-filehandle.patch @@ -0,0 +1,211 @@ +From 0a41ca5a68626a0f44e0d552e460e86567e47140 Mon Sep 17 00:00:00 2001 +From: Zefram +Date: Wed, 15 Nov 2017 08:11:37 +0000 +Subject: [PATCH] set $! when statting a closed filehandle +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When a stat fails because it's on a closed or otherwise invalid +filehandle, $! was often not being set, depending on the operation +and the nature of the invalidity. Consistently set it to EBADF. +Fixes [perl #108288]. + +Petr Písař: Ported to 5.24.3. + +Signed-off-by: Petr Písař +--- + MANIFEST | 1 + + doio.c | 10 +++++++++- + pp_sys.c | 22 ++++++++++++--------- + t/op/stat_errors.t | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 80 insertions(+), 10 deletions(-) + create mode 100644 t/op/stat_errors.t + +diff --git a/MANIFEST b/MANIFEST +index fcf7eae..3077142 100644 +--- a/MANIFEST ++++ b/MANIFEST +@@ -5394,6 +5394,7 @@ t/op/sselect.t See if 4 argument select works + t/op/stash.t See if %:: stashes work + t/op/state.t See if state variables work + t/op/stat.t See if stat works ++t/op/stat_errors.t See if stat and file tests handle threshold errors + t/op/study.t See if study works + t/op/studytied.t See if study works with tied scalars + t/op/sub_lval.t See if lvalue subroutines work +diff --git a/doio.c b/doio.c +index 2792c66..f2934c5 100644 +--- a/doio.c ++++ b/doio.c +@@ -1429,8 +1429,11 @@ Perl_my_stat_flags(pTHX_ const U32 flags) + if (PL_op->op_flags & OPf_REF) { + gv = cGVOP_gv; + do_fstat: +- if (gv == PL_defgv) ++ if (gv == PL_defgv) { ++ if (PL_laststatval < 0) ++ SETERRNO(EBADF,RMS_IFI); + return PL_laststatval; ++ } + io = GvIO(gv); + do_fstat_have_io: + PL_laststype = OP_STAT; +@@ -1441,6 +1444,7 @@ Perl_my_stat_flags(pTHX_ const U32 flags) + int fd = PerlIO_fileno(IoIFP(io)); + if (fd < 0) { + /* E.g. PerlIO::scalar has no real fd. */ ++ SETERRNO(EBADF,RMS_IFI); + return (PL_laststatval = -1); + } else { + return (PL_laststatval = PerlLIO_fstat(fd, &PL_statcache)); +@@ -1451,6 +1455,7 @@ Perl_my_stat_flags(pTHX_ const U32 flags) + } + PL_laststatval = -1; + report_evil_fh(gv); ++ SETERRNO(EBADF,RMS_IFI); + return -1; + } + else if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t)) +@@ -1503,6 +1508,8 @@ Perl_my_lstat_flags(pTHX_ const U32 flags) + if (cGVOP_gv == PL_defgv) { + if (PL_laststype != OP_LSTAT) + Perl_croak(aTHX_ "%s", no_prev_lstat); ++ if (PL_laststatval < 0) ++ SETERRNO(EBADF,RMS_IFI); + return PL_laststatval; + } + PL_laststatval = -1; +@@ -1512,6 +1519,7 @@ Perl_my_lstat_flags(pTHX_ const U32 flags) + "Use of -l on filehandle %"HEKf, + HEKfARG(GvENAME_HEK(cGVOP_gv))); + } ++ SETERRNO(EBADF,RMS_IFI); + return -1; + } + if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t)) +diff --git a/pp_sys.c b/pp_sys.c +index 5e0993d..2fcc219 100644 +--- a/pp_sys.c ++++ b/pp_sys.c +@@ -2889,10 +2889,11 @@ PP(pp_stat) + Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat"); + } + +- if (gv != PL_defgv) { +- bool havefp; ++ if (gv == PL_defgv) { ++ if (PL_laststatval < 0) ++ SETERRNO(EBADF,RMS_IFI); ++ } else { + do_fstat_have_io: +- havefp = FALSE; + PL_laststype = OP_STAT; + PL_statgv = gv ? gv : (GV *)io; + sv_setpvs(PL_statname, ""); +@@ -2903,22 +2904,25 @@ PP(pp_stat) + if (IoIFP(io)) { + int fd = PerlIO_fileno(IoIFP(io)); + if (fd < 0) { ++ report_evil_fh(gv); + PL_laststatval = -1; + SETERRNO(EBADF,RMS_IFI); + } else { + PL_laststatval = PerlLIO_fstat(fd, &PL_statcache); +- havefp = TRUE; + } + } else if (IoDIRP(io)) { + PL_laststatval = + PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache); +- havefp = TRUE; + } else { ++ report_evil_fh(gv); + PL_laststatval = -1; ++ SETERRNO(EBADF,RMS_IFI); + } +- } +- else PL_laststatval = -1; +- if (PL_laststatval < 0 && !havefp) report_evil_fh(gv); ++ } else { ++ report_evil_fh(gv); ++ PL_laststatval = -1; ++ SETERRNO(EBADF,RMS_IFI); ++ } + } + + if (PL_laststatval < 0) { +@@ -3415,7 +3419,7 @@ PP(pp_fttty) + else if (name && isDIGIT(*name) && grok_atoUV(name, &uv, NULL) && uv <= PERL_INT_MAX) + fd = (int)uv; + else +- FT_RETURNUNDEF; ++ fd = -1; + if (fd < 0) { + SETERRNO(EBADF,RMS_IFI); + FT_RETURNUNDEF; +diff --git a/t/op/stat_errors.t b/t/op/stat_errors.t +new file mode 100644 +index 0000000..e043c61 +--- /dev/null ++++ b/t/op/stat_errors.t +@@ -0,0 +1,57 @@ ++#!./perl ++ ++BEGIN { ++ chdir 't' if -d 't'; ++ require './test.pl'; ++ set_up_inc('../lib'); ++} ++ ++plan(tests => 2*11*29); ++ ++use Errno qw(EBADF ENOENT); ++ ++open(SCALARFILE, "<", \"wibble") or die $!; ++open(CLOSEDFILE, "<", "./test.pl") or die $!; ++close(CLOSEDFILE) or die $!; ++opendir(CLOSEDDIR, "../lib") or die $!; ++closedir(CLOSEDDIR) or die $!; ++ ++foreach my $op ( ++ qw(stat lstat), ++ (map { "-$_" } qw(r w x o R W X O e z s f d l p S b c t u g k T B M A C)), ++) { ++ foreach my $arg ( ++ (map { ($_, "\\*$_") } ++ qw(NEVEROPENED SCALARFILE CLOSEDFILE CLOSEDDIR _)), ++ "\"tmpnotexist\"", ++ ) { ++ my $argdesc = $arg; ++ if ($arg eq "_") { ++ my @z = lstat "tmpnotexist"; ++ $argdesc .= " with prior stat fail"; ++ } ++ SKIP: { ++ if ($op eq "-l" && $arg =~ /\A\\/) { ++ # The op weirdly stringifies the globref and uses it as ++ # a filename, rather than treating it as a file handle. ++ # That might be a bug, but while that behaviour exists it ++ # needs to be exempted from these tests. ++ skip "-l on globref", 2; ++ } ++ if ($op eq "-t" && $arg eq "\"tmpnotexist\"") { ++ # The op doesn't operate on filenames. ++ skip "-t on filename", 2; ++ } ++ $! = 0; ++ my $res = eval "$op $arg"; ++ my $err = $!; ++ is $res, $op =~ /\A-/ ? undef : !!0, "result of $op $arg"; ++ is 0+$err, ++ $arg eq "\"tmpnotexist\"" || ++ ($op =~ /\A-[TB]\z/ && $arg =~ /_\z/) ? ENOENT : EBADF, ++ "error from $op $arg"; ++ } ++ } ++} ++ ++1; +-- +2.13.6 + diff --git a/SOURCES/perl-5.24.4-Fix-131649-extended-charclass-can-trigger-assert.patch b/SOURCES/perl-5.24.4-Fix-131649-extended-charclass-can-trigger-assert.patch new file mode 100644 index 0000000..b6cf161 --- /dev/null +++ b/SOURCES/perl-5.24.4-Fix-131649-extended-charclass-can-trigger-assert.patch @@ -0,0 +1,270 @@ +From 10ce49389ea9ee26a3b02b6494b0a3849d56c6fa Mon Sep 17 00:00:00 2001 +From: Yves Orton +Date: Mon, 26 Jun 2017 13:19:55 +0200 +Subject: [PATCH] fix #131649 - extended charclass can trigger assert + +The extended charclass parser makes some assumptions during the +first pass which are only true on well structured input, and it +does not properly catch various errors. later on the code assumes +that things the first pass will let through are valid, when in +fact they should trigger errors. + +(cherry picked from commit 19a498a461d7c81ae3507c450953d1148efecf4f) +--- + pod/perldiag.pod | 27 ++++++++++++++++++++++++++- + pod/perlrecharclass.pod | 4 ++-- + regcomp.c | 28 ++++++++++++++++++---------- + t/lib/warnings/regcomp | 6 +++--- + t/re/reg_mesg.t | 29 ++++++++++++++++------------- + t/re/regex_sets.t | 6 +++--- + 6 files changed, 68 insertions(+), 32 deletions(-) + +diff --git a/pod/perldiag.pod b/pod/perldiag.pod +index 106fe41121..c29925a2a4 100644 +--- a/pod/perldiag.pod ++++ b/pod/perldiag.pod +@@ -5904,7 +5904,7 @@ yourself. + a perl4 interpreter, especially if the next 2 tokens are "use strict" + or "my $var" or "our $var". + +-=item Syntax error in (?[...]) in regex m/%s/ ++=item Syntax error in (?[...]) in regex; marked by <-- HERE in m/%s/ + + (F) Perl could not figure out what you meant inside this construct; this + notifies you that it is giving up trying. +@@ -6402,6 +6402,31 @@ to find out why that isn't happening. + (F) The unexec() routine failed for some reason. See your local FSF + representative, who probably put it there in the first place. + ++=item Unexpected ']' with no following ')' in (?[... in regex; marked by <-- HERE in m/%s/ ++ ++(F) While parsing an extended character class a ']' character was encountered ++at a point in the definition where the only legal use of ']' is to close the ++character class definition as part of a '])', you may have forgotten the close ++paren, or otherwise confused the parser. ++ ++=item Expecting close paren for nested extended charclass in regex; marked by <-- HERE in m/%s/ ++ ++(F) While parsing a nested extended character class like: ++ ++ (?[ ... (?flags:(?[ ... ])) ... ]) ++ ^ ++ ++we expected to see a close paren ')' (marked by ^) but did not. ++ ++=item Expecting close paren for wrapper for nested extended charclass in regex; marked by <-- HERE in m/%s/ ++ ++(F) While parsing a nested extended character class like: ++ ++ (?[ ... (?flags:(?[ ... ])) ... ]) ++ ^ ++ ++we expected to see a close paren ')' (marked by ^) but did not. ++ + =item Unexpected binary operator '%c' with no preceding operand in regex; + marked by S<<-- HERE> in m/%s/ + +diff --git a/pod/perlrecharclass.pod b/pod/perlrecharclass.pod +index 79480e4131..8c008507d1 100644 +--- a/pod/perlrecharclass.pod ++++ b/pod/perlrecharclass.pod +@@ -1128,8 +1128,8 @@ hence both of the following work: + Any contained POSIX character classes, including things like C<\w> and C<\D> + respect the Ca> (and Caa>) modifiers. + +-C<< (?[ ]) >> is a regex-compile-time construct. Any attempt to use +-something which isn't knowable at the time the containing regular ++Note that C<< (?[ ]) >> is a regex-compile-time construct. Any attempt ++to use something which isn't knowable at the time the containing regular + expression is compiled is a fatal error. In practice, this means + just three limitations: + +diff --git a/regcomp.c b/regcomp.c +index 4ee48ede42..ddac290d2b 100644 +--- a/regcomp.c ++++ b/regcomp.c +@@ -14840,8 +14840,9 @@ S_handle_regex_sets(pTHX_ RExC_state_t *pRExC_state, SV** return_invlist, + TRUE /* Force /x */ ); + + switch (*RExC_parse) { +- case '?': +- if (RExC_parse[1] == '[') depth++, RExC_parse++; ++ case '(': ++ if (RExC_parse[1] == '?' && RExC_parse[2] == '[') ++ depth++, RExC_parse+=2; + /* FALLTHROUGH */ + default: + break; +@@ -14898,9 +14899,9 @@ S_handle_regex_sets(pTHX_ RExC_state_t *pRExC_state, SV** return_invlist, + } + + case ']': +- if (depth--) break; +- RExC_parse++; +- if (*RExC_parse == ')') { ++ if (RExC_parse[1] == ')') { ++ RExC_parse++; ++ if (depth--) break; + node = reganode(pRExC_state, ANYOF, 0); + RExC_size += ANYOF_SKIP; + nextchar(pRExC_state); +@@ -14912,20 +14913,25 @@ S_handle_regex_sets(pTHX_ RExC_state_t *pRExC_state, SV** return_invlist, + + return node; + } +- goto no_close; ++ /* We output the messages even if warnings are off, because we'll fail ++ * the very next thing, and these give a likely diagnosis for that */ ++ if (posix_warnings && av_tindex_nomg(posix_warnings) >= 0) { ++ output_or_return_posix_warnings(pRExC_state, posix_warnings, NULL); ++ } ++ RExC_parse++; ++ vFAIL("Unexpected ']' with no following ')' in (?[..."); + } + + RExC_parse += UTF ? UTF8SKIP(RExC_parse) : 1; + } + +- no_close: + /* We output the messages even if warnings are off, because we'll fail + * the very next thing, and these give a likely diagnosis for that */ + if (posix_warnings && av_tindex_nomg(posix_warnings) >= 0) { + output_or_return_posix_warnings(pRExC_state, posix_warnings, NULL); + } + +- FAIL("Syntax error in (?[...])"); ++ vFAIL("Syntax error in (?[...])"); + } + + /* Pass 2 only after this. */ +@@ -15105,12 +15111,14 @@ redo_curchar: + * inversion list, and RExC_parse points to the trailing + * ']'; the next character should be the ')' */ + RExC_parse++; +- assert(UCHARAT(RExC_parse) == ')'); ++ if (UCHARAT(RExC_parse) != ')') ++ vFAIL("Expecting close paren for nested extended charclass"); + + /* Then the ')' matching the original '(' handled by this + * case: statement */ + RExC_parse++; +- assert(UCHARAT(RExC_parse) == ')'); ++ if (UCHARAT(RExC_parse) != ')') ++ vFAIL("Expecting close paren for wrapper for nested extended charclass"); + + RExC_parse++; + RExC_flags = save_flags; +diff --git a/t/lib/warnings/regcomp b/t/lib/warnings/regcomp +index 2b084c59b0..51ad57ccbe 100644 +--- a/t/lib/warnings/regcomp ++++ b/t/lib/warnings/regcomp +@@ -59,21 +59,21 @@ Unmatched [ in regex; marked by <-- HERE in m/abc[ <-- HERE fi[.00./ at - line + qr/(?[[[:word]]])/; + EXPECT + Assuming NOT a POSIX class since there is no terminating ':' in regex; marked by <-- HERE in m/(?[[[:word <-- HERE ]]])/ at - line 2. +-syntax error in (?[...]) in regex m/(?[[[:word]]])/ at - line 2. ++Unexpected ']' with no following ')' in (?[... in regex; marked by <-- HERE in m/(?[[[:word]] <-- HERE ])/ at - line 2. + ######## + # NAME qr/(?[ [[:digit: ])/ + # OPTION fatal + qr/(?[[[:digit: ])/; + EXPECT + Assuming NOT a POSIX class since no blanks are allowed in one in regex; marked by <-- HERE in m/(?[[[:digit: ] <-- HERE )/ at - line 2. +-syntax error in (?[...]) in regex m/(?[[[:digit: ])/ at - line 2. ++syntax error in (?[...]) in regex; marked by <-- HERE in m/(?[[[:digit: ]) <-- HERE / at - line 2. + ######## + # NAME qr/(?[ [:digit: ])/ + # OPTION fatal + qr/(?[[:digit: ])/ + EXPECT + Assuming NOT a POSIX class since no blanks are allowed in one in regex; marked by <-- HERE in m/(?[[:digit: ] <-- HERE )/ at - line 2. +-syntax error in (?[...]) in regex m/(?[[:digit: ])/ at - line 2. ++syntax error in (?[...]) in regex; marked by <-- HERE in m/(?[[:digit: ]) <-- HERE / at - line 2. + ######## + # NAME [perl #126141] + # OPTION fatal +diff --git a/t/re/reg_mesg.t b/t/re/reg_mesg.t +index d26a7caf37..5194d93751 100644 +--- a/t/re/reg_mesg.t ++++ b/t/re/reg_mesg.t +@@ -215,8 +215,9 @@ my @death = + '/\b{gc}/' => "'gc' is an unknown bound type {#} m/\\b{gc{#}}/", + '/\B{gc}/' => "'gc' is an unknown bound type {#} m/\\B{gc{#}}/", + +- '/(?[[[::]]])/' => "Syntax error in (?[...]) in regex m/(?[[[::]]])/", +- '/(?[[[:w:]]])/' => "Syntax error in (?[...]) in regex m/(?[[[:w:]]])/", ++ ++ '/(?[[[::]]])/' => "Unexpected ']' with no following ')' in (?[... {#} m/(?[[[::]]{#}])/", ++ '/(?[[[:w:]]])/' => "Unexpected ']' with no following ')' in (?[... {#} m/(?[[[:w:]]{#}])/", + '/(?[[:w:]])/' => "", + '/([.].*)[.]/' => "", # [perl #127582] + '/[.].*[.]/' => "", # [perl #127604] +@@ -239,11 +240,12 @@ my @death = + '/(?[ \p{foo} ])/' => 'Can\'t find Unicode property definition "foo" {#} m/(?[ \p{foo}{#} ])/', + '/(?[ \p{ foo = bar } ])/' => 'Can\'t find Unicode property definition "foo = bar" {#} m/(?[ \p{ foo = bar }{#} ])/', + '/(?[ \8 ])/' => 'Unrecognized escape \8 in character class {#} m/(?[ \8{#} ])/', +- '/(?[ \t ]/' => 'Syntax error in (?[...]) in regex m/(?[ \t ]/', +- '/(?[ [ \t ]/' => 'Syntax error in (?[...]) in regex m/(?[ [ \t ]/', +- '/(?[ \t ] ]/' => 'Syntax error in (?[...]) in regex m/(?[ \t ] ]/', +- '/(?[ [ ] ]/' => 'Syntax error in (?[...]) in regex m/(?[ [ ] ]/', +- '/(?[ \t + \e # This was supposed to be a comment ])/' => 'Syntax error in (?[...]) in regex m/(?[ \t + \e # This was supposed to be a comment ])/', ++ '/(?[ \t ]/' => "Unexpected ']' with no following ')' in (?[... {#} m/(?[ \\t ]{#}/", ++ '/(?[ [ \t ]/' => "Syntax error in (?[...]) {#} m/(?[ [ \\t ]{#}/", ++ '/(?[ \t ] ]/' => "Unexpected ']' with no following ')' in (?[... {#} m/(?[ \\t ]{#} ]/", ++ '/(?[ [ ] ]/' => "Syntax error in (?[...]) {#} m/(?[ [ ] ]{#}/", ++ '/(?[ \t + \e # This was supposed to be a comment ])/' => ++ "Syntax error in (?[...]) {#} m/(?[ \\t + \\e # This was supposed to be a comment ]){#}/", + '/(?[ ])/' => 'Incomplete expression within \'(?[ ])\' {#} m/(?[ {#}])/', + 'm/(?[[a-\d]])/' => 'False [] range "a-\d" {#} m/(?[[a-\d{#}]])/', + 'm/(?[[\w-x]])/' => 'False [] range "\w-" {#} m/(?[[\w-{#}x]])/', +@@ -431,10 +433,10 @@ my @death_utf8 = mark_as_utf8( + + '/ネ\p{}ネ/' => 'Empty \p{} {#} m/ネ\p{{#}}ネ/', + +- '/ネ(?[[[:ネ]]])ネ/' => "Syntax error in (?[...]) in regex m/ネ(?[[[:ネ]]])ネ/", +- '/ネ(?[[[:ネ: ])ネ/' => "Syntax error in (?[...]) in regex m/ネ(?[[[:ネ: ])ネ/", +- '/ネ(?[[[::]]])ネ/' => "Syntax error in (?[...]) in regex m/ネ(?[[[::]]])ネ/", +- '/ネ(?[[[:ネ:]]])ネ/' => "Syntax error in (?[...]) in regex m/ネ(?[[[:ネ:]]])ネ/", ++ '/ネ(?[[[:ネ]]])ネ/' => "Unexpected ']' with no following ')' in (?[... {#} m/ネ(?[[[:ネ]]{#}])ネ/", ++ '/ネ(?[[[:ネ: ])ネ/' => "Syntax error in (?[...]) {#} m/ネ(?[[[:ネ: ])ネ{#}/", ++ '/ネ(?[[[::]]])ネ/' => "Unexpected ']' with no following ')' in (?[... {#} m/ネ(?[[[::]]{#}])ネ/", ++ '/ネ(?[[[:ネ:]]])ネ/' => "Unexpected ']' with no following ')' in (?[... {#} m/ネ(?[[[:ネ:]]{#}])ネ/", + '/ネ(?[[:ネ:]])ネ/' => "", + '/ネ(?[ネ])ネ/' => 'Unexpected character {#} m/ネ(?[ネ{#}])ネ/', + '/ネ(?[ + [ネ] ])/' => 'Unexpected binary operator \'+\' with no preceding operand {#} m/ネ(?[ +{#} [ネ] ])/', +@@ -447,8 +449,9 @@ my @death_utf8 = mark_as_utf8( + '/(?[ \x{ネ} ])ネ/' => 'Non-hex character {#} m/(?[ \x{ネ{#}} ])ネ/', + '/(?[ \p{ネ} ])/' => 'Can\'t find Unicode property definition "ネ" {#} m/(?[ \p{ネ}{#} ])/', + '/(?[ \p{ ネ = bar } ])/' => 'Can\'t find Unicode property definition "ネ = bar" {#} m/(?[ \p{ ネ = bar }{#} ])/', +- '/ネ(?[ \t ]/' => 'Syntax error in (?[...]) in regex m/ネ(?[ \t ]/', +- '/(?[ \t + \e # ネ This was supposed to be a comment ])/' => 'Syntax error in (?[...]) in regex m/(?[ \t + \e # ネ This was supposed to be a comment ])/', ++ '/ネ(?[ \t ]/' => "Unexpected ']' with no following ')' in (?[... {#} m/ネ(?[ \\t ]{#}/", ++ '/(?[ \t + \e # ネ This was supposed to be a comment ])/' => ++ "Syntax error in (?[...]) {#} m/(?[ \\t + \\e # ネ This was supposed to be a comment ]){#}/", + 'm/(*ネ)ネ/' => q, + '/\cネ/' => "Character following \"\\c\" must be printable ASCII", + '/\b{ネ}/' => "'ネ' is an unknown bound type {#} m/\\b{ネ{#}}/", +diff --git a/t/re/regex_sets.t b/t/re/regex_sets.t +index 6a79f9d692..e9644bd4e6 100644 +--- a/t/re/regex_sets.t ++++ b/t/re/regex_sets.t +@@ -158,13 +158,13 @@ for my $char ("٠", "٥", "٩") { + eval { $_ = '/(?[(\c]) /'; qr/$_/ }; + like($@, qr/^Syntax error/, '/(?[(\c]) / should not panic'); + eval { $_ = '(?[\c#]' . "\n])"; qr/$_/ }; +- like($@, qr/^Syntax error/, '/(?[(\c]) / should not panic'); ++ like($@, qr/^Unexpected/, '/(?[(\c]) / should not panic'); + eval { $_ = '(?[(\c])'; qr/$_/ }; + like($@, qr/^Syntax error/, '/(?[(\c])/ should be a syntax error'); + eval { $_ = '(?[(\c]) ]\b'; qr/$_/ }; +- like($@, qr/^Syntax error/, '/(?[(\c]) ]\b/ should be a syntax error'); ++ like($@, qr/^Unexpected/, '/(?[(\c]) ]\b/ should be a syntax error'); + eval { $_ = '(?[\c[]](])'; qr/$_/ }; +- like($@, qr/^Syntax error/, '/(?[\c[]](])/ should be a syntax error'); ++ like($@, qr/^Unexpected/, '/(?[\c[]](])/ should be a syntax error'); + like("\c#", qr/(?[\c#])/, '\c# should match itself'); + like("\c[", qr/(?[\c[])/, '\c[ should match itself'); + like("\c\ ", qr/(?[\c\])/, '\c\ should match itself'); +-- +2.11.0 + diff --git a/SOURCES/perl-5.24.4-Fix-heap-buffer-overflow-write-reg_node-overrun.patch b/SOURCES/perl-5.24.4-Fix-heap-buffer-overflow-write-reg_node-overrun.patch new file mode 100644 index 0000000..d76c039 Binary files /dev/null and b/SOURCES/perl-5.24.4-Fix-heap-buffer-overflow-write-reg_node-overrun.patch differ diff --git a/SOURCES/perl-5.24.4-Pass-CFLAGS-to-dtrace.patch b/SOURCES/perl-5.24.4-Pass-CFLAGS-to-dtrace.patch new file mode 100644 index 0000000..069027c --- /dev/null +++ b/SOURCES/perl-5.24.4-Pass-CFLAGS-to-dtrace.patch @@ -0,0 +1,44 @@ +diff -up perl-5.24.4/Makefile.SH.orig perl-5.24.4/Makefile.SH +--- perl-5.24.4/Makefile.SH.orig 2018-10-02 12:18:23.627226701 +0200 ++++ perl-5.24.4/Makefile.SH 2018-10-02 13:35:03.858920366 +0200 +@@ -451,6 +451,8 @@ CCCMD = sh $(shellflags) cflags "opti + + CCCMDSRC = sh $(shellflags) cflags "optimize='$(OPTIMIZE)'" $< + ++DTRACEFLAGS = sh $(shellflags) cflags "optimize='$(OPTIMIZE)'" $@ ++ + CONFIGPM_FROM_CONFIG_SH = lib/Config.pm lib/Config_heavy.pl + CONFIGPM = $(CONFIGPM_FROM_CONFIG_SH) lib/Config_git.pl + +@@ -865,13 +867,13 @@ mydtrace.h: $(DTRACE_H) + define) + $spitshell >>$Makefile <<'!NO!SUBS!' + $(DTRACE_MINI_O): perldtrace.d $(miniperl_objs_nodt) +- $(DTRACE) -G -s perldtrace.d -o $(DTRACE_MINI_O) $(miniperl_objs_nodt) ++ CFLAGS="`$(DTRACEFLAGS)`" $(DTRACE) -G -s perldtrace.d -o $(DTRACE_MINI_O) $(miniperl_objs_nodt) + + $(DTRACE_PERLLIB_O): perldtrace.d $(perllib_objs_nodt) +- $(DTRACE) -G -s perldtrace.d -o $(DTRACE_PERLLIB_O) $(perllib_objs_nodt) ++ CFLAGS="`$(DTRACEFLAGS)`" $(DTRACE) -G -s perldtrace.d -o $(DTRACE_PERLLIB_O) $(perllib_objs_nodt) + + $(DTRACE_MAIN_O): perldtrace.d perlmain$(OBJ_EXT) +- $(DTRACE) -G -s perldtrace.d -o $(DTRACE_MAIN_O) perlmain$(OBJ_EXT) ++ CFLAGS="`$(DTRACEFLAGS)`" $(DTRACE) -G -s perldtrace.d -o $(DTRACE_MAIN_O) perlmain$(OBJ_EXT) + + !NO!SUBS! + ;; +diff -up perl-5.24.4/cflags.SH.orig perl-5.24.4/cflags.SH +--- perl-5.24.4/cflags.SH.orig 2018-10-02 14:37:09.368649895 +0200 ++++ perl-5.24.4/cflags.SH 2018-10-02 14:39:10.785695193 +0200 +@@ -518,7 +518,10 @@ for file do + esac + + # Can we perhaps use $ansi2knr here +- echo "$cc -c -DPERL_CORE $ccflags $stdflags $optimize $warn $extra" ++ case "$file" in ++ dtrace_*) echo "$ccflags $stdflags $optimize $warn $extra";; ++ *) echo "$cc -c -DPERL_CORE $ccflags $stdflags $optimize $warn $extra" ++ esac + + . $TOP/config.sh + diff --git a/SOURCES/perl-5.24.4-Perl_my_setenv-handle-integer-wrap.patch b/SOURCES/perl-5.24.4-Perl_my_setenv-handle-integer-wrap.patch new file mode 100644 index 0000000..78ead17 --- /dev/null +++ b/SOURCES/perl-5.24.4-Perl_my_setenv-handle-integer-wrap.patch @@ -0,0 +1,175 @@ +From 34716e2a6ee2af96078d62b065b7785c001194be Mon Sep 17 00:00:00 2001 +From: David Mitchell +Date: Fri, 29 Jun 2018 13:37:03 +0100 +Subject: [PATCH] Perl_my_setenv(); handle integer wrap + +RT #133204 + +Wean this function off int/I32 and onto UV/Size_t. +Also, replace all malloc-ish calls with a wrapper that does +overflow checks, + +In particular, it was doing (nlen + vlen + 2) which could wrap when +the combined length of the environment variable name and value +exceeded around 0x7fffffff. + +The wrapper check function is probably overkill, but belt and braces... + +NB this function has several variant parts, #ifdef'ed by platform +type; I have blindly changed the parts that aren't compiled under linux. +--- + util.c | 76 ++++++++++++++++++++++++++++++++++++++++------------------ + 1 file changed, 53 insertions(+), 23 deletions(-) + +diff --git a/util.c b/util.c +index 7282dd9cfe..c5c7becc0f 100644 +--- a/util.c ++++ b/util.c +@@ -2162,8 +2162,40 @@ Perl_new_warnings_bitfield(pTHX_ STRLEN *buffer, const char *const bits, + *(s+(nlen+1+vlen)) = '\0' + + #ifdef USE_ENVIRON_ARRAY +- /* VMS' my_setenv() is in vms.c */ ++ ++/* small wrapper for use by Perl_my_setenv that mallocs, or reallocs if ++ * 'current' is non-null, with up to three sizes that are added together. ++ * It handles integer overflow. ++ */ ++static char * ++S_env_alloc(void *current, Size_t l1, Size_t l2, Size_t l3, Size_t size) ++{ ++ void *p; ++ Size_t sl, l = l1 + l2; ++ ++ if (l < l2) ++ goto panic; ++ l += l3; ++ if (l < l3) ++ goto panic; ++ sl = l * size; ++ if (sl < l) ++ goto panic; ++ ++ p = current ++ ? safesysrealloc(current, sl) ++ : safesysmalloc(sl); ++ if (p) ++ return (char*)p; ++ ++ panic: ++ croak_memory_wrap(); ++} ++ ++ ++/* VMS' my_setenv() is in vms.c */ + #if !defined(WIN32) && !defined(NETWARE) ++ + void + Perl_my_setenv(pTHX_ const char *nam, const char *val) + { +@@ -2179,28 +2211,27 @@ Perl_my_setenv(pTHX_ const char *nam, const char *val) + #ifndef PERL_USE_SAFE_PUTENV + if (!PL_use_safe_putenv) { + /* most putenv()s leak, so we manipulate environ directly */ +- I32 i; +- const I32 len = strlen(nam); +- int nlen, vlen; ++ UV i; ++ Size_t vlen, nlen = strlen(nam); + + /* where does it go? */ + for (i = 0; environ[i]; i++) { +- if (strnEQ(environ[i],nam,len) && environ[i][len] == '=') ++ if (strnEQ(environ[i], nam, nlen) && environ[i][nlen] == '=') + break; + } + + if (environ == PL_origenviron) { /* need we copy environment? */ +- I32 j; +- I32 max; ++ UV j, max; + char **tmpenv; + + max = i; + while (environ[max]) + max++; +- tmpenv = (char**)safesysmalloc((max+2) * sizeof(char*)); ++ /* XXX shouldn't that be max+1 rather than max+2 ??? - DAPM */ ++ tmpenv = (char**)S_env_alloc(NULL, max, 2, 0, sizeof(char*)); + for (j=0; j +Date: Mon, 9 Jul 2018 16:18:36 +0200 +Subject: [PATCH] Remove ext/GDBM_File/t/fatal.t +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +gdbm-1.15 defaults to a memory-mapped I/O and does not report any I/O +errors on store and close operations. Thus ext/GDBM_File/t/fatal.t +test that expects these fatal error reports fails. Because there is +no other way to provoke a fatal error in gdbm-1.15 this patch +removes the test. Future gdbm version promisses reporting a regular +error on closing a database. + +RT#133295 + +Signed-off-by: Petr Písař +--- + MANIFEST | 1 - + ext/GDBM_File/t/fatal.t | 49 ------------------------------------------------- + 2 files changed, 50 deletions(-) + delete mode 100644 ext/GDBM_File/t/fatal.t + +diff --git a/MANIFEST b/MANIFEST +index a1a5320..ed5d05f 100644 +--- a/MANIFEST ++++ b/MANIFEST +@@ -3719,7 +3719,6 @@ ext/GDBM_File/GDBM_File.pm GDBM extension Perl module + ext/GDBM_File/GDBM_File.xs GDBM extension external subroutines + ext/GDBM_File/hints/sco.pl Hint for GDBM_File for named architecture + ext/GDBM_File/Makefile.PL GDBM extension makefile writer +-ext/GDBM_File/t/fatal.t Test the fatal_func argument to gdbm_open + ext/GDBM_File/t/gdbm.t See if GDBM_File works + ext/GDBM_File/typemap GDBM extension interface types + ext/Hash-Util/Changes Change history of Hash::Util +diff --git a/ext/GDBM_File/t/fatal.t b/ext/GDBM_File/t/fatal.t +deleted file mode 100644 +index b7045ba..0000000 +--- a/ext/GDBM_File/t/fatal.t ++++ /dev/null +@@ -1,49 +0,0 @@ +-#!./perl -w +-use strict; +- +-use Test::More; +-use Config; +- +-BEGIN { +- plan(skip_all => "GDBM_File was not built") +- unless $Config{extensions} =~ /\bGDBM_File\b/; +- +- # https://rt.perl.org/Public/Bug/Display.html?id=117967 +- plan(skip_all => "GDBM_File is flaky in $^O") +- if $^O =~ /darwin/; +- +- plan(tests => 8); +- use_ok('GDBM_File'); +-} +- +-unlink ; +- +-open my $fh, $^X or die "Can't open $^X: $!"; +-my $fileno = fileno $fh; +-isnt($fileno, undef, "Can find next available file descriptor"); +-close $fh or die $!; +- +-is((open $fh, "<&=$fileno"), undef, +- "Check that we cannot open fileno $fileno. \$! is $!"); +- +-umask(0); +-my %h; +-isa_ok(tie(%h, 'GDBM_File', 'Op_dbmx', GDBM_WRCREAT, 0640), 'GDBM_File'); +- +-isnt((open $fh, "<&=$fileno"), undef, "dup fileno $fileno") +- or diag("\$! = $!"); +-isnt(close $fh, undef, +- "close fileno $fileno, out from underneath the GDBM_File"); +-is(eval { +- $h{Perl} = 'Rules'; +- untie %h; +- 1; +-}, undef, 'Trapped error when attempting to write to knobbled GDBM_File'); +- +-# Observed "File write error" and "lseek error" from two different systems. +-# So there might be more variants. Important part was that we trapped the error +-# via croak. +-like($@, qr/ at .*\bfatal\.t line \d+\.\n\z/, +- 'expected error message from GDBM_File'); +- +-unlink ; +-- +2.14.4 + diff --git a/SOURCES/perl-5.24.4-perform-system-arg-processing-before-fork.patch b/SOURCES/perl-5.24.4-perform-system-arg-processing-before-fork.patch new file mode 100644 index 0000000..bc986d0 --- /dev/null +++ b/SOURCES/perl-5.24.4-perform-system-arg-processing-before-fork.patch @@ -0,0 +1,90 @@ +From bee36f5b5aad82c566311cf8785aa67ba3696155 Mon Sep 17 00:00:00 2001 +From: Zefram +Date: Sat, 16 Dec 2017 05:33:20 +0000 +Subject: [PATCH] perform system() arg processing before fork +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +A lot of things can happen when stringifying an argument list: side +effects, warnings, exceptions. In the case of system(), these effects +should happen in the context of the parent process. The stringification +can also depend on which process it happens in, as in the case of +$$, and in that case it should also happen in the parent process. +Therefore reduce the argument scalars to strings first thing in pp_system. +Fixes [perl #121105]. + +Petr Písař: Ported to 5.24.4 from +64def2aeaeb63f92dadc6dfa33486c1d7b311963. + +Signed-off-by: Petr Písař +--- + pp_sys.c | 16 ++++++++++------ + t/op/exec.t | 15 ++++++++++++++- + 2 files changed, 24 insertions(+), 7 deletions(-) + +diff --git a/pp_sys.c b/pp_sys.c +index 2fcc219..4ce8540 100644 +--- a/pp_sys.c ++++ b/pp_sys.c +@@ -4343,14 +4343,18 @@ PP(pp_system) + int result; + # endif + ++ while (++MARK <= SP) { ++ SV *origsv = *MARK; ++ STRLEN len; ++ char *pv; ++ pv = SvPV(origsv, len); ++ *MARK = newSVpvn_flags(pv, len, ++ (SvFLAGS(origsv) & SVf_UTF8) | SVs_TEMP); ++ } ++ MARK = ORIGMARK; ++ + if (TAINTING_get) { + TAINT_ENV(); +- while (++MARK <= SP) { +- (void)SvPV_nolen_const(*MARK); /* stringify for taint check */ +- if (TAINT_get) +- break; +- } +- MARK = ORIGMARK; + TAINT_PROPER("system"); + } + PERL_FLUSHALL_FOR_CHILD; +diff --git a/t/op/exec.t b/t/op/exec.t +index 726f548..e43dd6e 100644 +--- a/t/op/exec.t ++++ b/t/op/exec.t +@@ -36,7 +36,7 @@ $ENV{LANGUAGE} = 'C'; # Ditto in GNU. + my $Is_VMS = $^O eq 'VMS'; + my $Is_Win32 = $^O eq 'MSWin32'; + +-plan(tests => 33); ++plan(tests => 36); + + my $Perl = which_perl(); + +@@ -173,6 +173,19 @@ TODO: { + "exec failure doesn't terminate process"); + } + ++package CountRead { ++ sub TIESCALAR { bless({ n => 0 }, $_[0]) } ++ sub FETCH { ++$_[0]->{n} } ++} ++my $cr; ++tie $cr, "CountRead"; ++is system($^X, "-e", "exit(\$ARGV[0] eq '1' ? 0 : 1)", $cr), 0, ++ "system args have magic processed exactly once"; ++is tied($cr)->{n}, 1, "system args have magic processed before fork"; ++ ++is system($^X, "-e", "exit(\$ARGV[0] eq \$ARGV[1] ? 0 : 1)", "$$", $$), 0, ++ "system args have magic processed before fork"; ++ + my $test = curr_test(); + exec $Perl, '-le', qq{${quote}print 'ok $test - exec PROG, LIST'${quote}}; + fail("This should never be reached if the exec() worked"); +-- +2.14.3 + diff --git a/SOURCES/perl-5.24.4-perl-129149-avoid-a-heap-buffer-overflow-with-pack-W.patch b/SOURCES/perl-5.24.4-perl-129149-avoid-a-heap-buffer-overflow-with-pack-W.patch new file mode 100644 index 0000000..76337e8 --- /dev/null +++ b/SOURCES/perl-5.24.4-perl-129149-avoid-a-heap-buffer-overflow-with-pack-W.patch @@ -0,0 +1,65 @@ +From cd6b0f4e030d55ff077e9bc8fbcf156ab79dceb1 Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Wed, 7 Sep 2016 16:51:39 +1000 +Subject: [PATCH] (perl #129149) avoid a heap buffer overflow with pack "W"... +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Petr Písař: Ported to 5.24.4: + +From bf4a926a29374161655548b149d1cb37300bcc05 Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Wed, 7 Sep 2016 16:51:39 +1000 +Subject: [PATCH] (perl #129149) avoid a heap buffer overflow with pack "W"... + +Signed-off-by: Petr Písař +--- + pp_pack.c | 2 +- + t/op/pack.t | 13 ++++++++++++- + 2 files changed, 13 insertions(+), 2 deletions(-) + +diff --git a/pp_pack.c b/pp_pack.c +index c0de5ab..29fdb01 100644 +--- a/pp_pack.c ++++ b/pp_pack.c +@@ -2598,7 +2598,7 @@ S_pack_rec(pTHX_ SV *cat, tempsym_t* symptr, SV **beglist, SV **endlist ) + if (in_bytes) auv = auv % 0x100; + if (utf8) { + W_utf8: +- if (cur > end) { ++ if (cur >= end) { + *cur = '\0'; + SvCUR_set(cat, cur - start); + +diff --git a/t/op/pack.t b/t/op/pack.t +index a480c3a..cf5ae78 100644 +--- a/t/op/pack.t ++++ b/t/op/pack.t +@@ -12,7 +12,7 @@ my $no_endianness = $] > 5.009 ? '' : + my $no_signedness = $] > 5.009 ? '' : + "Signed/unsigned pack modifiers not available on this perl"; + +-plan tests => 14716; ++plan tests => 14717; + + use strict; + use warnings qw(FATAL all); +@@ -2066,3 +2066,14 @@ SKIP: + fresh_perl_like('pack "c10f1073741824"', qr/Out of memory during pack/, { stderr => 1 }, + "integer overflow calculating allocation (multiply)"); + } ++ ++{ ++ # [perl #129149] the code below would write one past the end of the output ++ # buffer, only detected by ASAN, not by valgrind ++ $Config{ivsize} >= 8 ++ or skip "[perl #129149] need 64-bit for this test", 1; ++ fresh_perl_is(<<'EOS', "ok\n", { stderr => 1 }, "pack W overflow"); ++print pack("ucW", "0000", 0, 140737488355327) eq "\$,#`P,```\n\0\x{7fffffffffff}" ++ ? "ok\n" : "not ok\n"; ++EOS ++} +-- +2.14.3 + diff --git a/SOURCES/perl-5.24.4-perl-129149-fix-the-test-so-skip-has-a-SKIP-to-work-.patch b/SOURCES/perl-5.24.4-perl-129149-fix-the-test-so-skip-has-a-SKIP-to-work-.patch new file mode 100644 index 0000000..026d329 --- /dev/null +++ b/SOURCES/perl-5.24.4-perl-129149-fix-the-test-so-skip-has-a-SKIP-to-work-.patch @@ -0,0 +1,37 @@ +From 308112b17f3d093c11cc25408a421c86364de828 Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Tue, 17 Jan 2017 15:36:31 +1100 +Subject: [PATCH] (perl #129149) fix the test so skip has a SKIP: to work with +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Thanks to bulk88 for pointing this out. + +Petr Písař: Ported to 5.24.4 from: + +From 30be69c851a7fa7e29d85c9b6e070273df82f3e7 Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Tue, 17 Jan 2017 15:36:31 +1100 +Subject: [PATCH] (perl #129149) fix the test so skip has a SKIP: to work with + +Signed-off-by: Petr Písař +--- + t/op/pack.t | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/t/op/pack.t b/t/op/pack.t +index cf5ae78..e399f7e 100644 +--- a/t/op/pack.t ++++ b/t/op/pack.t +@@ -2067,6 +2067,7 @@ SKIP: + "integer overflow calculating allocation (multiply)"); + } + ++SKIP: + { + # [perl #129149] the code below would write one past the end of the output + # buffer, only detected by ASAN, not by valgrind +-- +2.14.3 + diff --git a/SOURCES/perl-5.24.4-perl-129350-anchored-floating-substrings-must-be-utf.patch b/SOURCES/perl-5.24.4-perl-129350-anchored-floating-substrings-must-be-utf.patch new file mode 100644 index 0000000..9fa716d --- /dev/null +++ b/SOURCES/perl-5.24.4-perl-129350-anchored-floating-substrings-must-be-utf.patch @@ -0,0 +1,56 @@ +From f34cc5af94622240abbf730ac82c4f91cc4ffb83 Mon Sep 17 00:00:00 2001 +From: Hugo van der Sanden +Date: Tue, 4 Oct 2016 14:40:11 +0100 +Subject: [PATCH] anchored/floating substrings must be utf8 if target is +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ported to 5.24.4: + +commit 2814f4b3549f665a6f9203ac9e890ae1e415e0dc +Author: Hugo van der Sanden +Date: Tue Oct 4 14:40:11 2016 +0100 + + [perl #129350] anchored/floating substrings must be utf8 if target is + + If the target is utf8 and either the anchored or floating substrings + are not, we need to create utf8 copies to check against. The state + of the two substrings may not be the same, but we were only testing + whichever we planned to check first. + +Signed-off-by: Petr Písař +--- + regexec.c | 3 ++- + t/re/re_tests | 1 + + 2 files changed, 3 insertions(+), 1 deletion(-) + +diff --git a/regexec.c b/regexec.c +index ff8e89c..6904546 100644 +--- a/regexec.c ++++ b/regexec.c +@@ -703,7 +703,8 @@ Perl_re_intuit_start(pTHX_ + reginfo->poscache_maxiter = 0; + + if (utf8_target) { +- if (!prog->check_utf8 && prog->check_substr) ++ if ((!prog->anchored_utf8 && prog->anchored_substr) ++ || (!prog->float_utf8 && prog->float_substr)) + to_utf8_substr(prog); + check = prog->check_utf8; + } else { +diff --git a/t/re/re_tests b/t/re/re_tests +index ab7ddbb..8b0feaa 100644 +--- a/t/re/re_tests ++++ b/t/re/re_tests +@@ -1969,6 +1969,7 @@ ab(?#Comment){2}c abbc y $& abbc + aa$|a(?R)a|a aaa y $& aaa # [perl 128420] recursive matches + (?:\1|a)([bcd])\1(?:(?R)|e)\1 abbaccaddedcb y $& abbaccaddedcb # [perl 128420] recursive match with backreferences + (?il)\x{100}|\x{100}|\x{FF} \xFF y $& \xFF ++\b\z0*\x{100} .\x{100} n - - # [perl #129350] crashed in intuit_start + + # Keep these lines at the end of the file + # vim: softtabstop=0 noexpandtab +-- +2.14.3 + diff --git a/SOURCES/perl-5.24.4-perl-130307-Correctly-unwind-on-cache-hit.patch b/SOURCES/perl-5.24.4-perl-130307-Correctly-unwind-on-cache-hit.patch new file mode 100644 index 0000000..58c8e2f --- /dev/null +++ b/SOURCES/perl-5.24.4-perl-130307-Correctly-unwind-on-cache-hit.patch @@ -0,0 +1,53 @@ +From 7ec44a7b6adbc0221150969fc61134322fd5ed85 Mon Sep 17 00:00:00 2001 +From: Hugo van der Sanden +Date: Mon, 12 Dec 2016 15:15:06 +0000 +Subject: [PATCH] Correctly unwind on cache hit +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Petr Pisar: Ported to 5.24.4: + +commit d3c48e81594c1d64ba9833495e45d8951b42027c +Author: Hugo van der Sanden +Date: Mon Dec 12 15:15:06 2016 +0000 + + [perl #130307] Correctly unwind on cache hit + + We've already incremented curlyx.count in the WHILEM branch before + we check for a hit in the super-linear cache, so must reverse that + on the sayNO. + +Signed-off-by: Petr Písař +--- + regexec.c | 1 + + t/re/re_tests | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/regexec.c b/regexec.c +index 6904546..25ea3a3 100644 +--- a/regexec.c ++++ b/regexec.c +@@ -7334,6 +7334,7 @@ NULL + DEBUG_EXECUTE_r( Perl_re_exec_indentf( aTHX_ "whilem: (cache) already tried at this position...\n", + depth) + ); ++ cur_curlyx->u.curlyx.count--; + sayNO; /* cache records failure */ + } + ST.cache_offset = offset; +diff --git a/t/re/re_tests b/t/re/re_tests +index 8b0feaa..6717b85 100644 +--- a/t/re/re_tests ++++ b/t/re/re_tests +@@ -1970,6 +1970,7 @@ aa$|a(?R)a|a aaa y $& aaa # [perl 128420] recursive matches + (?:\1|a)([bcd])\1(?:(?R)|e)\1 abbaccaddedcb y $& abbaccaddedcb # [perl 128420] recursive match with backreferences + (?il)\x{100}|\x{100}|\x{FF} \xFF y $& \xFF + \b\z0*\x{100} .\x{100} n - - # [perl #129350] crashed in intuit_start ++(X{2,}[-X]{1,4}){3,}X{2,} XXX-XXX-XXX-- n - - # [perl #130307] + + # Keep these lines at the end of the file + # vim: softtabstop=0 noexpandtab +-- +2.14.3 + diff --git a/SOURCES/perl-5.25.10-fix-VMS-test-fail.patch b/SOURCES/perl-5.25.10-fix-VMS-test-fail.patch new file mode 100644 index 0000000..38cc190 --- /dev/null +++ b/SOURCES/perl-5.25.10-fix-VMS-test-fail.patch @@ -0,0 +1,44 @@ +From bce4a2abeb8652d19e97d3bf07dd2580a3cc2e6c Mon Sep 17 00:00:00 2001 +From: Hugo van der Sanden +Date: Sat, 25 Feb 2017 10:42:17 +0000 +Subject: [PATCH] fix VMS test fail +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +d7186add added a runperl() test that breaks command line length limits for +VMS. Switch to fresh_perl() instead, so the prog is put in a file for us. + +Signed-off-by: Petr Písař +--- + t/comp/parser_run.t | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/t/comp/parser_run.t b/t/comp/parser_run.t +index 2543f49..e74644d 100644 +--- a/t/comp/parser_run.t ++++ b/t/comp/parser_run.t +@@ -14,14 +14,14 @@ plan(1); + + # [perl #130814] can reallocate lineptr while looking ahead for + # "Missing $ on loop variable" diagnostic. +-my $result = runperl( +- prog => " foreach m0\n\$" . ("0" x 0x2000), +- stderr => 1, ++my $result = fresh_perl( ++ " foreach m0\n\$" . ("0" x 0x2000), ++ { stderr => 1 }, + ); +-is($result, < +Date: Sun, 19 Feb 2017 11:15:38 +0000 +Subject: [PATCH] [perl #130814] Add testcase, and new testfile + t/comp/parser_run.t +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Sometimes it's useful to have test.pl around, but it seems inappropriate +to pollute the existing t/comp/parser.t with that. + +Signed-off-by: Petr Písař +--- + t/comp/parser_run.t | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + create mode 100644 t/comp/parser_run.t + +diff --git a/t/comp/parser_run.t b/t/comp/parser_run.t +new file mode 100644 +index 0000000..2543f49 +--- /dev/null ++++ b/t/comp/parser_run.t +@@ -0,0 +1,28 @@ ++#!./perl ++ ++# Parser tests that want test.pl, eg to use runperl() for tests to show ++# reads through invalid pointers. ++# Note that this should still be runnable under miniperl. ++ ++BEGIN { ++ @INC = qw(. ../lib ); ++ chdir 't' if -d 't'; ++} ++ ++require './test.pl'; ++plan(1); ++ ++# [perl #130814] can reallocate lineptr while looking ahead for ++# "Missing $ on loop variable" diagnostic. ++my $result = runperl( ++ prog => " foreach m0\n\$" . ("0" x 0x2000), ++ stderr => 1, ++); ++is($result, < +Date: Thu, 7 Jul 2016 17:03:29 +0100 +Subject: [PATCH] SEGV in "Subroutine redefined" warning +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RT #128257 + +The following SEGVed: + + sub P::f{} + undef *P::; + *P::f =sub{}; + +due to the code which generates the "Subroutine STASH::NAME redefined" +warning assuming that the GV always has a stash. Make it so that if it +hasn't, the message changes to "Subroutine NAME redefined" rather than +just crashing. + +Signed-off-by: Petr Písař +--- + sv.c | 18 +++++++++++------- + t/lib/warnings/sv | 8 ++++++++ + 2 files changed, 19 insertions(+), 7 deletions(-) + +diff --git a/sv.c b/sv.c +index 1b7a283..0cbe371 100644 +--- a/sv.c ++++ b/sv.c +@@ -4074,14 +4074,18 @@ Perl_gv_setref(pTHX_ SV *const dstr, SV *const sstr) + CvCONST((const CV *)sref) + ? cv_const_sv((const CV *)sref) + : NULL; ++ HV * const stash = GvSTASH((const GV *)dstr); + report_redefined_cv( +- sv_2mortal(Perl_newSVpvf(aTHX_ +- "%"HEKf"::%"HEKf, +- HEKfARG( +- HvNAME_HEK(GvSTASH((const GV *)dstr)) +- ), +- HEKfARG(GvENAME_HEK(MUTABLE_GV(dstr))) +- )), ++ sv_2mortal( ++ stash ++ ? Perl_newSVpvf(aTHX_ ++ "%"HEKf"::%"HEKf, ++ HEKfARG(HvNAME_HEK(stash)), ++ HEKfARG(GvENAME_HEK(MUTABLE_GV(dstr)))) ++ : Perl_newSVpvf(aTHX_ ++ "%"HEKf, ++ HEKfARG(GvENAME_HEK(MUTABLE_GV(dstr)))) ++ ), + cv, + CvCONST((const CV *)sref) ? &new_const_sv : NULL + ); +diff --git a/t/lib/warnings/sv b/t/lib/warnings/sv +index 5ddd4fe..c8e0e62 100644 +--- a/t/lib/warnings/sv ++++ b/t/lib/warnings/sv +@@ -413,3 +413,11 @@ Argument "a_c" isn't numeric in preincrement (++) at - line 5. + Argument "(?^:abc)" isn't numeric in preincrement (++) at - line 6. + Argument "123x" isn't numeric in preincrement (++) at - line 7. + Argument "123e" isn't numeric in preincrement (++) at - line 8. ++######## ++# RT #128257 This used to SEGV ++use warnings; ++sub Foo::f {} ++undef *Foo::; ++*Foo::f =sub {}; ++EXPECT ++Subroutine f redefined at - line 5. +-- +2.5.5 + diff --git a/SOURCES/perl-5.25.2-only-treat-stash-entries-with-.-as-sub-stashes.patch b/SOURCES/perl-5.25.2-only-treat-stash-entries-with-.-as-sub-stashes.patch new file mode 100644 index 0000000..57e96c2 --- /dev/null +++ b/SOURCES/perl-5.25.2-only-treat-stash-entries-with-.-as-sub-stashes.patch @@ -0,0 +1,64 @@ +From e7acdfe976f01ee0d1ba31b3b1db61454a72d6c9 Mon Sep 17 00:00:00 2001 +From: David Mitchell +Date: Tue, 21 Jun 2016 17:06:52 +0100 +Subject: [PATCH] only treat stash entries with .*:: as sub-stashes +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RT #128238 + +%: = 0 would cause an assertion failure in Perl_gv_check(), since when +it searched a stash for substashes, it assumed anything ending in ':' was +a substash, whereas substashes end in '::'. So check for a double colon +before recursing. + +Signed-off-by: Petr Písař +--- + gv.c | 5 ++++- + t/op/stash.t | 9 ++++++++- + 2 files changed, 12 insertions(+), 2 deletions(-) + +diff --git a/gv.c b/gv.c +index 4df3bce..2b3bdfa 100644 +--- a/gv.c ++++ b/gv.c +@@ -2423,7 +2423,10 @@ Perl_gv_check(pTHX_ HV *stash) + for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) { + GV *gv; + HV *hv; +- if (HeKEY(entry)[HeKLEN(entry)-1] == ':' && ++ STRLEN keylen = HeKLEN(entry); ++ const char * const key = HeKEY(entry); ++ ++ if (keylen >= 2 && key[keylen-2] == ':' && key[keylen-1] == ':' && + (gv = MUTABLE_GV(HeVAL(entry))) && isGV(gv) && (hv = GvHV(gv))) + { + if (hv != PL_defstash && hv != stash +diff --git a/t/op/stash.t b/t/op/stash.t +index b8e0f34..ec795a9 100644 +--- a/t/op/stash.t ++++ b/t/op/stash.t +@@ -7,7 +7,7 @@ BEGIN { + + BEGIN { require "./test.pl"; } + +-plan( tests => 52 ); ++plan( tests => 53 ); + + # Used to segfault (bug #15479) + fresh_perl_like( +@@ -341,3 +341,10 @@ is runperl( + ), + "ok\n", + '[perl #128086] no crash from assigning hash to *:::::: & deleting it'; ++ ++is runperl( ++ prog => 'BEGIN { %: = 0; $^W=1}; print qq|ok\n|', ++ stderr => 1, ++ ), ++ "ok\n", ++ "[perl #128238] don't treat %: as a stash (needs 2 colons)" +-- +2.5.5 + diff --git a/SOURCES/perl-5.25.2-perl-128238-Crash-with-non-stash-in-stash.patch b/SOURCES/perl-5.25.2-perl-128238-Crash-with-non-stash-in-stash.patch new file mode 100644 index 0000000..b6f007e --- /dev/null +++ b/SOURCES/perl-5.25.2-perl-128238-Crash-with-non-stash-in-stash.patch @@ -0,0 +1,66 @@ +From 9e5cda6b852ca831004628051cf32c1576146452 Mon Sep 17 00:00:00 2001 +From: Father Chrysostomos +Date: Thu, 23 Jun 2016 21:57:09 -0700 +Subject: [PATCH] [perl #128238] Crash with non-stash in stash +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This is a follow-up to e7acdfe976f. Even if the name of the stash +entry ends with ::, it may not itself contain a real stash (though +this only happens with code that assigns directly to stash entries, +which has undefined behaviour according to perlmod), so skip hashes +that are not stashes. + +Signed-off-by: Petr Písař +--- + gv.c | 4 ++-- + t/op/stash.t | 11 +++++++++-- + 2 files changed, 11 insertions(+), 4 deletions(-) + +diff --git a/gv.c b/gv.c +index 2b3bdfa..dff611e 100644 +--- a/gv.c ++++ b/gv.c +@@ -2411,10 +2411,10 @@ Perl_gv_check(pTHX_ HV *stash) + + PERL_ARGS_ASSERT_GV_CHECK; + +- if (!HvARRAY(stash)) ++ if (!SvOOK(stash)) + return; + +- assert(SvOOK(stash)); ++ assert(HvARRAY(stash)); + + for (i = 0; i <= (I32) HvMAX(stash); i++) { + const HE *entry; +diff --git a/t/op/stash.t b/t/op/stash.t +index 1591dbf..fe42700 100644 +--- a/t/op/stash.t ++++ b/t/op/stash.t +@@ -7,7 +7,7 @@ BEGIN { + + BEGIN { require "./test.pl"; } + +-plan( tests => 53 ); ++plan( tests => 54 ); + + # Used to segfault (bug #15479) + fresh_perl_like( +@@ -342,4 +342,11 @@ is runperl( + stderr => 1, + ), + "ok\n", +- "[perl #128238] don't treat %: as a stash (needs 2 colons)" ++ "[perl #128238] don't treat %: as a stash (needs 2 colons)"; ++ ++is runperl( ++ prog => 'BEGIN { $::{q|foo::|}=*ENV; $^W=1}; print qq|ok\n|', ++ stderr => 1, ++ ), ++ "ok\n", ++ "[perl #128238] non-stashes in stashes"; +-- +2.5.5 + diff --git a/SOURCES/perl-5.25.2-perl-128532-Crash-vivifying-stub-in-deleted-pkg.patch b/SOURCES/perl-5.25.2-perl-128532-Crash-vivifying-stub-in-deleted-pkg.patch new file mode 100644 index 0000000..fc517b9 --- /dev/null +++ b/SOURCES/perl-5.25.2-perl-128532-Crash-vivifying-stub-in-deleted-pkg.patch @@ -0,0 +1,60 @@ +From 63aab7ecaa6e826f845c405894bd8c4b6f601b39 Mon Sep 17 00:00:00 2001 +From: Father Chrysostomos +Date: Sun, 3 Jul 2016 22:23:34 -0700 +Subject: [PATCH] [perl #128532] Crash vivifying stub in deleted pkg +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +v5.17.0-515-g186a5ba, which added newSTUB, did not take into account +that a GV may have a null GvSTASH pointer, if its stash has been +freed, so this crashes: + +delete $My::{"Foo::"}; \&My::Foo::foo + +Signed-off-by: Petr Písař +--- + op.c | 2 +- + t/op/ref.t | 6 +++++- + 2 files changed, 6 insertions(+), 2 deletions(-) + +diff --git a/op.c b/op.c +index 46e76ac..4735d1b 100644 +--- a/op.c ++++ b/op.c +@@ -9081,7 +9081,7 @@ Perl_newSTUB(pTHX_ GV *gv, bool fake) + assert(!GvCVu(gv)); + GvCV_set(gv, cv); + GvCVGEN(gv) = 0; +- if (!fake && HvENAME_HEK(GvSTASH(gv))) ++ if (!fake && GvSTASH(gv) && HvENAME_HEK(GvSTASH(gv))) + gv_method_changed(gv); + if (SvFAKE(gv)) { + cvgv = gv_fetchsv((SV *)gv, GV_ADDMULTI, SVt_PVCV); +diff --git a/t/op/ref.t b/t/op/ref.t +index 19a44bb..84d9217 100644 +--- a/t/op/ref.t ++++ b/t/op/ref.t +@@ -8,7 +8,7 @@ BEGIN { + + use strict qw(refs subs); + +-plan(235); ++plan(236); + + # Test this first before we extend the stack with other operations. + # This caused an asan failure due to a bad write past the end of the stack. +@@ -124,6 +124,10 @@ is (join(':',@{$spring2{"foo"}}), "1:2:3:4"); + is ($called, 1); + } + is ref eval {\&{""}}, "CODE", 'reference to &{""} [perl #94476]'; ++delete $My::{"Foo::"}; ++is ref \&My::Foo::foo, "CODE", ++ 'creating stub with \&deleted_stash::foo [perl #128532]'; ++ + + # Test references to return values of operators (TARGs/PADTMPs) + { +-- +2.5.5 + diff --git a/SOURCES/perl-5.25.2-t-test.pl-Add-fresh_perl-function.patch b/SOURCES/perl-5.25.2-t-test.pl-Add-fresh_perl-function.patch new file mode 100644 index 0000000..24d7f60 --- /dev/null +++ b/SOURCES/perl-5.25.2-t-test.pl-Add-fresh_perl-function.patch @@ -0,0 +1,74 @@ +From f6203e997f3012b8aab4cd35fe49f58e4d71fb8c Mon Sep 17 00:00:00 2001 +From: Karl Williamson +Date: Sun, 10 Jul 2016 22:06:12 -0600 +Subject: [PATCH] t/test.pl: Add fresh_perl() function +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This will be useful for cases where the results don't readily fall into +fresh_perl_is and fresh_perl_like, such as when a bunch of massaging of +the results is needed before it is convenient to test them. +fresh_perl_like() could be used, but in the case of failure there could +be lines and lines of noise output. + +Signed-off-by: Petr Písař +--- + t/test.pl | 25 +++++++++++++++++++++---- + 1 file changed, 21 insertions(+), 4 deletions(-) + +diff --git a/t/test.pl b/t/test.pl +index 41b77f4..20d08e9 100644 +--- a/t/test.pl ++++ b/t/test.pl +@@ -953,11 +953,16 @@ sub register_tempfile { + return $count; + } + +-# This is the temporary file for _fresh_perl ++# This is the temporary file for fresh_perl + my $tmpfile = tempfile(); + +-sub _fresh_perl { +- my($prog, $action, $expect, $runperl_args, $name) = @_; ++sub fresh_perl { ++ my($prog, $runperl_args) = @_; ++ ++ # Run 'runperl' with the complete perl program contained in '$prog', and ++ # arguments in the hash referred to by '$runperl_args'. The results are ++ # returned, with $? set to the exit code. Unless overridden, stderr is ++ # redirected to stdout. + + # Given the choice of the mis-parsable {} + # (we want an anon hash, but a borked lexer might think that it's a block) +@@ -975,7 +980,8 @@ sub _fresh_perl { + close TEST or die "Cannot close $tmpfile: $!"; + + my $results = runperl(%$runperl_args); +- my $status = $?; ++ my $status = $?; # Not necessary to save this, but it makes it clear to ++ # future maintainers. + + # Clean up the results into something a bit more predictable. + $results =~ s/\n+$//; +@@ -994,6 +1000,17 @@ sub _fresh_perl { + $results =~ s/\n\n/\n/g; + } + ++ $? = $status; ++ return $results; ++} ++ ++ ++sub _fresh_perl { ++ my($prog, $action, $expect, $runperl_args, $name) = @_; ++ ++ my $results = fresh_perl($prog, $runperl_args); ++ my $status = $?; ++ + # Use the first line of the program as a name if none was given + unless( $name ) { + ($first_line, $name) = $prog =~ /^((.{1,50}).*)/; +-- +2.7.4 + diff --git a/SOURCES/perl-5.25.2-uninit-warning-from-h-const-coredumped.patch b/SOURCES/perl-5.25.2-uninit-warning-from-h-const-coredumped.patch new file mode 100644 index 0000000..1433a9f --- /dev/null +++ b/SOURCES/perl-5.25.2-uninit-warning-from-h-const-coredumped.patch @@ -0,0 +1,74 @@ +From 55b6481ff87f84626ba01275708297a42a6537b1 Mon Sep 17 00:00:00 2001 +From: David Mitchell +Date: Tue, 21 Jun 2016 15:23:20 +0100 +Subject: [PATCH] uninit warning from $h{\const} coredumped +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The code that printed the the name and subscript of a hash element +in an "uninitialized variable" warning assumed that a constant +hash subscript would be SvPOK. Something like \1 is a constant, +but is ROK, not POK. SEGVs ensured. + +Signed-off-by: Petr Písař +--- + sv.c | 5 ++++- + t/op/hashwarn.t | 19 ++++++++++++++++++- + 2 files changed, 22 insertions(+), 2 deletions(-) + +diff --git a/sv.c b/sv.c +index 535ee8d..b0fdd15 100644 +--- a/sv.c ++++ b/sv.c +@@ -15683,9 +15683,12 @@ Perl_varname(pTHX_ const GV *const gv, const char gvtype, PADOFFSET targ, + + if (subscript_type == FUV_SUBSCRIPT_HASH) { + SV * const sv = newSV(0); ++ STRLEN len; ++ const char * const pv = SvPV_nomg_const((SV*)keyname, len); ++ + *SvPVX(name) = '$'; + Perl_sv_catpvf(aTHX_ name, "{%s}", +- pv_pretty(sv, SvPVX_const(keyname), SvCUR(keyname), 32, NULL, NULL, ++ pv_pretty(sv, pv, len, 32, NULL, NULL, + PERL_PV_PRETTY_DUMP | PERL_PV_ESCAPE_UNI_DETECT )); + SvREFCNT_dec_NN(sv); + } +diff --git a/t/op/hashwarn.t b/t/op/hashwarn.t +index a6a1de9..6d72244 100644 +--- a/t/op/hashwarn.t ++++ b/t/op/hashwarn.t +@@ -6,7 +6,7 @@ BEGIN { + } + + require './test.pl'; +-plan( tests => 16 ); ++plan( tests => 18 ); + + use strict; + use warnings; +@@ -71,3 +71,20 @@ my $fail_not_hr = 'Not a HASH reference at '; + cmp_ok(scalar(@warnings),'==',0,'pseudo-hash 2 count'); + cmp_ok(substr($@,0,length($fail_not_hr)),'eq',$fail_not_hr,'pseudo-hash 2 msg'); + } ++ ++# RT #128189 ++# this used to coredump ++ ++{ ++ @warnings = (); ++ my %h; ++ ++ no warnings; ++ use warnings qw(uninitialized); ++ ++ my $x = "$h{\1}"; ++ is(scalar @warnings, 1, "RT #128189 - 1 warning"); ++ like("@warnings", ++ qr/Use of uninitialized value \$h\{"SCALAR\(0x[\da-f]+\)"\}/, ++ "RT #128189 correct warning"); ++} +-- +2.5.5 + diff --git a/SOURCES/perl-5.25.4-clean-up-gv_fetchmethod_pvn_flags-move-origname-init.patch b/SOURCES/perl-5.25.4-clean-up-gv_fetchmethod_pvn_flags-move-origname-init.patch new file mode 100644 index 0000000..957009d --- /dev/null +++ b/SOURCES/perl-5.25.4-clean-up-gv_fetchmethod_pvn_flags-move-origname-init.patch @@ -0,0 +1,32 @@ +From d5ea0ef8623c7d7ba5f42d239787aa71393e2054 Mon Sep 17 00:00:00 2001 +From: Yves Orton +Date: Tue, 13 Sep 2016 23:06:58 +0200 +Subject: [PATCH 2/5] clean up gv_fetchmethod_pvn_flags: move origname init to + function start +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +so it is more obvious that it is a constant copy of the +original name. + +Signed-off-by: Petr Písař +--- + gv.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/gv.c b/gv.c +index b0221e0..fe38d44 100644 +--- a/gv.c ++++ b/gv.c +@@ -1014,7 +1014,6 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN le + const char *nsplit = NULL; + GV* gv; + HV* ostash = stash; +- const char * const origname = name; + SV *const error_report = MUTABLE_SV(stash); + const U32 autoload = flags & GV_AUTOLOAD; + const U32 do_croak = flags & GV_CROAK; +-- +2.7.4 + diff --git a/SOURCES/perl-5.25.4-clean-up-gv_fetchmethod_pvn_flags-rename-nsplit-to-l.patch b/SOURCES/perl-5.25.4-clean-up-gv_fetchmethod_pvn_flags-rename-nsplit-to-l.patch new file mode 100644 index 0000000..9938704 --- /dev/null +++ b/SOURCES/perl-5.25.4-clean-up-gv_fetchmethod_pvn_flags-rename-nsplit-to-l.patch @@ -0,0 +1,92 @@ +From e2cace1e9e89525afbca257742ddb36630b7fbc3 Mon Sep 17 00:00:00 2001 +From: Yves Orton +Date: Tue, 13 Sep 2016 23:10:48 +0200 +Subject: [PATCH 3/5] clean up gv_fetchmethod_pvn_flags: rename nsplit to + last_separator +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +nsplit if set points at the first char of the last separator +in name, so rename it so it is more comprehensible what it means. + +Signed-off-by: Petr Písař +--- + gv.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +diff --git a/gv.c b/gv.c +index fe38d44..07709a0 100644 +--- a/gv.c ++++ b/gv.c +@@ -1011,7 +1011,7 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN le + const char * const origname = name; + const char * const name_end = name + len; + const char *nend; +- const char *nsplit = NULL; ++ const char *last_separator = NULL; + GV* gv; + HV* ostash = stash; + SV *const error_report = MUTABLE_SV(stash); +@@ -1024,38 +1024,38 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN le + if (SvTYPE(stash) < SVt_PVHV) + stash = NULL; + else { +- /* The only way stash can become NULL later on is if nsplit is set, ++ /* The only way stash can become NULL later on is if last_separator is set, + which in turn means that there is no need for a SVt_PVHV case + the error reporting code. */ + } + + for (nend = name; *nend || nend != name_end; nend++) { + if (*nend == '\'') { +- nsplit = nend; ++ last_separator = nend; + name = nend + 1; + } + else if (*nend == ':' && *(nend + 1) == ':') { +- nsplit = nend++; ++ last_separator = nend++; + name = nend + 1; + } + } +- if (nsplit) { +- if ((nsplit - origname) == 5 && memEQ(origname, "SUPER", 5)) { ++ if (last_separator) { ++ if ((last_separator - origname) == 5 && memEQ(origname, "SUPER", 5)) { + /* ->SUPER::method should really be looked up in original stash */ + stash = CopSTASH(PL_curcop); + flags |= GV_SUPER; + DEBUG_o( Perl_deb(aTHX_ "Treating %s as %s::%s\n", + origname, HvENAME_get(stash), name) ); + } +- else if ((nsplit - origname) >= 7 && +- strnEQ(nsplit - 7, "::SUPER", 7)) { ++ else if ((last_separator - origname) >= 7 && ++ strnEQ(last_separator - 7, "::SUPER", 7)) { + /* don't autovifify if ->NoSuchStash::SUPER::method */ +- stash = gv_stashpvn(origname, nsplit - origname - 7, is_utf8); ++ stash = gv_stashpvn(origname, last_separator - origname - 7, is_utf8); + if (stash) flags |= GV_SUPER; + } + else { + /* don't autovifify if ->NoSuchStash::method */ +- stash = gv_stashpvn(origname, nsplit - origname, is_utf8); ++ stash = gv_stashpvn(origname, last_separator - origname, is_utf8); + } + ostash = stash; + } +@@ -1098,8 +1098,8 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN le + else { + SV* packnamesv; + +- if (nsplit) { +- packnamesv = newSVpvn_flags(origname, nsplit - origname, ++ if (last_separator) { ++ packnamesv = newSVpvn_flags(origname, last_separator - origname, + SVs_TEMP | is_utf8); + } else { + packnamesv = error_report; +-- +2.7.4 + diff --git a/SOURCES/perl-5.25.4-fix-129267-rework-gv_fetchmethod_pvn_flags-separator.patch b/SOURCES/perl-5.25.4-fix-129267-rework-gv_fetchmethod_pvn_flags-separator.patch new file mode 100644 index 0000000..bd36af5 --- /dev/null +++ b/SOURCES/perl-5.25.4-fix-129267-rework-gv_fetchmethod_pvn_flags-separator.patch @@ -0,0 +1,81 @@ +From cfb736762c1becf344ce6beaa701ff2e1abd5f9c Mon Sep 17 00:00:00 2001 +From: Yves Orton +Date: Tue, 13 Sep 2016 23:14:49 +0200 +Subject: [PATCH 4/5] fix #129267: rework gv_fetchmethod_pvn_flags separator + parsing +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +With previous code we could overrun the end of the name when +the last char in the string was a colon. This reworks the code +so it is more clear what is going on, and so it more similar +to other code that also parses out package separaters in gv.c. + +This is a rework of the reverted patches: +243ca72 rename "nend" name_cursor in Perl_gv_fetchmethod_pvn_flags +b053c93 fix: [perl #129267] Possible string overrun with invalid len in gv.c + +Signed-off-by: Petr Písař +--- + gv.c | 36 ++++++++++++++++++++++++++---------- + 1 file changed, 26 insertions(+), 10 deletions(-) + +diff --git a/gv.c b/gv.c +index 07709a0..3237c53 100644 +--- a/gv.c ++++ b/gv.c +@@ -1010,7 +1010,6 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN le + { + const char * const origname = name; + const char * const name_end = name + len; +- const char *nend; + const char *last_separator = NULL; + GV* gv; + HV* ostash = stash; +@@ -1029,16 +1028,33 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN le + the error reporting code. */ + } + +- for (nend = name; *nend || nend != name_end; nend++) { +- if (*nend == '\'') { +- last_separator = nend; +- name = nend + 1; +- } +- else if (*nend == ':' && *(nend + 1) == ':') { +- last_separator = nend++; +- name = nend + 1; +- } ++ { ++ /* check if the method name is fully qualified or ++ * not, and separate the package name from the actual ++ * method name. ++ * ++ * leaves last_separator pointing to the beginning of the ++ * last package separator (either ' or ::) or 0 ++ * if none was found. ++ * ++ * leaves name pointing at the beginning of the ++ * method name. ++ */ ++ const char *name_cursor = name; ++ const char * const name_em1 = name_end - 1; /* name_end minus 1 */ ++ for (name_cursor = name; name_cursor < name_end ; name_cursor++) { ++ if (*name_cursor == '\'') { ++ last_separator = name_cursor; ++ name = name_cursor + 1; ++ } ++ else if (name_cursor < name_em1 && *name_cursor == ':' && name_cursor[1] == ':') { ++ last_separator = name_cursor++; ++ name = name_cursor + 1; ++ } ++ } + } ++ ++ /* did we find a separator? */ + if (last_separator) { + if ((last_separator - origname) == 5 && memEQ(origname, "SUPER", 5)) { + /* ->SUPER::method should really be looked up in original stash */ +-- +2.7.4 + diff --git a/SOURCES/perl-5.25.4-perl-129267-Test-for-gv_fetchmethod-buffer-overrun.patch b/SOURCES/perl-5.25.4-perl-129267-Test-for-gv_fetchmethod-buffer-overrun.patch new file mode 100644 index 0000000..6998f71 --- /dev/null +++ b/SOURCES/perl-5.25.4-perl-129267-Test-for-gv_fetchmethod-buffer-overrun.patch @@ -0,0 +1,44 @@ +From 1665b718d8fbd58705dbe6376fa51f8c1a02d887 Mon Sep 17 00:00:00 2001 +From: Father Chrysostomos +Date: Tue, 13 Sep 2016 22:38:59 -0700 +Subject: [PATCH 5/5] [perl #129267] Test for gv_fetchmethod buffer overrun +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Petr Písař +--- + ext/XS-APItest/APItest.xs | 3 +++ + ext/XS-APItest/t/gv_fetchmethod_flags.t | 5 +++++ + 2 files changed, 8 insertions(+) + +diff --git a/ext/XS-APItest/APItest.xs b/ext/XS-APItest/APItest.xs +index 992b6a5..4602cee 100644 +--- a/ext/XS-APItest/APItest.xs ++++ b/ext/XS-APItest/APItest.xs +@@ -2571,6 +2571,9 @@ gv_fetchmethod_flags_type(stash, methname, type, flags) + gv = gv_fetchmethod_pvn_flags(stash, name, len, flags | SvUTF8(methname)); + break; + } ++ case 4: ++ gv = gv_fetchmethod_pvn_flags(stash, SvPV_nolen(methname), ++ flags, SvUTF8(methname)); + } + XPUSHs( gv ? (SV*)gv : &PL_sv_undef); + +diff --git a/ext/XS-APItest/t/gv_fetchmethod_flags.t b/ext/XS-APItest/t/gv_fetchmethod_flags.t +index 15d1c41..2da3b70 100644 +--- a/ext/XS-APItest/t/gv_fetchmethod_flags.t ++++ b/ext/XS-APItest/t/gv_fetchmethod_flags.t +@@ -49,3 +49,8 @@ is XS::APItest::gv_fetchmethod_flags_type(\%::, "method\0not quite!", 2, 0), "*m + } + } + } ++ ++# [perl #129267] Buffer overrun when argument name ends with colon and ++# there is a colon past the end. This used to segv. ++XS::APItest::gv_fetchmethod_flags_type(\%::, "method:::::", 4, 7); ++ # With type 4, 7 is the length +-- +2.7.4 + diff --git a/SOURCES/perl-5.25.4-perl-129287-Make-UTF8-append-null.patch b/SOURCES/perl-5.25.4-perl-129287-Make-UTF8-append-null.patch new file mode 100644 index 0000000..3709505 --- /dev/null +++ b/SOURCES/perl-5.25.4-perl-129287-Make-UTF8-append-null.patch @@ -0,0 +1,64 @@ +From b43665fffa48dd179eba1b5616d4ca35b4def876 Mon Sep 17 00:00:00 2001 +From: Father Chrysostomos +Date: Sun, 18 Sep 2016 20:17:08 -0700 +Subject: [PATCH] [perl #129287] Make UTF8 & append null +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The & and &. operators were not appending a null byte to the string +in utf8 mode. + +(The internal function that they use is the same. I used &. in the +test just because its intent is clearer.) + +Signed-off-by: Petr Písař +--- + doop.c | 1 + + t/op/bop.t | 14 +++++++++++++- + 2 files changed, 14 insertions(+), 1 deletion(-) + +diff --git a/doop.c b/doop.c +index ad9172a..234a425 100644 +--- a/doop.c ++++ b/doop.c +@@ -1093,6 +1093,7 @@ Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right) + if (sv == left || sv == right) + (void)sv_usepvn(sv, dcorig, needlen); + SvCUR_set(sv, dc - dcorig); ++ *SvEND(sv) = 0; + break; + case OP_BIT_XOR: + while (lulen && rulen) { +diff --git a/t/op/bop.t b/t/op/bop.t +index 2afb8d7..1f96e9b 100644 +--- a/t/op/bop.t ++++ b/t/op/bop.t +@@ -19,7 +19,7 @@ BEGIN { + # If you find tests are failing, please try adding names to tests to track + # down where the failure is, and supply your new names as a patch. + # (Just-in-time test naming) +-plan tests => 192 + (10*13*2) + 5 + 29; ++plan tests => 192 + (10*13*2) + 5 + 30; + + # numerics + ok ((0xdead & 0xbeef) == 0x9ead); +@@ -664,3 +664,15 @@ is $^A, "123", '~v0 clears vstring magic on retval'; + is(-1 >> $w + 1, -1, "IV -1 right shift $w + 1 == -1"); + } + } ++ ++# [perl #129287] UTF8 & was not providing a trailing null byte. ++# This test is a bit convoluted, as we want to make sure that the string ++# allocated for &’s target contains memory initialised to something other ++# than a null byte. Uninitialised memory does not make for a reliable ++# test. So we do &. on a longer non-utf8 string first. ++for (["aaa","aaa"],[substr ("a\x{100}",0,1), "a"]) { ++ use feature "bitwise"; ++ no warnings "experimental::bitwise", "pack"; ++ $byte = substr unpack("P2", pack "P", $$_[0] &. $$_[1]), -1; ++} ++is $byte, "\0", "utf8 &. appends null byte"; +-- +2.7.4 + diff --git a/SOURCES/perl-5.25.6-perl-130001-h2xs-avoid-infinite-loop-for-enums.patch b/SOURCES/perl-5.25.6-perl-130001-h2xs-avoid-infinite-loop-for-enums.patch new file mode 100644 index 0000000..9b4f197 --- /dev/null +++ b/SOURCES/perl-5.25.6-perl-130001-h2xs-avoid-infinite-loop-for-enums.patch @@ -0,0 +1,32 @@ +From 9ce5bf4c39e28441410672f39b5ee1c4569967f8 Mon Sep 17 00:00:00 2001 +From: Hugo van der Sanden +Date: Fri, 28 Oct 2016 13:27:23 +0100 +Subject: [PATCH] [perl #130001] h2xs: avoid infinite loop for enums +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +'typedef enum x { ... } x' causes h2xs to enter a substitution loop while +trying to write the typemap file. + +Signed-off-by: Petr Písař +--- + utils/h2xs.PL | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/utils/h2xs.PL b/utils/h2xs.PL +index 8fda87b..f9063cb 100644 +--- a/utils/h2xs.PL ++++ b/utils/h2xs.PL +@@ -1034,7 +1034,7 @@ if( ! $opt_X ){ # use XS, unless it was disabled + } + } + { local $" = '|'; +- $typedef_rex = qr(\b(? +Date: Mon, 14 Nov 2016 11:56:15 +0100 +Subject: [PATCH] Fix Storable segfaults. + +Fix a null pointed dereference segfault in storable when the +retrieve_code logic was unable to read the string that contained +the code. + +Also fix several locations where retrieve_other was called with a +null context pointer. This also resulted in a null pointer +dereference. +--- + dist/Storable/Storable.xs | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +diff --git a/dist/Storable/Storable.xs b/dist/Storable/Storable.xs +index 053951c..caa489c 100644 +--- a/dist/Storable/Storable.xs ++++ b/dist/Storable/Storable.xs +@@ -5647,6 +5647,10 @@ static SV *retrieve_code(pTHX_ stcxt_t *cxt, const char *cname) + CROAK(("Unexpected type %d in retrieve_code\n", type)); + } + ++ if (!text) { ++ CROAK(("Unable to retrieve code\n")); ++ } ++ + /* + * prepend "sub " to the source + */ +@@ -5767,7 +5771,7 @@ static SV *old_retrieve_array(pTHX_ stcxt_t *cxt, const char *cname) + continue; /* av_extend() already filled us with undef */ + } + if (c != SX_ITEM) +- (void) retrieve_other(aTHX_ (stcxt_t *) 0, 0); /* Will croak out */ ++ (void) retrieve_other(aTHX_ cxt, 0); /* Will croak out */ + TRACEME(("(#%d) item", i)); + sv = retrieve(aTHX_ cxt, 0); /* Retrieve item */ + if (!sv) +@@ -5844,7 +5848,7 @@ static SV *old_retrieve_hash(pTHX_ stcxt_t *cxt, const char *cname) + if (!sv) + return (SV *) 0; + } else +- (void) retrieve_other(aTHX_ (stcxt_t *) 0, 0); /* Will croak out */ ++ (void) retrieve_other(aTHX_ cxt, 0); /* Will croak out */ + + /* + * Get key. +@@ -5855,7 +5859,7 @@ static SV *old_retrieve_hash(pTHX_ stcxt_t *cxt, const char *cname) + + GETMARK(c); + if (c != SX_KEY) +- (void) retrieve_other(aTHX_ (stcxt_t *) 0, 0); /* Will croak out */ ++ (void) retrieve_other(aTHX_ cxt, 0); /* Will croak out */ + RLEN(size); /* Get key size */ + KBUFCHK((STRLEN)size); /* Grow hash key read pool if needed */ + if (size) +-- +2.10.2 + diff --git a/SOURCES/perl-5.25.7-Fix-const-correctness-in-hv_func.h.patch b/SOURCES/perl-5.25.7-Fix-const-correctness-in-hv_func.h.patch new file mode 100644 index 0000000..5f2a428 --- /dev/null +++ b/SOURCES/perl-5.25.7-Fix-const-correctness-in-hv_func.h.patch @@ -0,0 +1,124 @@ +From 463ddf34c08f2c97199b1bb242da1f17494d4d1a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Thu, 24 Nov 2016 16:34:09 +0100 +Subject: [PATCH] Fix const correctness in hv_func.h +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Building an XS code with -Wcast-qual yielded warnings about discarding +const qualifiers from pointer targets like: + +$ printf '#include "EXTERN.h"\n#include "perl.h"\n' | gcc -Wcast-qual -I/usr/lib64/perl5/CORE -c -x c - +In file included from /usr/lib64/perl5/CORE/hv.h:629:0, + from /usr/lib64/perl5/CORE/perl.h:3740, + from :2: +/usr/lib64/perl5/CORE/hv_func.h: In function ‘S_perl_hash_siphash_2_4’: +/usr/lib64/perl5/CORE/hv_func.h:213:17: warning: cast discards ‘const’ qualifier from pointer target type [-Wcast-qual] + U64TYPE k0 = ((U64TYPE*)seed)[0]; + ^ + +Signed-off-by: Petr Písař +--- + hv_func.h | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/hv_func.h b/hv_func.h +index 8866db9..57b1ed1 100644 +--- a/hv_func.h ++++ b/hv_func.h +@@ -118,7 +118,7 @@ + + #if (BYTEORDER == 0x1234 || BYTEORDER == 0x12345678) && U32SIZE == 4 + /* CPU endian matches murmurhash algorithm, so read 32-bit word directly */ +- #define U8TO32_LE(ptr) (*((U32*)(ptr))) ++ #define U8TO32_LE(ptr) (*((const U32*)(ptr))) + #elif BYTEORDER == 0x4321 || BYTEORDER == 0x87654321 + /* TODO: Add additional cases below where a compiler provided bswap32 is available */ + #if defined(__GNUC__) && (__GNUC__>4 || (__GNUC__==4 && __GNUC_MINOR__>=3)) +@@ -210,8 +210,8 @@ S_perl_hash_siphash_2_4(const unsigned char * const seed, const unsigned char *i + U64 v3 = UINT64_C(0x7465646279746573); + + U64 b; +- U64 k0 = ((U64*)seed)[0]; +- U64 k1 = ((U64*)seed)[1]; ++ U64 k0 = ((const U64*)seed)[0]; ++ U64 k1 = ((const U64*)seed)[1]; + U64 m; + const int left = inlen & 7; + const U8 *end = in + inlen - left; +@@ -269,7 +269,7 @@ S_perl_hash_siphash_2_4(const unsigned char * const seed, const unsigned char *i + + PERL_STATIC_INLINE U32 + S_perl_hash_superfast(const unsigned char * const seed, const unsigned char *str, STRLEN len) { +- U32 hash = *((U32*)seed) + (U32)len; ++ U32 hash = *((const U32*)seed) + (U32)len; + U32 tmp; + int rem= len & 3; + len >>= 2; +@@ -373,7 +373,7 @@ S_perl_hash_superfast(const unsigned char * const seed, const unsigned char *str + /* now we create the hash function */ + PERL_STATIC_INLINE U32 + S_perl_hash_murmur3(const unsigned char * const seed, const unsigned char *ptr, STRLEN len) { +- U32 h1 = *((U32*)seed); ++ U32 h1 = *((const U32*)seed); + U32 k1; + U32 carry = 0; + +@@ -467,7 +467,7 @@ S_perl_hash_murmur3(const unsigned char * const seed, const unsigned char *ptr, + PERL_STATIC_INLINE U32 + S_perl_hash_djb2(const unsigned char * const seed, const unsigned char *str, const STRLEN len) { + const unsigned char * const end = (const unsigned char *)str + len; +- U32 hash = *((U32*)seed) + (U32)len; ++ U32 hash = *((const U32*)seed) + (U32)len; + while (str < end) { + hash = ((hash << 5) + hash) + *str++; + } +@@ -477,7 +477,7 @@ S_perl_hash_djb2(const unsigned char * const seed, const unsigned char *str, con + PERL_STATIC_INLINE U32 + S_perl_hash_sdbm(const unsigned char * const seed, const unsigned char *str, const STRLEN len) { + const unsigned char * const end = (const unsigned char *)str + len; +- U32 hash = *((U32*)seed) + (U32)len; ++ U32 hash = *((const U32*)seed) + (U32)len; + while (str < end) { + hash = (hash << 6) + (hash << 16) - hash + *str++; + } +@@ -503,7 +503,7 @@ S_perl_hash_sdbm(const unsigned char * const seed, const unsigned char *str, con + PERL_STATIC_INLINE U32 + S_perl_hash_one_at_a_time(const unsigned char * const seed, const unsigned char *str, const STRLEN len) { + const unsigned char * const end = (const unsigned char *)str + len; +- U32 hash = *((U32*)seed) + (U32)len; ++ U32 hash = *((const U32*)seed) + (U32)len; + while (str < end) { + hash += *str++; + hash += (hash << 10); +@@ -518,7 +518,7 @@ S_perl_hash_one_at_a_time(const unsigned char * const seed, const unsigned char + PERL_STATIC_INLINE U32 + S_perl_hash_one_at_a_time_hard(const unsigned char * const seed, const unsigned char *str, const STRLEN len) { + const unsigned char * const end = (const unsigned char *)str + len; +- U32 hash = *((U32*)seed) + (U32)len; ++ U32 hash = *((const U32*)seed) + (U32)len; + + while (str < end) { + hash += (hash << 10); +@@ -553,7 +553,7 @@ S_perl_hash_one_at_a_time_hard(const unsigned char * const seed, const unsigned + PERL_STATIC_INLINE U32 + S_perl_hash_old_one_at_a_time(const unsigned char * const seed, const unsigned char *str, const STRLEN len) { + const unsigned char * const end = (const unsigned char *)str + len; +- U32 hash = *((U32*)seed); ++ U32 hash = *((const U32*)seed); + while (str < end) { + hash += *str++; + hash += (hash << 10); +@@ -581,7 +581,7 @@ S_perl_hash_murmur_hash_64a (const unsigned char * const seed, const unsigned ch + { + const U64 m = UINT64_C(0xc6a4a7935bd1e995); + const int r = 47; +- U64 h = *((U64*)seed) ^ len; ++ U64 h = *((const U64*)seed) ^ len; + const U64 * data = (const U64 *)str; + const U64 * end = data + (len/8); + const unsigned char * data2; +-- +2.7.4 + diff --git a/SOURCES/perl-5.25.9-only-mess-with-NEXT_OFF-when-we-are-in-PASS2.patch b/SOURCES/perl-5.25.9-only-mess-with-NEXT_OFF-when-we-are-in-PASS2.patch new file mode 100644 index 0000000..1eb9183 --- /dev/null +++ b/SOURCES/perl-5.25.9-only-mess-with-NEXT_OFF-when-we-are-in-PASS2.patch @@ -0,0 +1,38 @@ +From bb78386f13c18a1a7dae932b9b36e977056b13c7 Mon Sep 17 00:00:00 2001 +From: Yves Orton +Date: Fri, 27 Jan 2017 16:57:40 +0100 +Subject: [PATCH] only mess with NEXT_OFF() when we are in PASS2 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +In 31fc93954d1f379c7a49889d91436ce99818e1f6 I added code that would modify +NEXT_OFF() when we were not in PASS2, when we should not do so. Strangly this +did not segfault when I tested, but this fix is required. + +Signed-off-by: Petr Písař +--- + regcomp.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/regcomp.c b/regcomp.c +index 322d230..d5ce63f 100644 +--- a/regcomp.c ++++ b/regcomp.c +@@ -11709,11 +11709,11 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth) + nextchar(pRExC_state); + if (max < min) { /* If can't match, warn and optimize to fail + unconditionally */ ++ reginsert(pRExC_state, OPFAIL, orig_emit, depth+1); + if (PASS2) { + ckWARNreg(RExC_parse, "Quantifier {n,m} with n > m can't match"); ++ NEXT_OFF(orig_emit)= regarglen[OPFAIL] + NODE_STEP_REGNODE; + } +- reginsert(pRExC_state, OPFAIL, orig_emit, depth+1); +- NEXT_OFF(orig_emit)= regarglen[OPFAIL] + NODE_STEP_REGNODE; + return ret; + } + else if (min == max && *RExC_parse == '?') +-- +2.7.4 + diff --git a/SOURCES/perl-5.25.9-perl-129061-CURLYX-nodes-can-be-studied-more-than-on.patch b/SOURCES/perl-5.25.9-perl-129061-CURLYX-nodes-can-be-studied-more-than-on.patch new file mode 100644 index 0000000..d7b9c6b --- /dev/null +++ b/SOURCES/perl-5.25.9-perl-129061-CURLYX-nodes-can-be-studied-more-than-on.patch @@ -0,0 +1,69 @@ +From 42e9b60980bb8e29e76629e14c6aa945194c0647 Mon Sep 17 00:00:00 2001 +From: Hugo van der Sanden +Date: Wed, 5 Oct 2016 02:20:26 +0100 +Subject: [PATCH] [perl #129061] CURLYX nodes can be studied more than once +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +study_chunk() for CURLYX is used to set flags on the linked WHILEM +node to say it is the whilem_c'th of whilem_seen. However it assumes +each CURLYX can be studied only once, which is not the case - there +are various cases such as GOSUB which call study_chunk() recursively +on already-visited parts of the program. + +Storing the wrong index can cause the super-linear cache handling in +regmatch() to read/write the byte after the end of poscache. + +Also reported in [perl #129281]. + +Signed-off-by: Petr Písař +--- + regcomp.c | 12 +++++++++--- + t/re/pat.t | 1 - + 2 files changed, 9 insertions(+), 4 deletions(-) + +diff --git a/regcomp.c b/regcomp.c +index 850a6c1..48c8d8d 100644 +--- a/regcomp.c ++++ b/regcomp.c +@@ -5218,15 +5218,21 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, + However, this time it's not a subexpression + we care about, but the expression itself. */ + && (maxcount == REG_INFTY) +- && data && ++data->whilem_c < 16) { ++ && data) { + /* This stays as CURLYX, we can put the count/of pair. */ + /* Find WHILEM (as in regexec.c) */ + regnode *nxt = oscan + NEXT_OFF(oscan); + + if (OP(PREVOPER(nxt)) == NOTHING) /* LONGJMP */ + nxt += ARG(nxt); +- PREVOPER(nxt)->flags = (U8)(data->whilem_c +- | (RExC_whilem_seen << 4)); /* On WHILEM */ ++ nxt = PREVOPER(nxt); ++ if (nxt->flags & 0xf) { ++ /* we've already set whilem count on this node */ ++ } else if (++data->whilem_c < 16) { ++ assert(data->whilem_c <= RExC_whilem_seen); ++ nxt->flags = (U8)(data->whilem_c ++ | (RExC_whilem_seen << 4)); /* On WHILEM */ ++ } + } + if (data && fl & (SF_HAS_PAR|SF_IN_PAR)) + pars++; +diff --git a/t/re/pat.t b/t/re/pat.t +index ecd3af1..16bfc8e 100644 +--- a/t/re/pat.t ++++ b/t/re/pat.t +@@ -1909,7 +1909,6 @@ EOP + } + { + # [perl #129281] buffer write overflow, detected by ASAN, valgrind +- local $::TODO = "whilem_c bumped too much"; + fresh_perl_is('/0(?0)|^*0(?0)|^*(^*())0|/', '', {}, "don't bump whilem_c too much"); + } + } # End of sub run_tests +-- +2.7.4 + diff --git a/SOURCES/perl-5.25.9-silence-warnings-from-tests-about-impossible-quantif.patch b/SOURCES/perl-5.25.9-silence-warnings-from-tests-about-impossible-quantif.patch new file mode 100644 index 0000000..2cfe7ed --- /dev/null +++ b/SOURCES/perl-5.25.9-silence-warnings-from-tests-about-impossible-quantif.patch @@ -0,0 +1,34 @@ +From 923e23bad0514e1bd29112650fb78aa4ea69e1b7 Mon Sep 17 00:00:00 2001 +From: Yves Orton +Date: Sat, 28 Jan 2017 15:13:17 +0100 +Subject: [PATCH] silence warnings from tests about impossible quantifiers +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +thanks to Dave M for noticing.... + +Signed-off-by: Petr Písař +--- + t/re/pat_rt_report.t | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/t/re/pat_rt_report.t b/t/re/pat_rt_report.t +index 21aff58..dd740e7 100644 +--- a/t/re/pat_rt_report.t ++++ b/t/re/pat_rt_report.t +@@ -1134,9 +1134,10 @@ EOP + { + # rt + fresh_perl_is( +- '"foo"=~/((?1)){8,0}/; print "ok"', ++ 'no warnings "regexp"; "foo"=~/((?1)){8,0}/; print "ok"', + "ok", {}, 'RT #130561 - allowing impossible quantifier should not cause SEGVs'); + my $s= "foo"; ++ no warnings 'regexp'; + ok($s=~/(foo){1,0}|(?1)/, + "RT #130561 - allowing impossible quantifier should not break recursion"); + } +-- +2.7.4 + diff --git a/SOURCES/perl-5.26.1-fix-do-dir-returning-no.patch b/SOURCES/perl-5.26.1-fix-do-dir-returning-no.patch new file mode 100644 index 0000000..aa44d7d --- /dev/null +++ b/SOURCES/perl-5.26.1-fix-do-dir-returning-no.patch @@ -0,0 +1,111 @@ +From 3dfcac940930a8aa6779f5debea6ea6357372419 Mon Sep 17 00:00:00 2001 +From: Daniel Dragan +Date: Sun, 16 Aug 2015 04:30:23 -0400 +Subject: [PATCH] fix do dir returning no $! +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +do()ing a directory was returning false/empty string in $!, which isn't +an error, yet documentation says $! should have the error code in it. +Fix this by returning EISDIR for dirs, and EINVAL for block devices. +[perl #125774] + +Remove "errno = 0" and comment added in b2da7ead68, since now there is no +scenario where errno is uninitialized, since the dir and block device +failure branches now set errno, where previously they didn't. + +Petr Písař: Ported to 5.26.1. + +Signed-off-by: Petr Písař +--- + pp_ctl.c | 25 +++++++++++++++++-------- + t/op/do.t | 14 +++++++++++++- + 2 files changed, 30 insertions(+), 9 deletions(-) + +diff --git a/pp_ctl.c b/pp_ctl.c +index e24d7b6..f136f91 100644 +--- a/pp_ctl.c ++++ b/pp_ctl.c +@@ -3534,15 +3534,22 @@ S_check_type_and_open(pTHX_ SV *name) + errno EACCES, so only do a stat to separate a dir from a real EACCES + caused by user perms */ + #ifndef WIN32 +- /* we use the value of errno later to see how stat() or open() failed. +- * We don't want it set if the stat succeeded but we still failed, +- * such as if the name exists, but is a directory */ +- errno = 0; +- + st_rc = PerlLIO_stat(p, &st); + +- if (st_rc < 0 || S_ISDIR(st.st_mode) || S_ISBLK(st.st_mode)) { ++ if (st_rc < 0) + return NULL; ++ else { ++ int eno; ++ if(S_ISBLK(st.st_mode)) { ++ eno = EINVAL; ++ goto not_file; ++ } ++ else if(S_ISDIR(st.st_mode)) { ++ eno = EISDIR; ++ not_file: ++ errno = eno; ++ return NULL; ++ } + } + #endif + +@@ -3554,8 +3561,10 @@ S_check_type_and_open(pTHX_ SV *name) + int eno; + st_rc = PerlLIO_stat(p, &st); + if (st_rc >= 0) { +- if(S_ISDIR(st.st_mode) || S_ISBLK(st.st_mode)) +- eno = 0; ++ if(S_ISDIR(st.st_mode)) ++ eno = EISDIR; ++ else if(S_ISBLK(st.st_mode)) ++ eno = EINVAL; + else + eno = EACCES; + errno = eno; +diff --git a/t/op/do.t b/t/op/do.t +index 78d8800..1c54f0b 100644 +--- a/t/op/do.t ++++ b/t/op/do.t +@@ -7,6 +7,7 @@ BEGIN { + } + use strict; + no warnings 'void'; ++use Errno qw(ENOENT EISDIR); + + my $called; + my $result = do{ ++$called; 'value';}; +@@ -247,7 +248,7 @@ SKIP: { + my $saved_errno = $!; + ok(!$rv, "do returns false on io errror"); + ok(!$saved_error, "\$\@ not set on io error"); +- ok($saved_errno, "\$! set on io error"); ++ ok($saved_errno == ENOENT, "\$! is ENOENT for nonexistent file"); + } + + # do subname should not be do "subname" +@@ -305,4 +306,15 @@ SKIP: { + } + + ++# do file $!s must be correct ++{ ++ local @INC = ('.'); #want EISDIR not ENOENT ++ my $rv = do 'op'; # /t/op dir ++ my $saved_error = $@; ++ my $saved_errno = $!+0; ++ ok(!$rv, "do dir returns false"); ++ ok(!$saved_error, "\$\@ is false on do dir"); ++ ok($saved_errno == EISDIR, "\$! is EISDIR on do dir"); ++} ++ + done_testing(); +-- +2.13.6 + diff --git a/SOURCES/perl-5.26.1-guard_old_libcrypt_fix.patch b/SOURCES/perl-5.26.1-guard_old_libcrypt_fix.patch new file mode 100644 index 0000000..2d34cfe --- /dev/null +++ b/SOURCES/perl-5.26.1-guard_old_libcrypt_fix.patch @@ -0,0 +1,24 @@ +commit 13e70b397dcb0d1bf4a869b670f041c1d7b730d0 +Author: Björn Esser +Date: Sat Jan 20 20:22:53 2018 +0100 + + pp: Guard fix for really old bug in glibc libcrypt + +diff --git a/pp.c b/pp.c +index d50ad7ddbf..6510c7b15c 100644 +--- a/pp.c ++++ b/pp.c +@@ -3650,8 +3650,12 @@ PP(pp_crypt) + #if defined(__GLIBC__) || defined(__EMX__) + if (PL_reentrant_buffer->_crypt_struct_buffer) { + PL_reentrant_buffer->_crypt_struct_buffer->initialized = 0; +- /* work around glibc-2.2.5 bug */ ++#if (defined(__GLIBC__) && __GLIBC__ == 2) && \ ++ (defined(__GLIBC_MINOR__) && __GLIBC_MINOR__ >= 2 && __GLIBC_MINOR__ < 4) ++ /* work around glibc-2.2.5 bug, has been fixed at some ++ * time in glibc-2.3.X */ + PL_reentrant_buffer->_crypt_struct_buffer->current_saltbits = 0; ++#endif + } + #endif + } diff --git a/SOURCES/perl-5.26.1-perl-131746-avoid-undefined-behaviour-in-Copy-etc.patch b/SOURCES/perl-5.26.1-perl-131746-avoid-undefined-behaviour-in-Copy-etc.patch new file mode 100644 index 0000000..d6471a8 --- /dev/null +++ b/SOURCES/perl-5.26.1-perl-131746-avoid-undefined-behaviour-in-Copy-etc.patch @@ -0,0 +1,107 @@ +From 7a962424149cc60f3a187d0213a12689dd5e806b Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Mon, 14 Aug 2017 11:52:39 +1000 +Subject: [PATCH] (perl #131746) avoid undefined behaviour in Copy() etc +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +These functions depend on C library functions which have undefined +behaviour when passed NULL pointers, even when passed a zero 'n' value. + +Some compilers use this information, ie. assume the pointers are +non-NULL when optimizing any following code, so we do need to +prevent such unguarded calls. + +My initial thought was to add conditionals to each macro to skip the +call to the library function when n is zero, but this adds a cost to +every use of these macros, even when the n value is always true. + +So instead I added asserts() which will give us a much more visible +indicator of such broken code and revealed the pp_caller and Glob.xs +issues also patched here. + +Petr Písař: Ported to 5.26.1 from +f14cf3632059d421de83cf901c7e849adc1fcd03. + +Signed-off-by: Petr Písař +--- + ext/File-Glob/Glob.xs | 2 +- + handy.h | 14 +++++++------- + pp_ctl.c | 3 ++- + pp_hot.c | 3 ++- + 4 files changed, 12 insertions(+), 10 deletions(-) + +diff --git a/ext/File-Glob/Glob.xs b/ext/File-Glob/Glob.xs +index e0a3681..9779d54 100644 +--- a/ext/File-Glob/Glob.xs ++++ b/ext/File-Glob/Glob.xs +@@ -121,7 +121,7 @@ iterate(pTHX_ bool(*globber)(pTHX_ AV *entries, const char *pat, STRLEN len, boo + + /* chuck it all out, quick or slow */ + if (gimme == G_ARRAY) { +- if (!on_stack) { ++ if (!on_stack && AvFILLp(entries) + 1) { + EXTEND(SP, AvFILLp(entries)+1); + Copy(AvARRAY(entries), SP+1, AvFILLp(entries)+1, SV *); + SP += AvFILLp(entries)+1; +diff --git a/handy.h b/handy.h +index 80f9cf4..88b5b55 100644 +--- a/handy.h ++++ b/handy.h +@@ -2409,17 +2409,17 @@ void Perl_mem_log_del_sv(const SV *sv, const char *filename, const int linenumbe + #define Safefree(d) safefree(MEM_LOG_FREE((Malloc_t)(d))) + #endif + +-#define Move(s,d,n,t) (MEM_WRAP_CHECK_(n,t) (void)memmove((char*)(d),(const char*)(s), (n) * sizeof(t))) +-#define Copy(s,d,n,t) (MEM_WRAP_CHECK_(n,t) (void)memcpy((char*)(d),(const char*)(s), (n) * sizeof(t))) +-#define Zero(d,n,t) (MEM_WRAP_CHECK_(n,t) (void)memzero((char*)(d), (n) * sizeof(t))) ++#define Move(s,d,n,t) (MEM_WRAP_CHECK_(n,t) assert(d), assert(s), (void)memmove((char*)(d),(const char*)(s), (n) * sizeof(t))) ++#define Copy(s,d,n,t) (MEM_WRAP_CHECK_(n,t) assert(d), assert(s), (void)memcpy((char*)(d),(const char*)(s), (n) * sizeof(t))) ++#define Zero(d,n,t) (MEM_WRAP_CHECK_(n,t) assert(d), (void)memzero((char*)(d), (n) * sizeof(t))) + +-#define MoveD(s,d,n,t) (MEM_WRAP_CHECK_(n,t) memmove((char*)(d),(const char*)(s), (n) * sizeof(t))) +-#define CopyD(s,d,n,t) (MEM_WRAP_CHECK_(n,t) memcpy((char*)(d),(const char*)(s), (n) * sizeof(t))) ++#define MoveD(s,d,n,t) (MEM_WRAP_CHECK_(n,t) assert(d), assert(s), memmove((char*)(d),(const char*)(s), (n) * sizeof(t))) ++#define CopyD(s,d,n,t) (MEM_WRAP_CHECK_(n,t) assert(d), assert(s), memcpy((char*)(d),(const char*)(s), (n) * sizeof(t))) + #ifdef HAS_MEMSET +-#define ZeroD(d,n,t) (MEM_WRAP_CHECK_(n,t) memzero((char*)(d), (n) * sizeof(t))) ++#define ZeroD(d,n,t) (MEM_WRAP_CHECK_(n,t) assert(d), memzero((char*)(d), (n) * sizeof(t))) + #else + /* Using bzero(), which returns void. */ +-#define ZeroD(d,n,t) (MEM_WRAP_CHECK_(n,t) memzero((char*)(d), (n) * sizeof(t)),d) ++#define ZeroD(d,n,t) (MEM_WRAP_CHECK_(n,t) assert(d), memzero((char*)(d), (n) * sizeof(t)),d) + #endif + + #define PoisonWith(d,n,t,b) (MEM_WRAP_CHECK_(n,t) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t))) +diff --git a/pp_ctl.c b/pp_ctl.c +index 15c193b..f1c57bc 100644 +--- a/pp_ctl.c ++++ b/pp_ctl.c +@@ -1971,7 +1971,8 @@ PP(pp_caller) + + if (AvMAX(PL_dbargs) < AvFILLp(ary) + off) + av_extend(PL_dbargs, AvFILLp(ary) + off); +- Copy(AvALLOC(ary), AvARRAY(PL_dbargs), AvFILLp(ary) + 1 + off, SV*); ++ if (AvFILLp(ary) + 1 + off) ++ Copy(AvALLOC(ary), AvARRAY(PL_dbargs), AvFILLp(ary) + 1 + off, SV*); + AvFILLp(PL_dbargs) = AvFILLp(ary) + off; + } + mPUSHi(CopHINTS_get(cx->blk_oldcop)); +diff --git a/pp_hot.c b/pp_hot.c +index 5899413..66b79ea 100644 +--- a/pp_hot.c ++++ b/pp_hot.c +@@ -4138,7 +4138,8 @@ PP(pp_entersub) + AvARRAY(av) = ary; + } + +- Copy(MARK+1,AvARRAY(av),items,SV*); ++ if (items) ++ Copy(MARK+1,AvARRAY(av),items,SV*); + AvFILLp(av) = items - 1; + } + if (UNLIKELY((cx->blk_u16 & OPpENTERSUB_LVAL_MASK) == OPpLVAL_INTRO && +-- +2.13.6 + diff --git a/SOURCES/perl-5.27.0-Fix-131190-UTF8-code-improperly-casting-negative-int.patch b/SOURCES/perl-5.27.0-Fix-131190-UTF8-code-improperly-casting-negative-int.patch new file mode 100644 index 0000000..f248720 --- /dev/null +++ b/SOURCES/perl-5.27.0-Fix-131190-UTF8-code-improperly-casting-negative-int.patch @@ -0,0 +1,33 @@ +From 2c2da8e7f0f6325fab643997a536072633fa0cf8 Mon Sep 17 00:00:00 2001 +From: Yves Orton +Date: Thu, 1 Jun 2017 14:51:44 +0200 +Subject: [PATCH] Fix #131190 - UTF8 code improperly casting negative integer + to U8 in comparison +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit b4972372a75776de3c9e6bd234a398d103677316, +effectively restoring commit ca7eb79a236b41b7722c6800527f95cd76843eed, +and commit 85fde2b7c3f5631fd982f5db735b84dc9224bec0. + +Signed-off-by: Petr Písař +--- + regexec.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/regexec.c b/regexec.c +index 82128a7..35b88d7 100644 +--- a/regexec.c ++++ b/regexec.c +@@ -5593,6 +5593,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog) + if (scan->flags == EXACTL || scan->flags == EXACTFLU8) { + _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + if (utf8_target ++ && nextchr >= 0 /* guard against negative EOS value in nextchr */ + && UTF8_IS_ABOVE_LATIN1(nextchr) + && scan->flags == EXACTL) + { +-- +2.9.4 + diff --git a/SOURCES/perl-5.27.0-Resolve-Perl-131522-Spurious-Assuming-NOT-a-POSIX-cl.patch b/SOURCES/perl-5.27.0-Resolve-Perl-131522-Spurious-Assuming-NOT-a-POSIX-cl.patch new file mode 100644 index 0000000..8f05cc7 --- /dev/null +++ b/SOURCES/perl-5.27.0-Resolve-Perl-131522-Spurious-Assuming-NOT-a-POSIX-cl.patch @@ -0,0 +1,135 @@ +From bab0f8e933b383b6bef406d79c2da340bbcded33 Mon Sep 17 00:00:00 2001 +From: Yves Orton +Date: Sun, 18 Jun 2017 20:45:30 +0200 +Subject: [PATCH 1/2] Resolve Perl #131522: Spurious "Assuming NOT a POSIX + class" warning +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Petr Písař +--- + regcomp.c | 30 ++++++++++++++++++------------ + 1 file changed, 18 insertions(+), 12 deletions(-) + +diff --git a/regcomp.c b/regcomp.c +index 8921eed..0a4ea78 100644 +--- a/regcomp.c ++++ b/regcomp.c +@@ -13991,6 +13991,13 @@ S_populate_ANYOF_from_invlist(pTHX_ regnode *node, SV** invlist_ptr) + REPORT_LOCATION_ARGS(p))); \ + } \ + } STMT_END ++#define CLEAR_POSIX_WARNINGS() \ ++ if (posix_warnings && RExC_warn_text) \ ++ av_clear(RExC_warn_text) ++ ++#define CLEAR_POSIX_WARNINGS_AND_RETURN(ret) \ ++ CLEAR_POSIX_WARNINGS(); \ ++ return ret + + STATIC int + S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, +@@ -14063,7 +14070,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, + * + * The syntax for a legal posix class is: + * +- * qr/(?xa: \[ : \^? [:lower:]{4,6} : \] )/ ++ * qr/(?xa: \[ : \^? [[:lower:]]{4,6} : \] )/ + * + * What this routine considers syntactically to be an intended posix class + * is this (the comments indicate some restrictions that the pattern +@@ -14088,7 +14095,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, + * # for it to be considered to be + * # an intended posix class. + * \h* +- * [:punct:]? # The closing class character, ++ * [[:punct:]]? # The closing class character, + * # possibly omitted. If not a colon + * # nor semi colon, the class name + * # must be even closer to a valid +@@ -14131,8 +14138,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, + + PERL_ARGS_ASSERT_HANDLE_POSSIBLE_POSIX; + +- if (posix_warnings && RExC_warn_text) +- av_clear(RExC_warn_text); ++ CLEAR_POSIX_WARNINGS(); + + if (p >= e) { + return NOT_MEANT_TO_BE_A_POSIX_CLASS; +@@ -14224,7 +14230,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, + *updated_parse_ptr = (char *) temp_ptr; + } + +- return OOB_NAMEDCLASS; ++ CLEAR_POSIX_WARNINGS_AND_RETURN(OOB_NAMEDCLASS); + } + } + +@@ -14294,7 +14300,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, + /* We consider something like [^:^alnum:]] to not have been intended to + * be a posix class, but XXX maybe we should */ + if (complement) { +- return NOT_MEANT_TO_BE_A_POSIX_CLASS; ++ CLEAR_POSIX_WARNINGS_AND_RETURN(NOT_MEANT_TO_BE_A_POSIX_CLASS); + } + + complement = 1; +@@ -14321,7 +14327,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, + * this leaves this construct looking like [:] or [:^], which almost + * certainly weren't intended to be posix classes */ + if (has_opening_bracket) { +- return NOT_MEANT_TO_BE_A_POSIX_CLASS; ++ CLEAR_POSIX_WARNINGS_AND_RETURN(NOT_MEANT_TO_BE_A_POSIX_CLASS); + } + + /* But this function can be called when we parse the colon for +@@ -14338,7 +14344,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, + /* XXX We are currently very restrictive here, so this code doesn't + * consider the possibility that, say, /[alpha.]]/ was intended to + * be a posix class. */ +- return NOT_MEANT_TO_BE_A_POSIX_CLASS; ++ CLEAR_POSIX_WARNINGS_AND_RETURN(NOT_MEANT_TO_BE_A_POSIX_CLASS); + } + + /* Here we have something like 'foo:]'. There was no initial colon, +@@ -14508,7 +14514,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, + } + + /* Otherwise, it can't have meant to have been a class */ +- return NOT_MEANT_TO_BE_A_POSIX_CLASS; ++ CLEAR_POSIX_WARNINGS_AND_RETURN(NOT_MEANT_TO_BE_A_POSIX_CLASS); + } + + /* If we ran off the end, and the final character was a punctuation +@@ -14558,7 +14564,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, + * class name. (We can do this on the first pass, as any second pass + * will yield an even shorter name) */ + if (name_len < 3) { +- return NOT_MEANT_TO_BE_A_POSIX_CLASS; ++ CLEAR_POSIX_WARNINGS_AND_RETURN(NOT_MEANT_TO_BE_A_POSIX_CLASS); + } + + /* Find which class it is. Initially switch on the length of the name. +@@ -14717,7 +14723,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, + } + + /* Here neither pass found a close-enough class name */ +- return NOT_MEANT_TO_BE_A_POSIX_CLASS; ++ CLEAR_POSIX_WARNINGS_AND_RETURN(NOT_MEANT_TO_BE_A_POSIX_CLASS); + } + + probably_meant_to_be: +@@ -14759,7 +14765,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, + /* If it is a known class, return the class. The class number + * #defines are structured so each complement is +1 to the normal + * one */ +- return class_number + complement; ++ CLEAR_POSIX_WARNINGS_AND_RETURN(class_number + complement); + } + else if (! check_only) { + +-- +2.9.4 + diff --git a/SOURCES/perl-5.27.0-add-test-for-perl-131522-and-fix-test-for-related-pe.patch b/SOURCES/perl-5.27.0-add-test-for-perl-131522-and-fix-test-for-related-pe.patch new file mode 100644 index 0000000..7a465d9 --- /dev/null +++ b/SOURCES/perl-5.27.0-add-test-for-perl-131522-and-fix-test-for-related-pe.patch @@ -0,0 +1,39 @@ +From d730a80128abafff1e47e2506c23a8c1a06cfef4 Mon Sep 17 00:00:00 2001 +From: Yves Orton +Date: Sun, 18 Jun 2017 23:44:07 +0200 +Subject: [PATCH 2/2] add test for [perl #131522] and fix test for (related) + [perl #127581] +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Petr Písař +--- + t/re/reg_mesg.t | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/t/re/reg_mesg.t b/t/re/reg_mesg.t +index 090eccb..a0b78c4 100644 +--- a/t/re/reg_mesg.t ++++ b/t/re/reg_mesg.t +@@ -221,7 +221,6 @@ my @death = + '/(?[[[::]]])/' => "Syntax error in (?[...]) in regex m/(?[[[::]]])/", + '/(?[[[:w:]]])/' => "Syntax error in (?[...]) in regex m/(?[[[:w:]]])/", + '/(?[[:w:]])/' => "", +- '/[][[:alpha:]]' => "", # [perl #127581] + '/([.].*)[.]/' => "", # [perl #127582] + '/[.].*[.]/' => "", # [perl #127604] + '/(?[a])/' => 'Unexpected character {#} m/(?[a{#}])/', +@@ -587,7 +586,8 @@ my @warning = ( + 'Assuming NOT a POSIX class since a semi-colon was found instead of a colon {#} m/[foo;{#}punct;]]\x{100}/', + 'Assuming NOT a POSIX class since a semi-colon was found instead of a colon {#} m/[foo;punct;]{#}]\x{100}/', + ], +- ++ '/[][[:alpha:]]/' => "", # [perl #127581] ++ '/[][[:alpha:]\\@\\\\^_?]/' => "", # [perl #131522] + ); # See comments before this for why '\x{100}' is generally needed + + # These need the character 'ネ' as a marker for mark_as_utf8() +-- +2.9.4 + diff --git a/SOURCES/perl-5.27.0-perl-129183-don-t-treat-as-an-escape-in-PATH-for-S.patch b/SOURCES/perl-5.27.0-perl-129183-don-t-treat-as-an-escape-in-PATH-for-S.patch new file mode 100644 index 0000000..8889451 --- /dev/null +++ b/SOURCES/perl-5.27.0-perl-129183-don-t-treat-as-an-escape-in-PATH-for-S.patch @@ -0,0 +1,32 @@ +From e80af1fd276d83858d27742ea887415e3263960b Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Wed, 12 Oct 2016 10:42:47 +1100 +Subject: [PATCH] (perl 129183) don't treat \ as an escape in PATH for -S +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Petr Písař +--- + util.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/util.c b/util.c +index 5bb0dfc..6bc2fe5 100644 +--- a/util.c ++++ b/util.c +@@ -3352,9 +3352,8 @@ Perl_find_script(pTHX_ const char *scriptname, bool dosearch, + if (len < sizeof tmpbuf) + tmpbuf[len] = '\0'; + # else +- s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf, s, bufend, +- ':', +- &len); ++ s = delimcpy_no_escape(tmpbuf, tmpbuf + sizeof tmpbuf, s, bufend, ++ ':', &len); + # endif + if (s < bufend) + s++; +-- +2.9.4 + diff --git a/SOURCES/perl-5.27.0-perl-131221-improve-duplication-of-via-handles.patch b/SOURCES/perl-5.27.0-perl-131221-improve-duplication-of-via-handles.patch new file mode 100644 index 0000000..37da371 --- /dev/null +++ b/SOURCES/perl-5.27.0-perl-131221-improve-duplication-of-via-handles.patch @@ -0,0 +1,299 @@ +From 99b847695211f825df6299aa9da91f9494f741e2 Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Thu, 1 Jun 2017 15:11:27 +1000 +Subject: [PATCH] [perl #131221] improve duplication of :via handles +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Previously duplication (as with open ... ">&...") would fail +unless the user supplied a GETARG, which wasn't documented, and +resulted in an attempt to free and unreferened scalar if supplied. + +Cloning on thread creation was simply broken. + +We now handle GETARG correctly, and provide a useful default if it +returns nothing. + +Cloning on thread creation now duplicates the appropriate parts of the +parent thread's handle. + +Signed-off-by: Petr Písař +--- + MANIFEST | 1 + + ext/PerlIO-via/t/thread.t | 73 +++++++++++++++++++++++++++++++++++++++++++++++ + ext/PerlIO-via/t/via.t | 56 +++++++++++++++++++++++++++++++++++- + ext/PerlIO-via/via.pm | 2 +- + ext/PerlIO-via/via.xs | 55 +++++++++++++++++++++++++++++++---- + 5 files changed, 179 insertions(+), 8 deletions(-) + create mode 100644 ext/PerlIO-via/t/thread.t + +diff --git a/MANIFEST b/MANIFEST +index 8c4950e..d39f992 100644 +--- a/MANIFEST ++++ b/MANIFEST +@@ -4056,6 +4056,7 @@ ext/PerlIO-scalar/scalar.xs PerlIO layer for scalars + ext/PerlIO-scalar/t/scalar.t See if PerlIO::scalar works + ext/PerlIO-scalar/t/scalar_ungetc.t Tests for PerlIO layer for scalars + ext/PerlIO-via/hints/aix.pl Hint for PerlIO::via for named architecture ++ext/PerlIO-via/t/thread.t See if PerlIO::via works with threads + ext/PerlIO-via/t/via.t See if PerlIO::via works + ext/PerlIO-via/via.pm PerlIO layer for layers in perl + ext/PerlIO-via/via.xs PerlIO layer for layers in perl +diff --git a/ext/PerlIO-via/t/thread.t b/ext/PerlIO-via/t/thread.t +new file mode 100644 +index 0000000..e4358f9 +--- /dev/null ++++ b/ext/PerlIO-via/t/thread.t +@@ -0,0 +1,73 @@ ++#!perl ++BEGIN { ++ unless (find PerlIO::Layer 'perlio') { ++ print "1..0 # Skip: not perlio\n"; ++ exit 0; ++ } ++ require Config; ++ unless ($Config::Config{'usethreads'}) { ++ print "1..0 # Skip -- need threads for this test\n"; ++ exit 0; ++ } ++ if (($Config::Config{'extensions'} !~ m!\bPerlIO/via\b!) ){ ++ print "1..0 # Skip -- Perl configured without PerlIO::via module\n"; ++ exit 0; ++ } ++} ++ ++use strict; ++use warnings; ++use threads; ++ ++my $tmp = "via$$"; ++ ++END { ++ 1 while unlink $tmp; ++} ++ ++use Test::More tests => 2; ++ ++our $push_count = 0; ++ ++{ ++ open my $fh, ">:via(Test1)", $tmp ++ or die "Cannot open $tmp: $!"; ++ $fh->autoflush; ++ ++ print $fh "AXAX"; ++ ++ # previously this would crash ++ threads->create( ++ sub { ++ print $fh "XZXZ"; ++ })->join; ++ ++ print $fh "BXBX"; ++ close $fh; ++ ++ open my $in, "<", $tmp; ++ my $line = <$in>; ++ close $in; ++ ++ is($line, "AYAYYZYZBYBY", "check thread data delivered"); ++ ++ is($push_count, 1, "PUSHED not called for dup on thread creation"); ++} ++ ++package PerlIO::via::Test1; ++ ++sub PUSHED { ++ my ($class) = @_; ++ ++$main::push_count; ++ bless {}, $class; ++} ++ ++sub WRITE { ++ my ($self, $data, $fh) = @_; ++ $data =~ tr/X/Y/; ++ $fh->autoflush; ++ print $fh $data; ++ return length $data; ++} ++ ++ +diff --git a/ext/PerlIO-via/t/via.t b/ext/PerlIO-via/t/via.t +index 6787e11..80577df 100644 +--- a/ext/PerlIO-via/t/via.t ++++ b/ext/PerlIO-via/t/via.t +@@ -17,7 +17,7 @@ use warnings; + + my $tmp = "via$$"; + +-use Test::More tests => 18; ++use Test::More tests => 26; + + my $fh; + my $a = join("", map { chr } 0..255) x 10; +@@ -84,6 +84,60 @@ is( $obj, 'Foo', 'search for package Foo' ); + open $fh, '<:via(Bar)', "bar"; + is( $obj, 'PerlIO::via::Bar', 'search for package PerlIO::via::Bar' ); + ++{ ++ # [perl #131221] ++ ok(open(my $fh1, ">", $tmp), "open $tmp"); ++ ok(binmode($fh1, ":via(XXX)"), "binmode :via(XXX) onto it"); ++ ok(open(my $fh2, ">&", $fh1), "dup it"); ++ close $fh1; ++ close $fh2; ++ ++ # make sure the old workaround still works ++ ok(open($fh1, ">", $tmp), "open $tmp"); ++ ok(binmode($fh1, ":via(YYY)"), "binmode :via(YYY) onto it"); ++ ok(open($fh2, ">&", $fh1), "dup it"); ++ print $fh2 "XZXZ"; ++ close $fh1; ++ close $fh2; ++ ++ ok(open($fh1, "<", $tmp), "open $tmp for check"); ++ { local $/; $b = <$fh1> } ++ close $fh1; ++ is($b, "XZXZ", "check result is from non-filtering class"); ++ ++ package PerlIO::via::XXX; ++ ++ sub PUSHED { ++ my $class = shift; ++ bless {}, $class; ++ } ++ ++ sub WRITE { ++ my ($self, $buffer, $handle) = @_; ++ ++ print $handle $buffer; ++ return length($buffer); ++ } ++ package PerlIO::via::YYY; ++ ++ sub PUSHED { ++ my $class = shift; ++ bless {}, $class; ++ } ++ ++ sub WRITE { ++ my ($self, $buffer, $handle) = @_; ++ ++ $buffer =~ tr/X/Y/; ++ print $handle $buffer; ++ return length($buffer); ++ } ++ ++ sub GETARG { ++ "XXX"; ++ } ++} ++ + END { + 1 while unlink $tmp; + } +diff --git a/ext/PerlIO-via/via.pm b/ext/PerlIO-via/via.pm +index e477dcc..30083fe 100644 +--- a/ext/PerlIO-via/via.pm ++++ b/ext/PerlIO-via/via.pm +@@ -1,5 +1,5 @@ + package PerlIO::via; +-our $VERSION = '0.16'; ++our $VERSION = '0.17'; + require XSLoader; + XSLoader::load(); + 1; +diff --git a/ext/PerlIO-via/via.xs b/ext/PerlIO-via/via.xs +index 8a7f1fc..61953c8 100644 +--- a/ext/PerlIO-via/via.xs ++++ b/ext/PerlIO-via/via.xs +@@ -38,6 +38,8 @@ typedef struct + CV *UTF8; + } PerlIOVia; + ++static const MGVTBL PerlIOVia_tag = { 0, 0, 0, 0, 0, 0, 0, 0 }; ++ + #define MYMethod(x) #x,&s->x + + static CV * +@@ -131,8 +133,14 @@ PerlIOVia_pushed(pTHX_ PerlIO * f, const char *mode, SV * arg, + PerlIO_funcs * tab) + { + IV code = PerlIOBase_pushed(aTHX_ f, mode, Nullsv, tab); ++ ++ if (SvTYPE(arg) >= SVt_PVMG ++ && mg_findext(arg, PERL_MAGIC_ext, &PerlIOVia_tag)) { ++ return code; ++ } ++ + if (code == 0) { +- PerlIOVia *s = PerlIOSelf(f, PerlIOVia); ++ PerlIOVia *s = PerlIOSelf(f, PerlIOVia); + if (!arg) { + if (ckWARN(WARN_LAYER)) + Perl_warner(aTHX_ packWARN(WARN_LAYER), +@@ -583,20 +591,55 @@ static SV * + PerlIOVia_getarg(pTHX_ PerlIO * f, CLONE_PARAMS * param, int flags) + { + PerlIOVia *s = PerlIOSelf(f, PerlIOVia); +- PERL_UNUSED_ARG(param); ++ SV *arg; + PERL_UNUSED_ARG(flags); +- return PerlIOVia_method(aTHX_ f, MYMethod(GETARG), G_SCALAR, Nullsv); ++ ++ /* During cloning, return an undef token object so that _pushed() knows ++ * that it should not call methods and wait for _dup() to actually dup the ++ * object. */ ++ if (param) { ++ SV *sv = newSV(0); ++ sv_magicext(sv, NULL, PERL_MAGIC_ext, &PerlIOVia_tag, 0, 0); ++ return sv; ++ } ++ ++ arg = PerlIOVia_method(aTHX_ f, MYMethod(GETARG), G_SCALAR, Nullsv); ++ if (arg) { ++ /* arg is a temp, and PerlIOBase_dup() will explicitly free it */ ++ SvREFCNT_inc(arg); ++ } ++ else { ++ arg = newSVpvn(HvNAME(s->stash), HvNAMELEN(s->stash)); ++ } ++ ++ return arg; + } + + static PerlIO * + PerlIOVia_dup(pTHX_ PerlIO * f, PerlIO * o, CLONE_PARAMS * param, + int flags) + { +- if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags))) { +- /* Most of the fields will lazily set themselves up as needed +- stash and obj have been set up by the implied push ++ if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags)) && param) { ++ /* For a non-interpreter dup stash and obj have been set up ++ by the implied push. ++ ++ But if this is a clone for a new interpreter we need to ++ translate the objects to their dups. + */ ++ ++ PerlIOVia *fs = PerlIOSelf(f, PerlIOVia); ++ PerlIOVia *os = PerlIOSelf(o, PerlIOVia); ++ ++ fs->obj = sv_dup_inc(os->obj, param); ++ fs->stash = (HV*)sv_dup((SV*)os->stash, param); ++ fs->var = sv_dup_inc(os->var, param); ++ fs->cnt = os->cnt; ++ ++ /* fh, io, cached CVs left as NULL, PerlIOVia_method() ++ will reinitialize them if needed */ + } ++ /* for a non-threaded dup fs->obj and stash should be set by _pushed() */ ++ + return f; + } + +-- +2.9.4 + diff --git a/SOURCES/perl-5.27.0-perl-131221-sv_dup-sv_dup_inc-are-only-available-und.patch b/SOURCES/perl-5.27.0-perl-131221-sv_dup-sv_dup_inc-are-only-available-und.patch new file mode 100644 index 0000000..f0e89da --- /dev/null +++ b/SOURCES/perl-5.27.0-perl-131221-sv_dup-sv_dup_inc-are-only-available-und.patch @@ -0,0 +1,71 @@ +From 7b3443d31f11c15859593e5b710c301795a6de01 Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Thu, 8 Jun 2017 11:06:39 +1000 +Subject: [PATCH] [perl #131221] sv_dup/sv_dup_inc are only available under + threads +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Petr Písař +--- + ext/PerlIO-via/via.xs | 42 +++++++++++++++++++++++------------------- + 1 file changed, 23 insertions(+), 19 deletions(-) + +diff --git a/ext/PerlIO-via/via.xs b/ext/PerlIO-via/via.xs +index 61953c8..d91c685 100644 +--- a/ext/PerlIO-via/via.xs ++++ b/ext/PerlIO-via/via.xs +@@ -619,26 +619,30 @@ static PerlIO * + PerlIOVia_dup(pTHX_ PerlIO * f, PerlIO * o, CLONE_PARAMS * param, + int flags) + { +- if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags)) && param) { +- /* For a non-interpreter dup stash and obj have been set up +- by the implied push. +- +- But if this is a clone for a new interpreter we need to +- translate the objects to their dups. +- */ +- +- PerlIOVia *fs = PerlIOSelf(f, PerlIOVia); +- PerlIOVia *os = PerlIOSelf(o, PerlIOVia); +- +- fs->obj = sv_dup_inc(os->obj, param); +- fs->stash = (HV*)sv_dup((SV*)os->stash, param); +- fs->var = sv_dup_inc(os->var, param); +- fs->cnt = os->cnt; +- +- /* fh, io, cached CVs left as NULL, PerlIOVia_method() +- will reinitialize them if needed */ ++ if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags))) { ++#ifdef USE_ITHREADS ++ if (param) { ++ /* For a non-interpreter dup stash and obj have been set up ++ by the implied push. ++ ++ But if this is a clone for a new interpreter we need to ++ translate the objects to their dups. ++ */ ++ ++ PerlIOVia *fs = PerlIOSelf(f, PerlIOVia); ++ PerlIOVia *os = PerlIOSelf(o, PerlIOVia); ++ ++ fs->obj = sv_dup_inc(os->obj, param); ++ fs->stash = (HV*)sv_dup((SV*)os->stash, param); ++ fs->var = sv_dup_inc(os->var, param); ++ fs->cnt = os->cnt; ++ ++ /* fh, io, cached CVs left as NULL, PerlIOVia_method() ++ will reinitialize them if needed */ ++ } ++#endif ++ /* for a non-threaded dup fs->obj and stash should be set by _pushed() */ + } +- /* for a non-threaded dup fs->obj and stash should be set by _pushed() */ + + return f; + } +-- +2.9.4 + diff --git a/SOURCES/perl-5.27.0-perl-131526-don-t-go-beyond-the-end-of-the-NUL-in-my.patch b/SOURCES/perl-5.27.0-perl-131526-don-t-go-beyond-the-end-of-the-NUL-in-my.patch new file mode 100644 index 0000000..05b2c80 --- /dev/null +++ b/SOURCES/perl-5.27.0-perl-131526-don-t-go-beyond-the-end-of-the-NUL-in-my.patch @@ -0,0 +1,37 @@ +From 9604fbf0722bd97ca6031a263c50ad52b6633db7 Mon Sep 17 00:00:00 2001 +From: Tony Cook +Date: Wed, 14 Jun 2017 09:42:31 +1000 +Subject: [PATCH] (perl #131526) don't go beyond the end of the NUL in my_atof2 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Perl_my_atof2() calls GROK_NUMERIC_RADIX() to detect and skip past +a decimal point and then can increment the parse pointer (s) before +checking what it points at, so skipping the terminating NUL if the +decimal point is immediately before the NUL. + +Signed-off-by: Petr Písař +--- + numeric.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/numeric.c b/numeric.c +index 6ea6968..5771907 100644 +--- a/numeric.c ++++ b/numeric.c +@@ -1485,9 +1485,9 @@ Perl_my_atof2(pTHX_ const char* orig, NV* value) + else if (!seen_dp && GROK_NUMERIC_RADIX(&s, send)) { + seen_dp = 1; + if (sig_digits > MAX_SIG_DIGITS) { +- do { ++ while (isDIGIT(*s)) { + ++s; +- } while (isDIGIT(*s)); ++ } + break; + } + } +-- +2.9.4 + diff --git a/SOURCES/perl-5.27.3-avoid-the-address-of-.-will-always-evaluate-as-.-war.patch b/SOURCES/perl-5.27.3-avoid-the-address-of-.-will-always-evaluate-as-.-war.patch new file mode 100644 index 0000000..7f2a9f4 --- /dev/null +++ b/SOURCES/perl-5.27.3-avoid-the-address-of-.-will-always-evaluate-as-.-war.patch @@ -0,0 +1,60 @@ +From 45908e4d120d33a558a8b052036c56cd0c90b898 Mon Sep 17 00:00:00 2001 +From: Yves Orton +Date: Wed, 13 Sep 2017 13:30:25 +0200 +Subject: [PATCH] avoid 'the address of ... will always evaluate as ...' warns + in mem macros +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +In f14cf363205 we added asserts to our memory macros (Copy(), Zero() etc) +to ensure that the target is non-null. These asserts throw warnings like + + perl.c: In function ‘Perl_eval_sv’: + perl.c:2976:264: warning: the address of ‘myop’ will always evaluate + as ‘true’ [-Waddress] + Zero(&myop, 1, UNOP); + +which is annoying. This patch changes how these asserts are coded so +we avoid the warning. Thanks to Zefram for the fix. + +Signed-off-by: Petr Písař +--- + handy.h | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +diff --git a/handy.h b/handy.h +index 31afaae65e..85e8f70721 100644 +--- a/handy.h ++++ b/handy.h +@@ -2409,17 +2409,20 @@ void Perl_mem_log_del_sv(const SV *sv, const char *filename, const int linenumbe + #define Safefree(d) safefree(MEM_LOG_FREE((Malloc_t)(d))) + #endif + +-#define Move(s,d,n,t) (MEM_WRAP_CHECK_(n,t) assert(d), assert(s), (void)memmove((char*)(d),(const char*)(s), (n) * sizeof(t))) +-#define Copy(s,d,n,t) (MEM_WRAP_CHECK_(n,t) assert(d), assert(s), (void)memcpy((char*)(d),(const char*)(s), (n) * sizeof(t))) +-#define Zero(d,n,t) (MEM_WRAP_CHECK_(n,t) assert(d), (void)memzero((char*)(d), (n) * sizeof(t))) ++#define perl_assert_ptr(p) assert( ((void*)(p)) != 0 ) + +-#define MoveD(s,d,n,t) (MEM_WRAP_CHECK_(n,t) assert(d), assert(s), memmove((char*)(d),(const char*)(s), (n) * sizeof(t))) +-#define CopyD(s,d,n,t) (MEM_WRAP_CHECK_(n,t) assert(d), assert(s), memcpy((char*)(d),(const char*)(s), (n) * sizeof(t))) ++ ++#define Move(s,d,n,t) (MEM_WRAP_CHECK_(n,t) perl_assert_ptr(d), perl_assert_ptr(s), (void)memmove((char*)(d),(const char*)(s), (n) * sizeof(t))) ++#define Copy(s,d,n,t) (MEM_WRAP_CHECK_(n,t) perl_assert_ptr(d), perl_assert_ptr(s), (void)memcpy((char*)(d),(const char*)(s), (n) * sizeof(t))) ++#define Zero(d,n,t) (MEM_WRAP_CHECK_(n,t) perl_assert_ptr(d), (void)memzero((char*)(d), (n) * sizeof(t))) ++ ++#define MoveD(s,d,n,t) (MEM_WRAP_CHECK_(n,t) perl_assert_ptr(d), perl_assert_ptr(s), memmove((char*)(d),(const char*)(s), (n) * sizeof(t))) ++#define CopyD(s,d,n,t) (MEM_WRAP_CHECK_(n,t) perl_assert_ptr(d), perl_assert_ptr(s), memcpy((char*)(d),(const char*)(s), (n) * sizeof(t))) + #ifdef HAS_MEMSET +-#define ZeroD(d,n,t) (MEM_WRAP_CHECK_(n,t) assert(d), memzero((char*)(d), (n) * sizeof(t))) ++#define ZeroD(d,n,t) (MEM_WRAP_CHECK_(n,t) perl_assert_ptr(d), memzero((char*)(d), (n) * sizeof(t))) + #else + /* Using bzero(), which returns void. */ +-#define ZeroD(d,n,t) (MEM_WRAP_CHECK_(n,t) assert(d), memzero((char*)(d), (n) * sizeof(t)),d) ++#define ZeroD(d,n,t) (MEM_WRAP_CHECK_(n,t) perl_assert_ptr(d), memzero((char*)(d), (n) * sizeof(t)),d) + #endif + + #define PoisonWith(d,n,t,b) (MEM_WRAP_CHECK_(n,t) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t))) +-- +2.13.6 + diff --git a/SOURCES/perl-5.27.5-Avoid-a-segfault-when-untying-an-object.patch b/SOURCES/perl-5.27.5-Avoid-a-segfault-when-untying-an-object.patch new file mode 100644 index 0000000..ba8cdfa --- /dev/null +++ b/SOURCES/perl-5.27.5-Avoid-a-segfault-when-untying-an-object.patch @@ -0,0 +1,32 @@ +From e7e69c85c7e8e0cb75b831e606ad4f26f18b11ff Mon Sep 17 00:00:00 2001 +From: Nicolas R +Date: Mon, 31 Oct 2016 11:53:17 -0600 +Subject: [PATCH] Avoid a segfault when untying an object +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Check if the tied object has a stash set +before calling UNTIE method. + +Signed-off-by: Petr Písař +--- + pp_sys.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/pp_sys.c b/pp_sys.c +index 672e7de08e..6d4dd86b7f 100644 +--- a/pp_sys.c ++++ b/pp_sys.c +@@ -1017,7 +1017,7 @@ PP(pp_untie) + + if ((mg = SvTIED_mg(sv, how))) { + SV * const obj = SvRV(SvTIED_obj(sv, mg)); +- if (obj) { ++ if (obj && SvSTASH(obj)) { + GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE); + CV *cv; + if (gv && isGV(gv) && (cv = GvCV(gv))) { +-- +2.13.6 + diff --git a/SOURCES/perl-5.27.7-Reenable-numeric-first-argument-of-system-on-VMS.patch b/SOURCES/perl-5.27.7-Reenable-numeric-first-argument-of-system-on-VMS.patch new file mode 100644 index 0000000..74cb681 --- /dev/null +++ b/SOURCES/perl-5.27.7-Reenable-numeric-first-argument-of-system-on-VMS.patch @@ -0,0 +1,34 @@ +From 8e7c2faafb74d3b07e8a5818608dfe065e361604 Mon Sep 17 00:00:00 2001 +From: "Craig A. Berry" +Date: Mon, 1 Jan 2018 10:10:33 -0600 +Subject: [PATCH] Reenable numeric first argument of system() on VMS. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This was broken in 64def2aeaeb63f92dadc6dfa334, and fixed for Win32 +only in 8fe3452cc6ac7af8c08. But VMS also uses a numeric first +argument to system() as a flag indicating spawn without waiting for +completion. + +Signed-off-by: Petr Písař +--- + pp_sys.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/pp_sys.c b/pp_sys.c +index 0c9147bc4e..5154b9baa8 100644 +--- a/pp_sys.c ++++ b/pp_sys.c +@@ -4375,7 +4375,7 @@ PP(pp_system) + STRLEN len; + char *pv; + SvGETMAGIC(origsv); +-#ifdef WIN32 ++#if defined(WIN32) || defined(__VMS) + /* + * Because of a nasty platform-specific variation on the meaning + * of arguments to this op, we must preserve numeric arguments +-- +2.13.6 + diff --git a/SOURCES/perl-5.27.7-preserve-numericness-of-system-args-on-Win32.patch b/SOURCES/perl-5.27.7-preserve-numericness-of-system-args-on-Win32.patch new file mode 100644 index 0000000..ab61f96 --- /dev/null +++ b/SOURCES/perl-5.27.7-preserve-numericness-of-system-args-on-Win32.patch @@ -0,0 +1,73 @@ +From 8fe3452cc6ac7af8c08c2044cd3757018a9c8887 Mon Sep 17 00:00:00 2001 +From: Zefram +Date: Fri, 22 Dec 2017 05:32:41 +0000 +Subject: [PATCH] preserve numericness of system() args on Win32 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +On Windows there's a nasty variation in the meaning of arguments +to Perl's system(), in which a numeric first argument isn't used as +part of the command to run, but instead selects between two different +operations to perform with the command (whether to wait for the command +to complete or not). Therefore the reduction of argument scalars to +their operative values in the parent process, which was added in commit +64def2aeaeb63f92dadc6dfa33486c1d7b311963, needs to preserve numericness +of arguments on Windows. Fixes [perl #132633]. + +Signed-off-by: Petr Písař +--- + pp_sys.c | 35 +++++++++++++++++++++++++++++++---- + 1 file changed, 31 insertions(+), 4 deletions(-) + +diff --git a/pp_sys.c b/pp_sys.c +index beb60da4c6..0649794104 100644 +--- a/pp_sys.c ++++ b/pp_sys.c +@@ -4393,12 +4393,39 @@ PP(pp_system) + # endif + + while (++MARK <= SP) { +- SV *origsv = *MARK; ++ SV *origsv = *MARK, *copysv; + STRLEN len; + char *pv; +- pv = SvPV(origsv, len); +- *MARK = newSVpvn_flags(pv, len, +- (SvFLAGS(origsv) & SVf_UTF8) | SVs_TEMP); ++ SvGETMAGIC(origsv); ++#ifdef WIN32 ++ /* ++ * Because of a nasty platform-specific variation on the meaning ++ * of arguments to this op, we must preserve numeric arguments ++ * as numeric, not just retain the string value. ++ */ ++ if (SvNIOK(origsv) || SvNIOKp(origsv)) { ++ copysv = newSV_type(SVt_PVNV); ++ sv_2mortal(copysv); ++ if (SvPOK(origsv) || SvPOKp(origsv)) { ++ pv = SvPV_nomg(origsv, len); ++ sv_setpvn(copysv, pv, len); ++ SvPOK_off(copysv); ++ } ++ if (SvIOK(origsv) || SvIOKp(origsv)) ++ SvIV_set(copysv, SvIVX(origsv)); ++ if (SvNOK(origsv) || SvNOKp(origsv)) ++ SvNV_set(copysv, SvNVX(origsv)); ++ SvFLAGS(copysv) |= SvFLAGS(origsv) & ++ (SVf_IOK|SVf_NOK|SVf_POK|SVp_IOK|SVp_NOK|SVp_POK| ++ SVf_UTF8|SVf_IVisUV); ++ } else ++#endif ++ { ++ pv = SvPV_nomg(origsv, len); ++ copysv = newSVpvn_flags(pv, len, ++ (SvFLAGS(origsv) & SVf_UTF8) | SVs_TEMP); ++ } ++ *MARK = copysv; + } + MARK = ORIGMARK; + +-- +2.13.6 + diff --git a/SOURCES/perl-5.27.8-hints-linux-Add-lphtread-to-lddlflags.patch b/SOURCES/perl-5.27.8-hints-linux-Add-lphtread-to-lddlflags.patch new file mode 100644 index 0000000..f68569f --- /dev/null +++ b/SOURCES/perl-5.27.8-hints-linux-Add-lphtread-to-lddlflags.patch @@ -0,0 +1,61 @@ +From f6bc8fb3d26892ba1a84ba2df76beedd51998dd2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Mon, 29 Jan 2018 16:34:17 +0100 +Subject: [PATCH] hints/linux: Add -lphtread to lddlflags +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Passing -z defs to linker flags causes perl to fail to build if threads are +enabled: + +gcc -shared -Wl,-z,relro -Wl,-z,defs -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -L/usr/local/lib -fstack-protector-strong Bzip2.o -o ../../lib/auto/Compress/Raw/Bzip2/Bzip2.so \ + -L/usr/lib64 -lbz2 "-L../.." -lperl \ + +Bzip2.o: In function `deRef': +/builddir/build/BUILD/perl-5.26.1/cpan/Compress-Raw-Bzip2/Bzip2.xs:256: undefined reference to `pthread_getspecific' + +The reason is Bzip2.xs calls dTHX macro included from thread.h via perl.h that +expands to pthread_getspecific() function call that is defined in pthread +library. But the pthread library is not explicitly linked to Bzip.so (see the +gcc command). This is exactly what -z defs linker flag enforces. + +Underlinking ELFs can be dangerous because in case of versioned +symbols it can cause run-time binding to an improper version symbol or +even to an symbold from different library. + +This patch fixes hints for Linux by adding -lpthreads to lddlflags. It +also adds -shared there because Configure.sh adds it only hints return +lddlflags empty. + + + +Signed-off-by: Petr Písař +--- + hints/linux.sh | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/hints/linux.sh b/hints/linux.sh +index 3f38ea07f1..9ec3bc02ef 100644 +--- a/hints/linux.sh ++++ b/hints/linux.sh +@@ -353,12 +353,16 @@ if [ -f /etc/synoinfo.conf -a -d /usr/syno ]; then + echo "$libswanted" >&4 + fi + ++# Flags needed to produce shared libraries. ++lddlflags='-shared' ++ + # This script UU/usethreads.cbu will get 'called-back' by Configure + # after it has prompted the user for whether to use threads. + cat > UU/usethreads.cbu <<'EOCBU' + case "$usethreads" in + $define|true|[yY]*) + ccflags="-D_REENTRANT -D_GNU_SOURCE $ccflags" ++ lddlflags="-lpthread $lddlflags" + if echo $libswanted | grep -v pthread >/dev/null + then + set `echo X "$libswanted "| sed -e 's/ c / pthread c /'` +-- +2.13.6 + diff --git a/SOURCES/perl-5.28.1-regcomp.c-Convert-some-strchr-to-memchr.patch b/SOURCES/perl-5.28.1-regcomp.c-Convert-some-strchr-to-memchr.patch new file mode 100644 index 0000000..bfdadde --- /dev/null +++ b/SOURCES/perl-5.28.1-regcomp.c-Convert-some-strchr-to-memchr.patch @@ -0,0 +1,53 @@ +From cc56be313c7d4e7c266c01dabc762a153d5b2c28 Mon Sep 17 00:00:00 2001 +From: Karl Williamson +Date: Sat, 25 Mar 2017 15:00:22 -0600 +Subject: [PATCH] regcomp.c: Convert some strchr to memchr + +This allows things to work properly in the face of embedded NULs. +See the branch merge message for more information. + +(cherry picked from commit 43b2f4ef399e2fd7240b4eeb0658686ad95f8e62) +--- + regcomp.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +diff --git a/regcomp.c b/regcomp.c +index d0d08352c0..2bee9d4460 100644 +--- a/regcomp.c ++++ b/regcomp.c +@@ -11793,7 +11793,8 @@ S_grok_bslash_N(pTHX_ RExC_state_t *pRExC_state, + + RExC_parse++; /* Skip past the '{' */ + +- if (! (endbrace = strchr(RExC_parse, '}')) /* no trailing brace */ ++ endbrace = (char *) memchr(RExC_parse, '}', RExC_end - RExC_parse); ++ if (! endbrace /* no trailing brace */ + || ! (endbrace == RExC_parse /* nothing between the {} */ + || (endbrace - RExC_parse >= 2 /* U+ (bad hex is checked... */ + && strnEQ(RExC_parse, "U+", 2)))) /* ... below for a better +@@ -12493,9 +12494,11 @@ S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth) + else { + STRLEN length; + char name = *RExC_parse; +- char * endbrace; ++ char * endbrace = NULL; + RExC_parse += 2; +- endbrace = strchr(RExC_parse, '}'); ++ if (RExC_parse < RExC_end) { ++ endbrace = (char *) memchr(RExC_parse, '}', RExC_end - RExC_parse); ++ } + + if (! endbrace) { + vFAIL2("Missing right brace on \\%c{}", name); +@@ -15963,7 +15966,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth, + vFAIL2("Empty \\%c", (U8)value); + if (*RExC_parse == '{') { + const U8 c = (U8)value; +- e = strchr(RExC_parse, '}'); ++ e = (char *) memchr(RExC_parse, '}', RExC_end - RExC_parse); + if (!e) { + RExC_parse++; + vFAIL2("Missing right brace on \\%c{}", c); +-- +2.11.0 + diff --git a/SOURCES/perl-5.8.0-libdir64.patch b/SOURCES/perl-5.8.0-libdir64.patch new file mode 100644 index 0000000..0ab67a0 --- /dev/null +++ b/SOURCES/perl-5.8.0-libdir64.patch @@ -0,0 +1,46 @@ +--- perl-5.8.0/Configure.orig 2002-09-09 11:31:19.000000000 -0400 ++++ perl-5.8.0/Configure 2002-09-09 11:40:37.000000000 -0400 +@@ -6458,8 +6458,8 @@ + : Reproduce behavior of 5.005 and earlier, maybe drop that in 5.7. + case "$installstyle" in + '') case "$prefix" in +- *perl*) dflt='lib';; +- *) dflt='lib/perl5' ;; ++ *perl*) dflt='lib64';; ++ *) dflt='lib64/perl5' ;; + esac + ;; + *) dflt="$installstyle" ;; +@@ -6475,8 +6475,8 @@ + : /opt/perl/lib/perl5... would be redundant. + : The default "style" setting is made in installstyle.U + case "$installstyle" in +-*lib/perl5*) set dflt privlib lib/$package/$version ;; +-*) set dflt privlib lib/$version ;; ++*lib64/perl5*) set dflt privlib lib64/$package/$version ;; ++*) set dflt privlib lib64/$version ;; + esac + eval $prefixit + $cat <_PRINT_PREREQ; +- } ++ } ++ ++ # USE_MM_LD_RUN_PATH - another RedHatism to disable automatic RPATH generation ++ if ( ( ! $self->{USE_MM_LD_RUN_PATH} ) ++ &&( ("@ARGV" =~ /\bUSE_MM_LD_RUN_PATH(=([01]))?\b/) ++ ||( exists( $ENV{USE_MM_LD_RUN_PATH} ) ++ &&( $ENV{USE_MM_LD_RUN_PATH} =~ /([01])?$/ ) ++ ) ++ ) ++ ) ++ { ++ my $v = $1; ++ if( $v ) ++ { ++ $v = ($v=~/=([01])$/)[0]; ++ }else ++ { ++ $v = 1; ++ }; ++ $self->{USE_MM_LD_RUN_PATH}=$v; ++ }; + + print "MakeMaker (v$VERSION)\n" if $Verbose; + if (-f "MANIFEST" && ! -f "Makefile" && ! $UNDER_CORE){ +@@ -2352,6 +2372,40 @@ precedence. A typemap in the current di + precedence, even if it isn't listed in TYPEMAPS. The default system + typemap has lowest precedence. + ++=item USE_MM_LD_RUN_PATH ++ ++boolean ++The Fedora perl MakeMaker distribution differs from the standard ++upstream release in that it disables use of the MakeMaker generated ++LD_RUN_PATH by default, UNLESS this attribute is specified , or the ++USE_MM_LD_RUN_PATH environment variable is set during the MakeMaker run. ++ ++The upstream MakeMaker will set the ld(1) environment variable LD_RUN_PATH ++to the concatenation of every -L ld(1) option directory in which a -l ld(1) ++option library is found, which is used as the ld(1) -rpath option if none ++is specified. This means that, if your application builds shared libraries ++and your MakeMaker application links to them, that the absolute paths of the ++libraries in the build tree will be inserted into the RPATH header of all ++MakeMaker generated binaries, and that such binaries will be unable to link ++to these libraries if they do not still reside in the build tree directories ++(unlikely) or in the system library directories (/lib or /usr/lib), regardless ++of any LD_LIBRARY_PATH setting. So if you specified -L../mylib -lmylib , and ++ your 'libmylib.so' gets installed into /some_directory_other_than_usr_lib, ++ your MakeMaker application will be unable to link to it, even if LD_LIBRARY_PATH ++is set to include /some_directory_other_than_usr_lib, because RPATH overrides ++LD_LIBRARY_PATH. ++ ++So for Fedora MakeMaker builds LD_RUN_PATH is NOT generated by default for ++every link. You can still use explicit -rpath ld options or the LD_RUN_PATH ++environment variable during the build to generate an RPATH for the binaries. ++ ++You can set the USE_MM_LD_RUN_PATH attribute to 1 on the MakeMaker command ++line or in the WriteMakefile arguments to enable generation of LD_RUN_PATH ++for every link command. ++ ++USE_MM_LD_RUN_PATH will default to 1 (LD_RUN_PATH will be used) IF the ++$USE_MM_LD_RUN_PATH environment variable is set during a MakeMaker run. ++ + =item VENDORPREFIX + + Like PERLPREFIX, but only for the vendor install locations. +diff -up perl-5.14.0/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm.usem perl-5.14.0/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm +--- perl-5.14.0/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm.usem 2011-05-08 05:10:08.000000000 +0200 ++++ perl-5.14.0/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm 2011-05-17 11:14:22.172115972 +0200 +@@ -944,7 +944,7 @@ $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $ + } + + my $ld_run_path_shell = ""; +- if ($self->{LD_RUN_PATH} ne "") { ++ if (($self->{LD_RUN_PATH} ne "") && ($self->{USE_MM_LD_RUN_PATH})) { + $ld_run_path_shell = 'LD_RUN_PATH="$(LD_RUN_PATH)" '; + } + diff --git a/SOURCES/perl-example.stp b/SOURCES/perl-example.stp new file mode 100644 index 0000000..040f8e3 --- /dev/null +++ b/SOURCES/perl-example.stp @@ -0,0 +1,21 @@ +/* + Example of the perl systemtap tapset shows a nested view of perl subroutine + calls and returns across the whole system. + + To run: + stap perl-example.stp (for all perl processes) + For specific perl process: + stap perl-example.stp -c COMMAND +*/ + +probe perl.sub.call +{ + printf("%s => sub: %s, filename: %s, line: %d, package: %s\n", + thread_indent(1), sub, filename, lineno, package) +} + +probe perl.sub.return +{ + printf("%s <= sub: %s, filename: %s, line: %d, package: %s\n", + thread_indent(-1), sub, filename, lineno, package) +} diff --git a/SOURCES/perl-perlbug-tag.patch b/SOURCES/perl-perlbug-tag.patch new file mode 100644 index 0000000..0f96ab3 --- /dev/null +++ b/SOURCES/perl-perlbug-tag.patch @@ -0,0 +1,21 @@ +diff -up perl-5.16.0-RC2/utils/perlbug.PL.fedora perl-5.16.0-RC2/utils/perlbug.PL +--- perl-5.16.0-RC2/utils/perlbug.PL.fedora 2012-05-16 16:15:51.000000000 +0200 ++++ perl-5.16.0-RC2/utils/perlbug.PL 2012-05-16 16:18:36.018894464 +0200 +@@ -271,17 +271,6 @@ sub Init { + $ok = ''; + if ($opt{o}) { + if ($opt{o} eq 'k' or $opt{o} eq 'kay') { +- my $age = time - $patchlevel_date; +- if ($opt{o} eq 'k' and $age > 60 * 24 * 60 * 60 ) { +- my $date = localtime $patchlevel_date; +- print <<"EOF"; +-"perlbug -ok" and "perlbug -nok" do not report on Perl versions which +-are more than 60 days old. This Perl version was constructed on +-$date. If you really want to report this, use +-"perlbug -okay" or "perlbug -nokay". +-EOF +- exit(); +- } + # force these options + unless ($opt{n}) { + $opt{S} = 1; # don't prompt for send diff --git a/SOURCES/perl.stp b/SOURCES/perl.stp new file mode 100644 index 0000000..dbc51a8 --- /dev/null +++ b/SOURCES/perl.stp @@ -0,0 +1,71 @@ +/* + This probe will fire when the perl script enters a subroutine. + */ + +probe perl.sub.call = process("LIBRARY_PATH").mark("sub__entry") +{ + + sub = user_string($arg1) + filename = user_string($arg2) + lineno = $arg3 + package = user_string($arg4) + +} + +/* + This probe will fire when the return from a subroutine has been + hit. + */ + +probe perl.sub.return = process("LIBRARY_PATH").mark("sub__return") +{ + + sub = user_string($arg1) + filename = user_string($arg2) + lineno = $arg3 + package = user_string($arg4) + +} + +/* + This probe will fire when the Perl interperter changes state. + */ + +probe perl.phase.change = process("LIBRARY_PATH").mark("phase__change") +{ + newphase = user_string($arg1) + oldphase = user_string($arg2) + +} + + +/* + Fires when Perl has successfully loaded an individual file. + */ + +probe perl.loaded.file = process("LIBRARY_PATH").mark("loaded__file") +{ + filename = user_string($arg1) + +} + + +/* + Fires when Perl is about to load an individual file. + */ + +probe perl.loading.file = process("LIBRARY_PATH").mark("loading__file") +{ + filename = user_string($arg1) + +} + + +/* + Traces the execution of each opcode in the Perl runloop. + */ + +probe perl.op.entry = process("LIBRARY_PATH").mark("op__entry") +{ + opname = user_string($arg1) +} diff --git a/SPECS/perl.spec b/SPECS/perl.spec new file mode 100644 index 0000000..696340a --- /dev/null +++ b/SPECS/perl.spec @@ -0,0 +1,7030 @@ +%global perl_version 5.24.4 +%global perl_epoch 4 +%global perl_arch_stem -thread-multi +%global perl_archname %{_arch}-%{_os}%{perl_arch_stem} + +%global multilib_64_archs aarch64 %{power64} s390x sparc64 x86_64 +%global parallel_tests 1 +%global tapsetdir %{_datadir}/systemtap/tapset + +%global dual_life 0 +%global rebuild_from_scratch %{defined perl_bootstrap} + +# This overrides filters from build root (/usr/lib/rpm/macros.d/macros.perl) +# intentionally (unversioned perl(DB) is removed and versioned one is kept). +# Filter provides from *.pl files, bug #924938 +%global __provides_exclude_from .*%{_docdir}|.*%{perl_archlib}/.*\\.pl$|.*%{perl_privlib}/.*\\.pl$ +%global __requires_exclude_from %{_docdir} +%global __provides_exclude perl\\((VMS|Win32|BSD::|DB\\)$) +%global __requires_exclude perl\\((VMS|BSD::|Win32|Tk|Mac::|Your::Module::Here) +# same as we provide in /usr/lib/rpm/macros.d/macros.perl +%global perl5_testdir %{_libexecdir}/perl5-tests + +# Optional features +# We can bootstrap without gdbm +%bcond_without gdbm +# Support for groff, bug #135101 +%bcond_without perl_enables_groff +# Run syslog tests +%bcond_with perl_enables_syslog_test +# SystemTap support +%bcond_without perl_enables_systemtap +# <> operator uses File::Glob nowadays. CSH is not needed. +%bcond_with perl_enables_tcsh +# We can skip %%check phase +%bcond_without test + +Name: perl +Version: %{perl_version} +# release number must be even higher, because dual-lived modules will be broken otherwise +Release: 404%{?dist} +Epoch: %{perl_epoch} +Summary: Practical Extraction and Report Language +# These are all found licenses. They are distributed among various +# subpackages. +# dist/Tie-File/lib/Tie/File.pm: GPLv2+ or Artistic +# cpan/Getopt-Long/lib/Getopt/Long.pm: GPLv2+ or Artistic +# cpan/Compress-Raw-Zlib/Zlib.xs: (GPL+ or Artistic) and zlib +# cpan/Digest-MD5/MD5.xs: (GPL+ or Artistic) and BSD +# cpan/Time-Piece/Piece.xs: (GPL+ or Artisitc) and BSD +# dist/PathTools/Cwd.xs: (GPL+ or Artisitc) and BSD +# cpan/perlfaq/lib/perlfaq4.pod: (GPL+ or Artistic) and Public Domain +# cpan/Test-Simple/lib/Test/Tutorial.pod: (GPL+ or Artistic) and +# Public Domain +# cpan/MIME-Base64/Base64.xs: (GPL+ or Artistic) and MIT +# cpan/Test-Simple/lib/ok.pm: CC0 +# cpan/Text-Tabs/lib/Text/Wrap.pm: TTWL +# cpan/Encode/bin/encguess: Artistic 2.0 +# cpan/Unicode-Collate/Collate/allkeys.txt: Unicode +# lib/unicore: UCD +# ext/SDBM_File/sdbm.{c,h}: Public domain +# regexec.c, regcomp.c: HSLR +# cpan/Locale-Maketext-Simple/lib/Locale/Maketext/Simple.pm: MIT (with +# exception for Perl) +# time64.c: MIT +# pod/perlpodstyle.pod: MIT +# pod/perlunicook.pod: (GPL+ or Artistic) and Public Domain +# pod/perlgpl.pod: GPL text +# pod/perlartistic.pod: Artistic text +# ext/File-Glob/bsd_glob.{c,h}: BSD +# Other files: GPL+ or Artistic +## Not is a binary package +# cpan/podlators/t/style/minimum-version.t MIT +# cpan/Term-ANSIColor/t/lib/Test/RRA/Config.pm: MIT +## Unbundled +# cpan/Compress-Raw-Bzip2/bzip2-src: BSD +# cpan/Compress-Raw-Zlib/zlib-src: zlib +## perl sub-package notice +# perluniprops.pod is generated from lib/unicore sources: UCD +License: (GPL+ or Artistic) and (GPLv2+ or Artistic) and BSD and Public Domain and UCD +Url: http://www.perl.org/ +Source0: http://www.cpan.org/src/5.0/perl-%{perl_version}.tar.bz2 +Source3: macros.perl +#Systemtap tapset and example that make use of systemtap-sdt-devel +# build requirement. Written by lberk; Not yet upstream. +Source4: perl.stp +Source5: perl-example.stp +# Tom Christiansen confirms Pod::Html uses the same license as perl +Source6: Pod-Html-license-clarification + +# Pregenerated dependencies for bootstrap. +# If your RPM tool fails on including the source file, then you forgot to +# define _sourcedir macro to point to the directory with the sources. +Source7: gendep.macros +%if %{defined perl_bootstrap} +%include %{SOURCE7} +%endif + +# Removes date check, Fedora/RHEL specific +Patch1: perl-perlbug-tag.patch + +# Fedora/RHEL only (64bit only) +Patch3: perl-5.8.0-libdir64.patch + +# Fedora/RHEL specific (use libresolv instead of libbind), bug #151127 +Patch4: perl-5.10.0-libresolv.patch + +# FIXME: May need the "Fedora" references removed before upstreaming +# patches ExtUtils-MakeMaker +Patch5: perl-USE_MM_LD_RUN_PATH.patch + +# Provide maybe_command independently, bug #1129443 +Patch6: perl-5.22.1-Provide-ExtUtils-MM-methods-as-standalone-ExtUtils-M.patch + +# The Fedora builders started randomly failing this futime test +# only on x86_64, so we just don't run it. Works fine on normal +# systems. +Patch7: perl-5.10.0-x86_64-io-test-failure.patch + +# switch off test, which is failing only on koji (fork) +Patch8: perl-5.14.1-offtest.patch + +# Define SONAME for libperl.so +Patch15: perl-5.16.3-create_libperl_soname.patch + +# Install libperl.so to -Dshrpdir value +Patch16: perl-5.22.0-Install-libperl.so-to-shrpdir-on-Linux.patch + +# Document Math::BigInt::CalcEmu requires Math::BigInt, rhbz#959096, +# CPAN RT#85015 +Patch22: perl-5.18.1-Document-Math-BigInt-CalcEmu-requires-Math-BigInt.patch + +# Make *DBM_File desctructors thread-safe, bug #1107543, RT#61912 +Patch26: perl-5.18.2-Destroy-GDBM-NDBM-ODBM-SDBM-_File-objects-only-from-.patch + +# Workaround for Coro, bug #1231165, CPAN RT#101063. To remove in the future. +Patch28: perl-5.22.0-Revert-const-the-core-magic-vtables.patch + +# Replace ExtUtils::MakeMaker dependency with ExtUtils::MM::Utils. +# This allows not to require perl-devel. Bug #1129443 +Patch30: perl-5.22.1-Replace-EU-MM-dependnecy-with-EU-MM-Utils-in-IPC-Cmd.patch + +# Do not use unitialized memory in $h{\const} warnings, RT#128189, +# in upstream after 5.25.2 +Patch34: perl-5.25.2-uninit-warning-from-h-const-coredumped.patch + +# Do not treat %: as a stash, RT#128238, in upstream after 5.25.2 +Patch36: perl-5.25.2-only-treat-stash-entries-with-.-as-sub-stashes.patch + +# Do not crash when inserting a non-stash into a stash, RT#128238, +# in upstream after 5.25.2 +Patch37: perl-5.25.2-perl-128238-Crash-with-non-stash-in-stash.patch + +# Fix a crash when vivifying a stub in a deleted package, RT#128532, +# in upstream after 5.25.2 +Patch40: perl-5.25.2-perl-128532-Crash-vivifying-stub-in-deleted-pkg.patch + +# Fix a crash in "Subroutine redefined" warning, RT#128257, +# in upstream after 5.25.2 +Patch41: perl-5.25.2-SEGV-in-Subroutine-redefined-warning.patch + +# Fix crash in splice, RT#129164, RT#129166, RT#129167, in upstream after 5.25.4 +Patch48: perl-5.24.0-perl-129164-Crash-with-splice.patch + +# Fix string overrun in Perl_gv_fetchmethod_pvn_flags, RT#129267, +# in upstream after 5.25.4 +Patch49: perl-5.24.0-clean-up-gv_fetchmethod_pvn_flags-introduce-name_end.patch +Patch50: perl-5.25.4-clean-up-gv_fetchmethod_pvn_flags-move-origname-init.patch +Patch51: perl-5.25.4-clean-up-gv_fetchmethod_pvn_flags-rename-nsplit-to-l.patch +Patch52: perl-5.25.4-fix-129267-rework-gv_fetchmethod_pvn_flags-separator.patch +Patch53: perl-5.25.4-perl-129267-Test-for-gv_fetchmethod-buffer-overrun.patch + +# Fix crash when matching UTF-8 string with non-UTF-8 substrings, RT#129350, +# in upstream after 5.25.5 +Patch54: perl-5.24.4-perl-129350-anchored-floating-substrings-must-be-utf.patch + +# Fix parsing perl options in shell bang line, RT#129336, +# in upstream after 5.25.5 +Patch55: perl-5.24.0-rt-129336-perl-i-u-erroneously-interpreted-as-u.patch + +# Fix firstchar bitmap under UTF-8 with prefix optimization, RT#129950, +# in upstream after 5.25.6 +Patch56: perl-5.24.0-regcomp.c-fix-perl-129950-fix-firstchar-bitmap-under.patch + +# Avoid infinite loop in h2xs tool if enum and type have the same name, +# RT#130001, in upstream after 5.25.6 +Patch57: perl-5.25.6-perl-130001-h2xs-avoid-infinite-loop-for-enums.patch + +# Fix stack handling when calling chdir without an argument, RT#129130, +# in upstream after 5.25.6 +Patch58: perl-5.24.0-perl-129130-make-chdir-allocate-the-stack-it-needs.patch + +# Fix crash in Storable when deserializing malformed code reference, RT#68348, +# RT130098 +Patch59: perl-5.25.7-Fix-Storable-segfaults.patch + +# Fix crash on explicit return from regular expression substitution, RT#130188, +# in upstream after 5.25.7 +Patch60: perl-5.24.0-crash-on-explicit-return-from-s-e.patch + +# Fix assigning split() return values to an array, in upstream after 5.25.7 +Patch61: perl-5.24.0-split-was-leaving-PL_sv_undef-in-unused-ary-slots.patch + +# Fix const correctness in hv_func.h, bug #1242980, RT#130169, +# in upstream after 5.25.7 +Patch62: perl-5.25.7-Fix-const-correctness-in-hv_func.h.patch + +# Fix a crash in optimized evaluation of "or ((0) x 0))", RT#130247, +# in upsream after 5.25.7 +Patch63: perl-5.24.0-assertion-failure-in-.-or-0-x-0.patch + +# Fix a memory leak in IO::Poll, RT#129788, in upstream after 5.25.7 +Patch64: perl-5.24.0-perl-129788-IO-Poll-fix-memory-leak.patch + +# Fix regular expression matching, RT#130307, in upstream after 5.25.7 +Patch65: perl-5.24.4-perl-130307-Correctly-unwind-on-cache-hit.patch + +# Fix a buffer overflow in split in scalar context, RT#130262, +# in upstream after 5.25.8 +Patch66: perl-5.24.1-perl-130262-split-scalar-context-stack-overflow-fix.patch + +# Fix a heap overflow with pack "W", RT129149, in upstream after 5.25.8 +Patch67: perl-5.24.4-perl-129149-avoid-a-heap-buffer-overflow-with-pack-W.patch +Patch68: perl-5.24.4-perl-129149-fix-the-test-so-skip-has-a-SKIP-to-work-.patch + +# Fix a use-after-free when processing scalar variables in forms, RT#129125, +# in upstream after 5.25.8 +Patch69: perl-5.24.1-perl-129125-copy-form-data-if-it-might-be-freed.patch + +# Fix a heap overflow if invalid octal or hexadecimal number is used in +# transliteration expression, RT#129342, in upstream after 5.25.8 +Patch70: perl-5.24.1-perl-129342-ensure-range-start-is-set-after-error-in.patch + +# Fix out-of-bound read in case of unmatched regexp backreference, RT#129377, +# in upstream after 5.25.8 +Patch71: perl-5.24.1-perl-129377-don-t-read-past-start-of-string-for-unma.patch + +# Fix UTF-8 string handling in & operator, RT#129287, in upstream after 5.25.4 +Patch72: perl-5.25.4-perl-129287-Make-UTF8-append-null.patch + +# Fix recreation of *::, RT#129869, in upstream after 5.25.9 +Patch73: perl-5.24.1-fix-special-case-recreation-of.patch + +# Fix a memory leak in B::RHE->HASH method, RT#130504, in upstream after 5.25.9 +Patch74: perl-5.24.1-Fix-memory-leak-in-B-RHE-HASH-method.patch + +# Fix parsing goto statements in multicalled subroutine, RT#113938, +# in upstream after 5.25.9 +Patch75: perl-5.24.1-permit-goto-at-top-level-of-multicalled-sub.patch + +# Fix a heap overlow in parsing $#, RT#129274, in upstream after 5.25.9 +Patch76: perl-5.24.1-perl-129274-avoid-treating-the-in-as-a-comment-intro.patch + +# 1/2 Adapt to zlib-1.2.11, bug #1420326, CPAN RT#119762, +# in upstream Compress-Raw-Zlib-2.072 +Patch77: Compress-Raw-Zlib-2.071-Adapt-to-zlib-1.2.11.patch +# 2/2 Fix compiler fatal warnings in Compress-Raw-Zlib, CPAN RT#120272 +Patch78: Compress-Raw-Zlib-2.071-Conform-to-C90.patch + +# Fix a crash when compiling a regexp with impossible quantifiers, RT#130561, +# in upstream after 5.25.9 +Patch79: perl-5.24.1-fix-RT-130561-recursion-and-optimising-away-impossib.patch +Patch80: perl-5.25.9-only-mess-with-NEXT_OFF-when-we-are-in-PASS2.patch +Patch81: perl-5.25.9-silence-warnings-from-tests-about-impossible-quantif.patch + +# Fix a buffer overrun with format and "use bytes", RT#130703, +# in upstream after 5.25.9 +Patch82: perl-5.24.1-buffer-overrun-with-format-and-use-bytes.patch + +# Fix a buffer overflow when studying some regexps repeatedly, +# RT#129281, RT#129061, un upstream after 5.25.9 +Patch83: perl-5.24.1-perl-129281-test-for-buffer-overflow-issue.patch +Patch84: perl-5.25.9-perl-129061-CURLYX-nodes-can-be-studied-more-than-on.patch + +# Fix a heap buffer overflow when evaluating regexps with embedded code blocks +# from more than one source, RT#129881, in upstream after 5.25.9 +Patch85: perl-5.24.1-fix-pad-scope-issue-in-re_evals.patch + +# Fix a null-pointer dereference on malformed code, RT#130815, +# in upstream after 5.25.9 +Patch87: perl-5.24.1-perl-130815-fix-ck_return-null-pointer-deref-on-malf.patch + +# Fix an use-after-free in substr() that modifies a magic variable, RT#129340, +# in upstream after 5.25.9 +Patch88: perl-5.24.1-perl-129340-copy-the-source-when-inside-the-dest-in-.patch + +# Fix a memory leak leak in Perl_reg_named_buff_fetch(), RT#130822, +# in upstream after 5.25.10 +Patch89: perl-5.24.1-perl-130822-fix-an-AV-leak-in-Perl_reg_named_buff_fe.patch + +# Fix an invalid memory read when parsing a loop variable, RT#130814, +# in upstream after 5.25.10 +Patch90: perl-5.25.10-perl-130814-Add-testcase-and-new-testfile-t-comp-par.patch +# in upstream after 5.25.10 +Patch91: perl-5.24.1-perl-130814-update-pointer-into-PL_linestr-after-loo.patch +# in upstream after 5.25.2 +Patch92: perl-5.25.2-t-test.pl-Add-fresh_perl-function.patch +# in upstream after 5.25.10 +Patch93: perl-5.25.10-fix-VMS-test-fail.patch + +# Fix a heap-use-after-free in four-arguments substr call, RT#130624, +# in upstream after 5.25.10 +Patch94: perl-5.24.1-RT-130624-heap-use-after-free-in-4-arg-substr.patch + +# Make File::Glob more resistant against degenerative matching, RT#131211, +# in upstream after 5.27.0 +Patch95: perl-5.24.1-perl-131211-fixup-File-Glob-degenerate-matching.patch + +# Tests for avoid-a-memory-wrap-in-sv_vcatpvfn_flags.patch, RT#131260, +# in upstream after 5.27.0 +Patch97: perl-5.24.1-sprintf-add-memory-wrap-tests.patch + +# Fix a crash when calling a subroutine from a stash, RT#131085, +# in upstream after 5.27.0 +Patch98: perl-5.24.1-perl-131085-Crash-with-sub-in-stash.patch + +# Fix an improper cast of a negative integer to an unsigned 8-bit type, +# RT#131190, in upstream after 5.27.0 +Patch99: perl-5.27.0-Fix-131190-UTF8-code-improperly-casting-negative-int.patch + +# Fix cloning :via handles on thread creation, RT#131221, +# in upstream after 5.27.0 +Patch100: perl-5.27.0-perl-131221-improve-duplication-of-via-handles.patch +Patch101: perl-5.27.0-perl-131221-sv_dup-sv_dup_inc-are-only-available-und.patch + +# Fix glob UTF-8 flag on a glob reassignment, RT#131263, +# in upstream after 5.27.0 +Patch102: perl-5.24.1-perl-131263-clear-the-UTF8-flag-on-a-glob-if-it-isn-.patch + +# Fix a buffer overflow in my_atof2(), RT#131526, in upstream after 5.27.0 +Patch103: perl-5.27.0-perl-131526-don-t-go-beyond-the-end-of-the-NUL-in-my.patch + +# Fix handling backslashes in PATH environment variable when executing +# "perl -S", RT#129183, in upstream after 5.27.0 +Patch105: perl-5.27.0-perl-129183-don-t-treat-as-an-escape-in-PATH-for-S.patch + +# Fix a conditional jump on uninitilized memory in re_intuit_start(), +# RT#131575, in upstream after 5.27.0 +Patch106: perl-5.24.1-don-t-call-Perl_fbm_instr-with-negative-length.patch + +# Fix spurious "Assuming NOT a POSIX class" warning, RT#131522, +# in upsteam after 5.27.0 +Patch107: perl-5.27.0-Resolve-Perl-131522-Spurious-Assuming-NOT-a-POSIX-cl.patch +Patch108: perl-5.27.0-add-test-for-perl-131522-and-fix-test-for-related-pe.patch + +# Fix handling attribute specification on our variables, RT#131597, +# in upstream adter 5.27.1 +Patch109: perl-5.24.3-perl-131597-ensure-the-GV-slot-is-filled-for-our-foo.patch + +# Fix a crash when a match for inversely repeated group fails, RT#132017, +# in upstream after 5.27.3 +Patch110: perl-5.24.3-fix-132017-OPFAIL-insert-needs-to-set-flags-to-0.patch + +# Fix an overflow when parsing a character range with no preceding character, +# RT#132245, in upstream after 5.27.5 +Patch111: perl-5.24.3-perl-132245-don-t-try-to-process-a-char-range-with-n.patch + +# Fix walking symbol table for ISA in Carp, in upstream after 5.27.5 +Patch112: perl-5.24.3-Carp-Don-t-choke-on-ISA-constant.patch + +# Fix handling file names with null bytes in stat and lstat functions, +# RT#131895, in upstream after 5.27.5 +Patch113: perl-5.24.3-perl-131895-fail-stat-on-names-with-0-embedded.patch + +# Fix a crash when untying an object witout a stash, in upstream after 5.27.5 +Patch114: perl-5.27.5-Avoid-a-segfault-when-untying-an-object.patch + +# Fix deparsing of transliterations with unprintable characters, RT#132405, +# in upstream after 5.27.5 +Patch115: perl-5.24.3-Fix-deparsing-of-transliterations-with-unprintable-c.patch + +# Fix error reporting on do() on a directory, RT#125774, +# in upstream after 5.27.5 +Patch116: perl-5.26.1-fix-do-dir-returning-no.patch + +# Fix stack manipulation when a lexical subroutine is defined in a do block in +# a member of an iteration list, RT#132442, in upstream after 5.27.5 +Patch117: perl-5.24.3-perl-132442-Fix-stack-with-do-my-sub-l-1.patch + +# Fix setting $! when statting a closed filehandle, RT#108288, +# in upstream after 5.27.5 +Patch118: perl-5.24.3-set-when-statting-a-closed-filehandle.patch + +# Fix tainting of s/// with overloaded replacement, RT#115266, +# in upstream after 5.27.5 +Patch119: perl-5.24.3-fix-tainting-of-s-with-overloaded-replacement.patch + +# Expand system() arguments before a fork, RT#121105, +# in upstream after 5.27.6 +Patch120: perl-5.24.4-perform-system-arg-processing-before-fork.patch +# in upstream after 5.27.7 +Patch121: perl-5.27.7-preserve-numericness-of-system-args-on-Win32.patch +Patch122: perl-5.27.7-Reenable-numeric-first-argument-of-system-on-VMS.patch + +# Avoid undefined behavior when copying memory in Glob and pp_caller, +# RT#131746, in upstream after 5.27.3 +Patch123: perl-5.26.1-perl-131746-avoid-undefined-behaviour-in-Copy-etc.patch +Patch124: perl-5.27.3-avoid-the-address-of-.-will-always-evaluate-as-.-war.patch + +# Conditionalize a fix for an old and long fixed bug +# in libcrypt / glibc, rhbz#1536752 +Patch125: perl-5.26.1-guard_old_libcrypt_fix.patch + +# Link XS modules to pthread library to fix linking with -z defs, +# +Patch126: perl-5.27.8-hints-linux-Add-lphtread-to-lddlflags.patch + +# Fix parsing braced subscript after parentheses, RT#8045, +# in upstream after 5.27.7 +Patch127: perl-5.24.3-fix-parsing-of-braced-subscript-after-parens.patch + +# Adjust tests to gdbm-1.15, RT#133295 +Patch128: perl-5.24.4-Remove-ext-GDBM_File-t-fatal.t.patch + +# Pass the correct CFLAGS to dtrace +Patch129: perl-5.24.4-Pass-CFLAGS-to-dtrace.patch + +# Fix an integer wrap when allocating memory for an environment variable, +# RT#133204, in upstream after 5.29.0 - CVE-2018-18311 +Patch130: perl-5.24.4-Perl_my_setenv-handle-integer-wrap.patch + +# Fix heap-buffer-overflow write in S_regatom (regcomp.c) CVE-2018-18314 +Patch131: perl-5.24.4-Fix-131649-extended-charclass-can-trigger-assert.patch + +# Fix heap-buffer-overflow write in S_regatom (regcomp.c) CVE-2018-18312 +Patch132: perl-5.24.4-Fix-heap-buffer-overflow-write-reg_node-overrun.patch + +# Fix heap-buffer-overflow read in S_grok_bslash_N (regcomp.c) - CVE-2018-18313 +Patch133: perl-5.28.1-regcomp.c-Convert-some-strchr-to-memchr.patch + +# Link XS modules to libperl.so with EU::CBuilder on Linux, bug #960048 +Patch200: perl-5.16.3-Link-XS-modules-to-libperl.so-with-EU-CBuilder-on-Li.patch + +# Link XS modules to libperl.so with EU::MM on Linux, bug #960048 +Patch201: perl-5.16.3-Link-XS-modules-to-libperl.so-with-EU-MM-on-Linux.patch + +# Update some of the bundled modules +# see http://fedoraproject.org/wiki/Perl/perl.spec for instructions + +BuildRequires: bash +BuildRequires: bzip2-devel +BuildRequires: coreutils +BuildRequires: findutils +BuildRequires: gcc +%if %{with gdbm} +BuildRequires: gdbm-devel +%endif +# glibc-common for iconv +BuildRequires: glibc-common +%if %{with perl_enables_groff} +# Build-require groff tools for populating %%Config correctly, bug #135101 +BuildRequires: groff-base +%endif +BuildRequires: libdb-devel +BuildRequires: make +%if !%{defined perl_bootstrap} +BuildRequires: perl +BuildRequires: perl-generators +%endif +BuildRequires: sed +%if %{with perl_enables_systemtap} +BuildRequires: systemtap-sdt-devel +%endif +BuildRequires: tar +%if %{with perl_enables_tcsh} +BuildRequires: tcsh +%endif +BuildRequires: zlib-devel + +# For tests +%if %{with test} +BuildRequires: procps +%if %{with perl_enables_syslog_test} +BuildRequires: rsyslog +%endif +%endif + +# The long line of Perl provides. + + +# compat macro needed for rebuild +%global perl_compat perl(:MODULE_COMPAT_5.24.4) + +# File provides +Provides: perl(bytes_heavy.pl) +Provides: perl(dumpvar.pl) +Provides: perl(perl5db.pl) + +# suidperl isn't created by upstream since 5.12.0 +Obsoletes: perl-suidperl <= 4:5.12.2 + +Requires: perl-libs%{?_isa} = %{perl_epoch}:%{perl_version}-%{release} +# Require this till perl sub-package requires any modules +Requires: %perl_compat +# Require perl-interpreter to maintain compatibility (previous perl +# package provided perl-interpreter symbol), bug #1670435 +Requires: perl-interpreter%{?_isa} = %{perl_epoch}:%{perl_version}-%{release} +%if %{defined perl_bootstrap} +%gendep_perl +%endif + +# We need this to break the dependency loop, and ensure that perl-libs +# gets installed before perl. +Requires(post): perl-libs +# Same as perl-libs. We need macros in basic buildroot, where Perl is only +# because of git. +Requires(post): perl-macros + + +%description +Perl is a high-level programming language with roots in C, sed, awk and shell +scripting. Perl is good at handling processes and files, and is especially +good at handling text. Perl's hallmarks are practicality and efficiency. +While it is used to do a lot of different things, Perl's most common +applications are system administration utilities and web programming. + +Install this package if you want to program in Perl or enable your system to +handle Perl scripts with %{_bindir}/perl interpreter. + +If your script requires some Perl modules, you can install them with +"perl(MODULE)" where "MODULE" is a name of required module. E.g. install +"perl(Test::More)" to make Test::More Perl module available. + +If you need all the Perl modules that come with upstream Perl sources, so +called core modules, install perl-core package. + +If you only need perl run-time as a shared library, i.e. Perl interpreter +embedded into another application, the only essential package is perl-libs. + +Perl header files can be found in perl-devel package. + +Perl utils like "splain" or "perlbug" can be found in perl-utils package. + + +%package libs +Summary: The libraries for the perl run-time +License: (GPL+ or Artistic) and HSLR and MIT and UCD +# Compat provides +Provides: %perl_compat +Provides: perl(:MODULE_COMPAT_5.24.3) +Provides: perl(:MODULE_COMPAT_5.24.2) +Provides: perl(:MODULE_COMPAT_5.24.1) +Provides: perl(:MODULE_COMPAT_5.24.0) +# Interpreter version to fulfil required genersted from "require 5.006;" +Provides: perl(:VERSION) = %{perl_version} +# Threading provides +Provides: perl(:WITH_ITHREADS) +Provides: perl(:WITH_THREADS) +# Largefile provides +Provides: perl(:WITH_LARGEFILES) +# PerlIO provides +Provides: perl(:WITH_PERLIO) +# Loaded by charnames, unicore/Name.pm does not declare unicore::Name module +Provides: perl(unicore::Name) +# Keep utf8 modules in perl-libs because a sole regular expression like /\pN/ +# causes loading utf8 and unicore/Heave.pl and unicore/lib files. +Provides: perl(utf8_heavy.pl) +# utf8 and utf8_heavy.pl require Carp, re, strict, warnings, XSLoader +Requires: perl(Carp) +Requires: perl(Exporter) +# Term::Cap is optional +Requires: perl(XSLoader) +%if %{defined perl_bootstrap} +%gendep_perl_libs +%endif + +# Remove private redefinitions +# XSLoader redefines DynaLoader name space for compatibility, but does not +# load the DynaLoader.pm (though the DynaLoader.xs is compiled into libperl). +%global __provides_exclude %{?__provides_exclude:%__provides_exclude|}^perl\\((charnames|DynaLoader)\\)$ + +%description libs +The is a perl run-time (interpreter as a shared library and include +directories). + + +%package devel +Summary: Header #files for use in perl development +# l1_char_class_tab.h is generated from lib/unicore sources: UCD +License: (GPL+ or Artistic) and UCD +# Require $Config{libs} providers, bug #905482 +Requires: libdb-devel +%if %{with gdbm} +Requires: gdbm-devel +%endif +Requires: glibc-devel +%if %{with perl_enables_systemtap} +Requires: systemtap-sdt-devel +%endif +Requires: perl(ExtUtils::ParseXS) +Requires: %perl_compat +# Match library and header files when downgrading releases +Requires: perl-libs%{?_isa} = %{perl_epoch}:%{perl_version}-%{release} +%if %{defined perl_bootstrap} +%gendep_perl_devel +%endif + +%description devel +This package contains header files and development modules. +Most perl packages will need to install perl-devel to build. + + +%package macros +Summary: Macros for rpmbuild +License: GPL+ or Artistic +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_macros +%endif + +%description macros +Macros for rpmbuild are needed during build of srpm in koji. This +sub-package must be installed into buildroot, so it will be needed +by perl. Perl is needed because of git. + + +%package tests +Summary: The Perl test suite +License: GPL+ or Artistic +# right? +AutoReqProv: 0 +Requires: %perl_compat +# FIXME - note this will need to change when doing the core/minimal swizzle +Requires: perl-core +%if %{defined perl_bootstrap} +%gendep_perl_tests +%endif + +%description tests +This package contains the test suite included with Perl %{perl_version}. + +Install this if you want to test your Perl installation (binary and core +modules). + + +%package utils +Summary: Utilities packaged with the Perl distribution +License: GPL+ or Artistic +Epoch: 0 +Version: %{perl_version} +BuildArch: noarch +# Match library exactly for splain messages +Requires: perl-libs = %{perl_epoch}:%{perl_version}-%{release} +# Keep /usr/sbin/sendmail and Module::CoreList optional for the perlbug tool +%if %{defined perl_bootstrap} +%gendep_perl_utils +%endif +Conflicts: perl < 4:5.22.0-351 + +%description utils +Several utilities which come with Perl distribution like c2ph, h2ph, perlbug, +perlthanks, pl2pm, pstruct, and splain. Some utilities are provided by more +specific packages like perldoc by perl-Pod-Perldoc. + + +%package core +Summary: Base perl metapackage +# This rpm doesn't contain any copyrightable material. +# Nevertheless, it needs a License tag, so we'll use the generic +# "perl" license. +License: GPL+ or Artistic +Epoch: 0 +Version: %{perl_version} +Requires: %perl_compat +Requires: perl-libs%{?_isa} = %{perl_epoch}:%{perl_version}-%{release} +Requires: perl-devel%{?_isa} = %{perl_epoch}:%{perl_version}-%{release} +Requires: perl-macros +Requires: perl-utils +%if %{defined perl_bootstrap} +%gendep_perl_core +%endif + +Requires: perl-Archive-Tar, perl-Attribute-Handlers, perl-autodie, +Requires: perl-B-Debug, perl-bignum +Requires: perl-Compress-Raw-Bzip2, +Requires: perl-Carp, perl-Compress-Raw-Zlib, perl-Config-Perl-V, +Requires: perl-constant, +Requires: perl-CPAN, perl-CPAN-Meta, perl-CPAN-Meta-Requirements, +Requires: perl-CPAN-Meta-YAML +Requires: perl-Data-Dumper, perl-DB_File, +Requires: perl-Devel-Peek, perl-Devel-PPPort, perl-Devel-SelfStubber, +Requires: perl-Digest, perl-Digest-MD5, +Requires: perl-Digest-SHA, +Requires: perl-Encode, perl-Encode-devel, perl-encoding +Requires: perl-Env, perl-Errno, perl-Exporter, perl-experimental +Requires: perl-ExtUtils-CBuilder, perl-ExtUtils-Command, +Requires: perl-ExtUtils-Embed, +Requires: perl-ExtUtils-Install, perl-ExtUtils-MakeMaker +Requires: perl-ExtUtils-Manifest, perl-ExtUtils-Miniperl +Requires: perl-ExtUtils-ParseXS, perl-File-Fetch +Requires: perl-File-Path, perl-File-Temp, perl-Filter, +Requires: perl-Filter-Simple, perl-Getopt-Long +Requires: perl-HTTP-Tiny, +Requires: perl-IO, perl-IO-Compress, perl-IO-Socket-IP +Requires: perl-IO-Zlib, perl-IPC-Cmd, perl-IPC-SysV, perl-JSON-PP +Requires: perl-libnet, perl-libnetcfg, +Requires: perl-Locale-Codes, perl-Locale-Maketext, +Requires: perl-Locale-Maketext-Simple +Requires: perl-Math-BigInt, perl-Math-BigInt-FastCalc, perl-Math-BigRat, +Requires: perl-Math-Complex, perl-Memoize, +Requires: perl-MIME-Base64, +Requires: perl-Module-CoreList, +Requires: perl-Module-CoreList-tools, perl-Module-Load +Requires: perl-Module-Load-Conditional, perl-Module-Loaded, +Requires: perl-Module-Metadata, perl-Net-Ping, +Requires: perl-open, perl-PathTools +Requires: perl-Params-Check +# TODO: Merge perl-Parse-CPAN-Meta sub-package into perl-CPAN-Meta after +# upgrading standalone perl-CPAN-Meta to 2.150010, bug #1370681 +Requires: perl(Parse::CPAN::Meta) +Requires: perl-perlfaq, +Requires: perl-PerlIO-via-QuotedPrint, perl-Perl-OSType +Requires: perl-Pod-Checker, perl-Pod-Escapes, perl-Pod-Html, +Requires: perl-Pod-Parser, perl-Pod-Perldoc, perl-Pod-Usage +Requires: perl-podlators, perl-Pod-Simple, perl-Scalar-List-Utils +Requires: perl-SelfLoader, perl-Socket, perl-Storable, perl-Sys-Syslog, +Requires: perl-Term-ANSIColor, perl-Term-Cap, +Requires: perl-Test, perl-Test-Harness, perl-Test-Simple +Requires: perl-Text-Balanced, perl-Text-ParseWords, perl-Text-Tabs+Wrap, +Requires: perl-Thread-Queue +Requires: perl-Time-HiRes +Requires: perl-Time-Local, perl-Time-Piece +Requires: perl-Unicode-Collate, perl-Unicode-Normalize, +Requires: perl-version, perl-threads, perl-threads-shared, perl-parent + +%description core +A metapackage which requires all of the perl bits and modules in the upstream +tarball from perl.org. + +%package interpreter +Summary: Standalone executable Perl interpreter +# This package doesn't contain any copyrightable material. +# Nevertheless, it needs a License tag, so we'll use the generic +# "perl" license. +License: GPL+ or Artistic +# perl-interpreter denotes a package with the perl executable. +# Full EVR is for compatibility with systems that swapped perl and perl-core +# , +# bug #1464903. +# This dummy package exists to mask same-named non-modular package. Otherwise +# package manager can see non-modular package that coincidently obsoletes +# perl package and that confuses the manager, bug #1670435. +Version: %{perl_version} +Epoch: %{perl_epoch} +Requires: perl%{?_isa} = %{perl_epoch}:%{perl_version}-%{release} + +%description interpreter +This is a dummy package to improve a compatibility with future Perls that will use +this package to deliver %{_bindir}/perl Perl interpreter. + +%if %{dual_life} || %{rebuild_from_scratch} +%package Archive-Tar +Summary: A module for Perl manipulation of .tar files +License: GPL+ or Artistic +Epoch: 0 +Version: 2.04 +BuildArch: noarch +Requires: %perl_compat +Requires: perl(IO::Zlib) >= 1.01 +# Optional run-time: +Requires: perl(IO::Compress::Bzip2) >= 2.015 +# IO::String not used if perl supports useperlio which is true +# Use Compress::Zlib's version for IO::Uncompress::Bunzip2 +Requires: perl(IO::Uncompress::Bunzip2) >= 2.015 +%if !%{defined perl_bootstrap} +Requires: perl(Text::Diff) +%endif +%if %{defined perl_bootstrap} +%gendep_perl_Archive_Tar +%endif + +%description Archive-Tar +Archive::Tar provides an object oriented mechanism for handling tar files. It +provides class methods for quick and easy files handling while also allowing +for the creation of tar file objects for custom manipulation. If you have the +IO::Zlib module installed, Archive::Tar will also support compressed or +gzipped tar files. +%endif + +%package Attribute-Handlers +Summary: Simpler definition of attribute handlers +License: GPL+ or Artistic +Epoch: 0 +Version: 0.99 +BuildArch: noarch +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Attribute_Handlers +%endif +Conflicts: perl < 4:5.22.0-351 + +%description Attribute-Handlers +This Perl module, when inherited by a package, allows that package's class to +define attribute handler subroutines for specific attributes. Variables and +subroutines subsequently defined in that package, or in packages derived from +that package may be given attributes with the same names as the attribute +handler subroutines, which will then be called in one of the compilation +phases (i.e. in a "BEGIN", "CHECK", "INIT", or "END" block). + +%if %{dual_life} || %{rebuild_from_scratch} +%package autodie +Summary: Replace functions with ones that succeed or die +License: GPL+ or Artistic +Epoch: 0 +Version: 2.29 +Requires: %perl_compat +BuildArch: noarch +Requires: perl(B) +Requires: perl(Fcntl) +Requires: perl(overload) +Requires: perl(POSIX) +%if %{defined perl_bootstrap} +%gendep_perl_autodie +%endif +Conflicts: perl < 4:5.16.2-259 + +%description autodie +The "autodie" and "Fatal" pragma provides a convenient way to replace +functions that normally return false on failure with equivalents that throw an +exception on failure. + +However "Fatal" has been obsoleted by the new autodie pragma. Please use +autodie in preference to "Fatal". +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package B-Debug +Summary: Walk Perl syntax tree, print debug information about op-codes +License: GPL+ or Artistic +Epoch: 0 +Version: 1.23 +Requires: %perl_compat +BuildArch: noarch +%if %{defined perl_bootstrap} +%gendep_perl_B_Debug +%endif +Conflicts: perl < 4:5.20.1-310 + +%description B-Debug +Walk Perl syntax tree and print debug information about op-codes. See +B::Concise and B::Terse for other details. + +%package bignum +Summary: Transparent big number support for Perl +License: GPL+ or Artistic +Epoch: 0 +Version: 0.42 +Requires: %perl_compat +Requires: perl(Carp) +# Math::BigInt::Lite is optional +Requires: perl(Math::BigRat) +Requires: perl(warnings) +BuildArch: noarch +%if %{defined perl_bootstrap} +%gendep_perl_bignum +%endif +Conflicts: perl < 4:5.22.0-348 + +%description bignum +This package attempts to make it easier to write scripts that use BigInts and +BigFloats in a transparent way. + +%package Carp +Summary: Alternative warn and die for modules +Epoch: 0 +# Real version 1.40 +Version: 1.40 +License: GPL+ or Artistic +Requires: %perl_compat +Provides: perl(Carp::Heavy) = %{version} +%if %{defined perl_bootstrap} +%gendep_perl_Carp +%endif +BuildArch: noarch + +# Do not export unversioned module +%global __provides_exclude %{?__provides_exclude:%__provides_exclude|}^perl\\(Carp\\)\\s*$ + +%description Carp +The Carp routines are useful in your own modules because they act like +die() or warn(), but with a message which is more likely to be useful to a +user of your module. In the case of cluck, confess, and longmess that +context is a summary of every call in the call-stack. For a shorter message +you can use carp or croak which report the error as being from where your +module was called. There is no guarantee that that is where the error was, +but it is a good educated guess. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Compress-Raw-Bzip2 +Summary: Low-Level Interface to bzip2 compression library +License: GPL+ or Artistic +Epoch: 0 +Version: 2.069 +Requires: perl(Exporter), perl(File::Temp) +%if %{defined perl_bootstrap} +%gendep_perl_Compress_Raw_Bzip2 +%endif + +%description Compress-Raw-Bzip2 +This module provides a Perl interface to the bzip2 compression library. +It is used by IO::Compress::Bzip2. + +%package Compress-Raw-Zlib +Summary: Low-Level Interface to the zlib compression library +License: (GPL+ or Artistic) and zlib +Epoch: 0 +Version: 2.069 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Compress_Raw_Zlib +%endif + +%description Compress-Raw-Zlib +This module provides a Perl interface to the zlib compression library. +It is used by IO::Compress::Zlib. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Config-Perl-V +Summary: Structured data retrieval of perl -V output +License: GPL+ or Artistic +Epoch: 0 +Version: 0.25 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Config_Perl_V +%endif +BuildArch: noarch +Conflicts: perl < 4:5.22.0-347 + +%description Config-Perl-V +The command "perl -V" will return you an excerpt from the %%Config::Config +hash combined with the output of "perl -V" that is not stored inside the hash, +but only available to the perl binary itself. This package provides Perl +module that will return you the output of "perl -V" in a structure. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package constant +Summary: Perl pragma to declare constants +License: GPL+ or Artistic +Epoch: 0 +Version: 1.33 +Requires: %perl_compat +Requires: perl(Carp) +%if %{defined perl_bootstrap} +%gendep_perl_constant +%endif +BuildArch: noarch +Conflicts: perl < 4:5.16.3-264 + +%description constant +This pragma allows you to declare constants at compile-time: + +use constant PI => 4 * atan2(1, 1); + +When you declare a constant such as "PI" using the method shown above, +each machine your script runs upon can have as many digits of accuracy +as it can use. Also, your program will be easier to read, more likely +to be maintained (and maintained correctly), and far less likely to +send a space probe to the wrong planet because nobody noticed the one +equation in which you wrote 3.14195. + +When a constant is used in an expression, Perl replaces it with its +value at compile time, and may then optimize the expression further. +In particular, any code in an "if (CONSTANT)" block will be optimized +away if the constant is false. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package CPAN +Summary: Query, download and build perl modules from CPAN sites +License: GPL+ or Artistic +Epoch: 0 +Version: 2.11 +Requires: make +# Prefer Archive::Tar and Compress::Zlib over tar and gzip +Requires: perl(Archive::Tar) >= 1.50 +Requires: perl(base) +Requires: perl(Data::Dumper) +%if !%{defined perl_bootstrap} +Requires: perl(Devel::Size) +%endif +Requires: perl(ExtUtils::Manifest) +%if !%{defined perl_bootstrap} +Requires: perl(File::HomeDir) >= 0.65 +%endif +Requires: perl(File::Temp) >= 0.16 +Requires: perl(lib) +Requires: perl(Net::Config) +Requires: perl(Net::FTP) +Requires: perl(POSIX) +Requires: perl(Term::ReadLine) +%if !%{defined perl_bootstrap} +Requires: perl(URI) +Requires: perl(URI::Escape) +%endif +Requires: perl(User::pwent) +# Optional but higly recommended: +%if !%{defined perl_bootstrap} +Requires: perl(Archive::Zip) +Requires: perl(Compress::Bzip2) +Requires: perl(CPAN::Meta) >= 2.110350 +%endif +Requires: perl(Compress::Zlib) +Requires: perl(Digest::MD5) +# CPAN encourages Digest::SHA strongly because of integrity checks +Requires: perl(Digest::SHA) +Requires: perl(Dumpvalue) +Requires: perl(ExtUtils::CBuilder) +%if ! %{defined perl_bootstrap} +# Avoid circular deps local::lib -> Module::Install -> CPAN when bootstraping +# local::lib recommended by CPAN::FirstTime default choice, bug #1122498 +Requires: perl(local::lib) +%endif +Requires: perl(Module::Build) +%if ! %{defined perl_bootstrap} +Requires: perl(Text::Glob) +%endif +Requires: %perl_compat +Provides: cpan = %{version} +%if %{defined perl_bootstrap} +%gendep_perl_CPAN +%endif +BuildArch: noarch + +%description CPAN +The CPAN module automates or at least simplifies the make and install of +perl modules and extensions. It includes some primitive searching +capabilities and knows how to use LWP, HTTP::Tiny, Net::FTP and certain +external download clients to fetch distributions from the net. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package CPAN-Meta +Summary: Distribution metadata for a CPAN dist +Epoch: 0 +Version: 2.150005 +License: GPL+ or Artistic +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_CPAN_Meta +%endif +BuildArch: noarch + +%description CPAN-Meta +Software distributions released to the CPAN include a META.json or, for +older distributions, META.yml, which describes the distribution, its +contents, and the requirements for building and installing the +distribution. The data structure stored in the META.json file is described +in CPAN::Meta::Spec. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package CPAN-Meta-Requirements +Summary: Set of version requirements for a CPAN dist +Epoch: 0 +# Real version 2.132000 +Version: 2.132 +License: GPL+ or Artistic +Requires: %perl_compat +BuildArch: noarch +# CPAN-Meta-Requirements used to have six decimal places +%global __provides_exclude %{?__provides_exclude:%__provides_exclude|}^perl\\(CPAN::Meta::Requirements\\) +Provides: perl(CPAN::Meta::Requirements) = %{version}000 +%if %{defined perl_bootstrap} +%gendep_perl_CPAN_Meta_Requirements +%endif + +%description CPAN-Meta-Requirements +A CPAN::Meta::Requirements object models a set of version constraints like +those specified in the META.yml or META.json files in CPAN distributions. +It can be built up by adding more and more constraints, and it will reduce +them to the simplest representation. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package CPAN-Meta-YAML +Version: 0.018 +Epoch: 0 +Summary: Read and write a subset of YAML for CPAN Meta files +License: GPL+ or Artistic +BuildArch: noarch +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_CPAN_Meta_YAML +%endif + +%description CPAN-Meta-YAML +This module implements a subset of the YAML specification for use in reading +and writing CPAN metadata files like META.yml and MYMETA.yml. It should not be +used for any other general YAML parsing or generation task. +%endif + + +%if %{dual_life} || %{rebuild_from_scratch} +%package Data-Dumper +Summary: Stringify perl data structures, suitable for printing and eval +License: GPL+ or Artistic +Epoch: 0 +Version: 2.160 +Requires: %perl_compat +Requires: perl(Scalar::Util) +Requires: perl(XSLoader) +%if %{defined perl_bootstrap} +%gendep_perl_Data_Dumper +%endif + +%description Data-Dumper +Given a list of scalars or reference variables, writes out their contents +in perl syntax. The references can also be objects. The content of each +variable is output in a single Perl statement. Handles self-referential +structures correctly. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package DB_File +Summary: Perl5 access to Berkeley DB version 1.x +License: GPL+ or Artistic +Epoch: 0 +Version: 1.835 +Requires: %perl_compat +Requires: perl(Fcntl) +Requires: perl(XSLoader) +%if %{defined perl_bootstrap} +%gendep_perl_DB_File +%endif +Conflicts: perl < 4:5.16.3-264 + +%description DB_File +DB_File is a module which allows Perl programs to make use of the facilities +provided by Berkeley DB version 1.x (if you have a newer version of DB, you +will be limited to functionality provided by interface of version 1.x). The +interface defined here mirrors the Berkeley DB interface closely. +%endif + +%package Devel-Peek +Summary: A data debugging tool for the XS programmer +License: GPL+ or Artistic +Epoch: 0 +Version: 1.23 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Devel_Peek +%endif +Conflicts: perl < 4:5.22.0-351 + +%description Devel-Peek +Devel::Peek contains functions which allows raw Perl datatypes to be +manipulated from a Perl script. This is used by those who do XS programming to +check that the data they are sending from C to Perl looks as they think it +should look. + +%if %{dual_life} || %{rebuild_from_scratch} +%package Devel-PPPort +Summary: Perl Pollution Portability header generator +License: GPL+ or Artistic +Epoch: 0 +Version: 3.32 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Devel_PPPort +%endif +Conflicts: perl < 4:5.20.1-310 + +%description Devel-PPPort +Perl's API has changed over time, gaining new features, new functions, +increasing its flexibility, and reducing the impact on the C name space +environment (reduced pollution). The header file written by this module, +typically ppport.h, attempts to bring some of the newer Perl API features +to older versions of Perl, so that you can worry less about keeping track +of old releases, but users can still reap the benefit. +%endif + +%package Devel-SelfStubber +Summary: Generate stubs for a SelfLoading module +License: GPL+ or Artistic +Epoch: 0 +Version: 1.05 +BuildArch: noarch +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Devel_SelfStubber +%endif +Conflicts: perl < 4:5.22.0-351 + +%description Devel-SelfStubber +Devel::SelfStubber prints the stubs you need to put in the module before the +__DATA__ token (or you can get it to print the entire module with stubs +correctly placed). The stubs ensure that if a method is called, it will get +loaded. They are needed specifically for inherited autoloaded methods. + +%if %{dual_life} || %{rebuild_from_scratch} +%package Digest +Summary: Modules that calculate message digests +License: GPL+ or Artistic +# Epoch bump for clean upgrade over old standalone package +Epoch: 0 +Version: 1.17 +BuildArch: noarch +Requires: %perl_compat +Requires: perl(MIME::Base64) +%if %{defined perl_bootstrap} +%gendep_perl_Digest +%endif + +%description Digest +The Digest:: modules calculate digests, also called "fingerprints" or +"hashes", of some data, called a message. The digest is (usually) +some small/fixed size string. The actual size of the digest depend of +the algorithm used. The message is simply a sequence of arbitrary +bytes or bits. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Digest-MD5 +Summary: Perl interface to the MD5 Algorithm +License: (GPL+ or Artistic) and BSD +# Epoch bump for clean upgrade over old standalone package +Epoch: 0 +Version: 2.54 +Requires: %perl_compat +Requires: perl(XSLoader) +# Recommended +Requires: perl(Digest::base) >= 1.00 +%if %{defined perl_bootstrap} +%gendep_perl_Digest_MD5 +%endif + +%description Digest-MD5 +The Digest::MD5 module allows you to use the RSA Data Security Inc. MD5 +Message Digest algorithm from within Perl programs. The algorithm takes as +input a message of arbitrary length and produces as output a 128-bit +"fingerprint" or "message digest" of the input. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Digest-SHA +Summary: Perl extension for SHA-1/224/256/384/512 +License: GPL+ or Artistic +# Epoch bump for clean upgrade over old standalone package +Epoch: 1 +Version: 5.95 +Requires: %perl_compat +Requires: perl(Carp) +# Recommended +Requires: perl(Digest::base) +%if %{defined perl_bootstrap} +%gendep_perl_Digest_SHA +%endif + +%description Digest-SHA +Digest::SHA is a complete implementation of the NIST Secure Hash +Standard. It gives Perl programmers a convenient way to calculate +SHA-1, SHA-224, SHA-256, SHA-384, and SHA-512 message digests. The +module can handle all types of input, including partial-byte data. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Encode +Summary: Character encodings in Perl +License: (GPL+ or Artistic) and Artistic 2.0 and UCD +Epoch: 4 +Version: 2.80 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Encode +%endif +Conflicts: perl < 4:5.16.2-256 + +%description Encode +The Encode module provides the interface between Perl strings and the rest +of the system. Perl strings are sequences of characters. + +%package encoding +Summary: Write your Perl script in non-ASCII or non-UTF-8 +License: GPL+ or Artistic +Epoch: 4 +Version: 2.17 +# Keeping this sub-package arch-specific because it installs files into +# arch-specific directories. +Requires: %perl_compat +Requires: perl(Carp) +# Config not needed on perl ≥ 5.008 +# Consider Filter::Util::Call as mandatory, bug #1165183, CPAN RT#100427 +Requires: perl(Filter::Util::Call) +# I18N::Langinfo is optional +# PerlIO::encoding is optional +Requires: perl(utf8) +%if %{defined perl_bootstrap} +%gendep_perl_encoding +%endif +Conflicts: perl-Encode < 2:2.60-314 + +%description encoding +With the encoding pragma, you can write your Perl script in any encoding you +like (so long as the Encode module supports it) and still enjoy Unicode +support. + +However, this encoding module is deprecated under perl 5.18. It uses +a mechanism provided by perl that is deprecated under 5.18 and higher, and may +be removed in a future version. + +The easiest and the best alternative is to write your script in UTF-8. + +%package Encode-devel +Summary: Character encodings in Perl +License: (GPL+ or Artistic) and UCD +Epoch: 4 +Version: 2.80 +Requires: %perl_compat +Requires: %{name}-Encode = %{epoch}:%{version}-%{release} +Recommends: perl-devel +%if %{defined perl_bootstrap} +%gendep_perl_Encode_devel +%endif +BuildArch: noarch + +%description Encode-devel +enc2xs builds a Perl extension for use by Encode from either Unicode Character +Mapping files (.ucm) or Tcl Encoding Files (.enc). You can use enc2xs to add +your own encoding to perl. No knowledge of XS is necessary. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Env +Summary: Perl module that imports environment variables as scalars or arrays +License: GPL+ or Artistic +Epoch: 0 +Version: 1.04 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Env +%endif +BuildArch: noarch +Conflicts: perl < 4:5.16.2-265 + +%description Env +Perl maintains environment variables in a special hash named %%ENV. For when +this access method is inconvenient, the Perl module Env allows environment +variables to be treated as scalar or array variables. +%endif + +%package Errno +Summary: System errno constants +License: GPL+ or Artistic +Epoch: 0 +Version: 1.25 +Requires: %perl_compat +# Errno.pm bakes in kernel version at build time and compares it against +# $Config{osvers} at run time. Match exact interpreter build. Bug #1393421. +Requires: perl-libs%{?_isa} = %{perl_epoch}:%{perl_version}-%{release} +Requires: perl(Carp) +%if %{defined perl_bootstrap} +%gendep_perl_Errno +%endif +Conflicts: perl < 4:5.22.0-351 + +%description Errno +"Errno" defines and conditionally exports all the error constants defined in +your system "errno.h" include file. It has a single export tag, ":POSIX", +which will export all POSIX defined error numbers. + +%if %{dual_life} || %{rebuild_from_scratch} +%package experimental +Summary: Experimental features made easy +License: GPL+ or Artistic +Epoch: 0 +Version: 0.016 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_experimental +%endif +BuildArch: noarch +Conflicts: perl < 4:5.20.0-303 + +%description experimental +This pragma provides an easy and convenient way to enable or disable +experimental features. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Exporter +Summary: Implements default import method for modules +License: GPL+ or Artistic +Epoch: 0 +Version: 5.72 +Requires: %perl_compat +Requires: perl(Carp) >= 1.05 +%if %{defined perl_bootstrap} +%gendep_perl_Exporter +%endif +BuildArch: noarch +Conflicts: perl < 4:5.16.2-265 + +%description Exporter +The Exporter module implements an import method which allows a module to +export functions and variables to its users' name spaces. Many modules use +Exporter rather than implementing their own import method because Exporter +provides a highly flexible interface, with an implementation optimized for +the common case. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package ExtUtils-CBuilder +Summary: Compile and link C code for Perl modules +License: GPL+ or Artistic +# Epoch bump for clean upgrade over old standalone package +Epoch: 1 +Version: 0.280225 +BuildArch: noarch +Requires: perl-devel +Requires: %perl_compat +Requires: perl(DynaLoader) +Requires: perl(ExtUtils::Mksymlists) +Requires: perl(File::Spec) >= 3.13 +Requires: perl(Perl::OSType) >= 1 +%if %{defined perl_bootstrap} +%gendep_perl_ExtUtils_CBuilder +%endif + +%description ExtUtils-CBuilder +This module can build the C portions of Perl modules by invoking the +appropriate compilers and linkers in a cross-platform manner. It was motivated +by the Module::Build project, but may be useful for other purposes as well. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package ExtUtils-Command +Summary: Perl routines to replace common UNIX commands in Makefiles +License: GPL+ or Artistic +Epoch: 0 +Version: 7.10 +BuildArch: noarch +Requires: %perl_compat +Conflicts: perl < 4:5.20.1-312 +Requires: perl(File::Find) +%if %{defined perl_bootstrap} +%gendep_perl_ExtUtils_Command +%endif + +%description ExtUtils-Command +This Perl module is used to replace common UNIX commands. In all cases the +functions work with @ARGV rather than taking arguments. This makes them +easier to deal with in Makefiles. +%endif + +%package ExtUtils-Embed +Summary: Utilities for embedding Perl in C/C++ applications +License: GPL+ or Artistic +Epoch: 0 +Version: 1.33 +Requires: perl-devel +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_ExtUtils_Embed +%endif +BuildArch: noarch + +%description ExtUtils-Embed +Utilities for embedding Perl in C/C++ applications. + + +%if %{dual_life} || %{rebuild_from_scratch} +%package ExtUtils-Install +Summary: Install files from here to there +License: GPL+ or Artistic +Epoch: 0 +Version: 2.04 +BuildArch: noarch +Requires: %perl_compat +Requires: perl(Data::Dumper) +%if %{defined perl_bootstrap} +%gendep_perl_ExtUtils_Install +%endif + +%description ExtUtils-Install +Handles the installing and uninstalling of perl modules, scripts, man +pages, etc. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package ExtUtils-MakeMaker +Summary: Create a module Makefile +License: GPL+ or Artistic +Epoch: 0 +Version: 7.10 +# If an XS module is built, code generated from XS will be compiled and it +# includes Perl header files. +# TODO: This dependency will be weaken in order to relieve building noarch +# packages from perl-devel and gcc. +Requires: perl-devel +Requires: %perl_compat +Requires: perl(Data::Dumper) +Requires: perl(DynaLoader) +Requires: perl(ExtUtils::Command) +Requires: perl(ExtUtils::Install) +Requires: perl(ExtUtils::Manifest) +Requires: perl(File::Find) +Requires: perl(Getopt::Long) +# Optional Pod::Man is needed for generating manual pages from POD +Requires: perl(Pod::Man) +Requires: perl(POSIX) +Requires: perl(Test::Harness) +Requires: perl(version) +# If an XS module is compiled, xsubpp(1) is needed +Requires: perl-ExtUtils-ParseXS +%if %{defined perl_bootstrap} +%gendep_perl_ExtUtils_MakeMaker +%endif +BuildArch: noarch + +# Filter false DynaLoader provides. Versioned perl(DynaLoader) keeps +# unfiltered on perl package, no need to reinject it. +%global __provides_exclude %{?__provides_exclude:%__provides_exclude|}^perl\\(DynaLoader\\)\\s*$ +%global __provides_exclude %__provides_exclude|^perl\\(ExtUtils::MakeMaker::_version\\) + +%description ExtUtils-MakeMaker +Create a module Makefile. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package ExtUtils-Manifest +Summary: Utilities to write and check a MANIFEST file +License: GPL+ or Artistic +Epoch: 0 +Version: 1.70 +Requires: %perl_compat +Requires: perl(File::Path) +%if %{defined perl_bootstrap} +%gendep_perl_ExtUtils_Manifest +%endif +BuildArch: noarch + +%description ExtUtils-Manifest +%{summary}. +%endif + +%package ExtUtils-Miniperl +Summary: Write the C code for perlmain.c +License: GPL+ or Artistic +Epoch: 0 +Version: 1.05 +Requires: perl-devel +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_ExtUtils_Miniperl +%endif +BuildArch: noarch + +%description ExtUtils-Miniperl +writemain() takes an argument list of directories containing archive libraries +that relate to perl modules and should be linked into a new perl binary. It +writes a corresponding perlmain.c file that is a plain C file containing all +the bootstrap code to make the If the first argument to writemain() is a +reference to a scalar it is used as the filename to open for ouput. Any other +reference is used as the filehandle to write to. Otherwise output defaults to +STDOUT. + +%if %{dual_life} || %{rebuild_from_scratch} +%package -n perl-ExtUtils-MM-Utils +Summary: ExtUtils::MM methods without dependency on ExtUtils::MakeMaker +License: GPL+ or Artistic +Epoch: 0 +Version: 7.11 +BuildArch: noarch +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_ExtUtils_MM_Utils +%endif + +%description -n perl-ExtUtils-MM-Utils +This is a collection of ExtUtils::MM subroutines that are used by many +other modules but that do not need full-featured ExtUtils::MakeMaker. The +issue with ExtUtils::MakeMaker is it pulls in Perl header files and that +is an overkill for small subroutines. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package ExtUtils-ParseXS +Summary: Module and a script for converting Perl XS code into C code +License: GPL+ or Artistic +# Epoch bump for clean upgrade over old standalone package +Epoch: 1 +Version: 3.31 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_ExtUtils_ParseXS +%endif +BuildArch: noarch + +%description ExtUtils-ParseXS +ExtUtils::ParseXS will compile XS code into C code by embedding the constructs +necessary to let C functions manipulate Perl values and creates the glue +necessary to let Perl access those functions. +%endif + + +%if %{dual_life} || %{rebuild_from_scratch} +%package File-Fetch +Summary: Generic file fetching mechanism +License: GPL+ or Artistic +Epoch: 0 +Version: 0.48 +Requires: perl(IPC::Cmd) >= 0.36 +Requires: perl(Module::Load::Conditional) >= 0.04 +Requires: perl(Params::Check) >= 0.07 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_File_Fetch +%endif +BuildArch: noarch + +%description File-Fetch +File::Fetch is a generic file fetching mechanism. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package File-Path +Summary: Create or remove directory trees +License: GPL+ or Artistic +Epoch: 0 +Version: 2.12 +Requires: %perl_compat +Requires: perl(Carp) +%if %{defined perl_bootstrap} +%gendep_perl_File_Path +%endif +BuildArch: noarch +Conflicts: perl < 4:5.16.2-265 + +%description File-Path +This module provides a convenient way to create directories of arbitrary +depth and to delete an entire directory subtree from the file system. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package File-Temp +Summary: Return name and handle of a temporary file safely +License: GPL+ or Artistic +Epoch: 0 +# Normalized version +Version: 0.230.400 +Requires: %perl_compat +BuildArch: noarch +Requires: perl(File::Path) >= 2.06 +Requires: perl(POSIX) +%if %{defined perl_bootstrap} +%gendep_perl_File_Temp +%endif +Conflicts: perl < 4:5.16.2-265 + +%description File-Temp +File::Temp can be used to create and open temporary files in a safe way. +There is both a function interface and an object-oriented interface. The +File::Temp constructor or the tempfile() function can be used to return the +name and the open file handle of a temporary file. The tempdir() function +can be used to create a temporary directory. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +# FIXME Filter-Simple? version? +%package Filter +Summary: Perl source filters +License: GPL+ or Artistic +Epoch: 2 +Version: 1.55 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Filter +%endif + +%description Filter +Source filters alter the program text of a module before Perl sees it, much as +a C preprocessor alters the source text of a C program before the compiler +sees it. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Filter-Simple +Summary: Simplified Perl source filtering +License: GPL+ or Artistic +Epoch: 0 +Version: 0.92 +BuildArch: noarch +Requires: %perl_compat +Conflicts: perl < 4:5.20.1-312 +Requires: perl(Text::Balanced) >= 1.97 +Requires: perl(warnings) +%if %{defined perl_bootstrap} +%gendep_perl_Filter_Simple +%endif + +%description Filter-Simple +The Filter::Simple Perl module provides a simplified interface to +Filter::Util::Call; one that is sufficient for most common cases. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Getopt-Long +Summary: Extended processing of command line options +License: GPLv2+ or Artistic +Epoch: 0 +Version: 2.48 +Requires: %perl_compat +Requires: perl(overload) +Requires: perl(Text::ParseWords) +# Recommended: +Requires: perl(Pod::Usage) >= 1.14 +%if %{defined perl_bootstrap} +%gendep_perl_Getopt_Long +%endif +BuildArch: noarch +Conflicts: perl < 4:5.16.3-268 + +%description Getopt-Long +The Getopt::Long module implements an extended getopt function called +GetOptions(). It parses the command line from @ARGV, recognizing and removing +specified options and their possible values. It adheres to the POSIX syntax +for command line options, with GNU extensions. In general, this means that +options have long names instead of single letters, and are introduced with +a double dash "--". Support for bundling of command line options, as was the +case with the more traditional single-letter approach, is provided but not +enabled by default. +%endif + +%package IO +Summary: Perl input/output modules +License: GPL+ or Artistic +Epoch: 0 +Version: 1.36 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_IO +%endif +Conflicts: perl < 4:5.22.0-351 + +%description IO +This is a collection of Perl input/output modules. + +%if %{dual_life} || %{rebuild_from_scratch} +%package IO-Compress +Summary: IO::Compress wrapper for modules +License: GPL+ or Artistic +Epoch: 0 +Version: 2.069 +Requires: %perl_compat +Obsoletes: perl-Compress-Zlib <= 2.020 +Provides: perl(IO::Uncompress::Bunzip2) +%if %{defined perl_bootstrap} +%gendep_perl_IO_Compress +%endif +BuildArch: noarch + +%description IO-Compress +This module is the base class for all IO::Compress and IO::Uncompress modules. +This module is not intended for direct use in application code. Its sole +purpose is to to be sub-classed by IO::Compress modules. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package IO-Socket-IP +Summary: Drop-in replacement for IO::Socket::INET supporting both IPv4 and IPv6 +License: GPL+ or Artistic +Epoch: 0 +Version: 0.37 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_IO_Socket_IP +%endif +BuildArch: noarch +Conflicts: perl < 4:5.20.0-303 + +%description IO-Socket-IP +This module provides a protocol-independent way to use IPv4 and IPv6 +sockets, as a drop-in replacement for IO::Socket::INET. Most constructor +arguments and methods are provided in a backward-compatible way. +%endif + +%package IO-Zlib +Summary: Perl IO:: style interface to Compress::Zlib +License: GPL+ or Artistic +# Epoch bump for clean upgrade over old standalone package +Epoch: 1 +Version: 1.10 +Requires: perl(Compress::Zlib) +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_IO_Zlib +%endif +BuildArch: noarch + +%description IO-Zlib +This modules provides an IO:: style interface to the Compress::Zlib package. +The main advantage is that you can use an IO::Zlib object in much the same way +as an IO::File object so you can have common code that doesn't know which sort +of file it is using. + + +%if %{dual_life} || %{rebuild_from_scratch} +%package IPC-Cmd +Summary: Finding and running system commands made easy +License: GPL+ or Artistic +# Epoch bump for clean upgrade over old standalone package +Epoch: 1 +Version: 0.92 +Requires: perl(ExtUtils::MM::Utils) +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_IPC_Cmd +%endif +BuildArch: noarch + +%description IPC-Cmd +IPC::Cmd allows you to run commands, interactively if desired, in a platform +independent way, but have them still work. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package IPC-SysV +Summary: Object interface to System V IPC +License: GPL+ or Artistic +Epoch: 0 +Version: 2.06 +Requires: %perl_compat +Requires: perl(DynaLoader) +%if %{defined perl_bootstrap} +%gendep_perl_IPC_SysV +%endif +Conflicts: perl < 4:5.22.0-351 + +%description IPC-SysV +This is an object interface for System V messages, semaphores, and +inter-process calls. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package HTTP-Tiny +Summary: A small, simple, correct HTTP/1.1 client +License: GPL+ or Artistic +Epoch: 0 +Version: 0.056 +Requires: perl(bytes) +Requires: perl(Carp) +Requires: perl(IO::Socket) +Requires: perl(Time::Local) +%if %{defined perl_bootstrap} +%gendep_perl_HTTP_Tiny +%endif +BuildArch: noarch + +%description HTTP-Tiny +This is a very simple HTTP/1.1 client, designed primarily for doing simple GET +requests without the overhead of a large framework like LWP::UserAgent. +It is more correct and more complete than HTTP::Lite. It supports proxies +(currently only non-authenticating ones) and redirection. It also correctly +resumes after EINTR. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package JSON-PP +Summary: JSON::XS compatible pure-Perl module +Epoch: 0 +Version: 2.27300 +License: GPL+ or Artistic +BuildArch: noarch +Requires: %perl_compat +Requires: perl(Data::Dumper) +Requires: perl(Encode) +Requires: perl(Math::BigFloat) +Requires: perl(Math::BigInt) +Requires: perl(Scalar::Util) +Requires: perl(subs) +%if %{defined perl_bootstrap} +%gendep_perl_JSON_PP +%endif +Conflicts: perl-JSON < 2.50 + +%description JSON-PP +JSON::XS is the fastest and most proper JSON module on CPAN. It is written by +Marc Lehmann in C, so must be compiled and installed in the used environment. +JSON::PP is a pure-Perl module and is compatible with JSON::XS. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package libnet +Summary: Perl clients for various network protocols +License: GPL+ or Artistic +Epoch: 0 +Version: 3.08 +Requires: %perl_compat +Requires: perl(File::Basename) +Requires: perl(IO::Socket) >= 1.05 +# Prefer IO::Socket::IP over IO::Socket::INET6 and IO::Socket::INET +Requires: perl(IO::Socket::IP) >= 0.20 +Requires: perl(POSIX) +Requires: perl(Socket) >= 2.016 +Requires: perl(utf8) +%if %{defined perl_bootstrap} +%gendep_perl_libnet +%endif +BuildArch: noarch +Conflicts: perl < 4:5.22.0-347 + +%description libnet +This is a collection of Perl modules which provides a simple and +consistent programming interface (API) to the client side of various +protocols used in the internet community. +%endif + +%package libnetcfg +Summary: Configure libnet +License: GPL+ or Artistic +Epoch: %perl_epoch +Version: %perl_version +# Net::Config is optional +BuildArch: noarch +%if %{defined perl_bootstrap} +%gendep_perl_libnetcfg +%endif +Conflicts: perl-devel < 4:5.22.0-347 + +%description libnetcfg +The libnetcfg utility can be used to configure the libnet. + +%if %{dual_life} || %{rebuild_from_scratch} +%package Locale-Codes +Summary: Distribution of modules to handle locale codes +Epoch: 0 +Version: 3.25 +License: GPL+ or Artistic +Requires: %perl_compat +Requires: perl(constant) +Provides: perl(Locale::Codes) = %{version} +%if %{defined perl_bootstrap} +%gendep_perl_Locale_Codes +%endif +BuildArch: noarch + +# Do not export unversioned module +%global __provides_exclude %{?__provides_exclude:%__provides_exclude|}^perl\\(Locale::Codes\\)\\s*$ + +# Filter dependencies on private modules. Generator: +# for F in $(find lib -type f); do perl -e '$/ = undef; $_ = <>; if (/^package #\R([\w:]*);/m) { print qq{|^perl\\\\($1\\\\)} }' "$F"; done +%global __requires_exclude %{?__requires_exclude:%__requires_exclude|}^perl\\(Locale::Codes::Country_Retired\\)|^perl\\(Locale::Codes::LangFam_Retired\\)|^perl\\(Locale::Codes::Script_Retired\\)|^perl\\(Locale::Codes::LangExt_Codes\\)|^perl\\(Locale::Codes::LangFam_Codes\\)|^perl\\(Locale::Codes::Script_Codes\\)|^perl\\(Locale::Codes::Language_Codes\\)|^perl\\(Locale::Codes::LangExt_Retired\\)|^perl\\(Locale::Codes::Currency_Codes\\)|^perl\\(Locale::Codes::LangVar_Retired\\)|^perl\\(Locale::Codes::Language_Retired\\)|^perl\\(Locale::Codes::Country_Codes\\)|^perl\\(Locale::Codes::LangVar_Codes\\)|^perl\\(Locale::Codes::Currency_Retired\\) + +%description Locale-Codes +Locale-Codes is a distribution containing a set of modules. The modules +each deal with different types of codes which identify parts of the locale +including languages, countries, currency, etc. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Locale-Maketext +Summary: Framework for localization +License: GPL+ or Artistic +Epoch: 0 +Version: 1.26 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Locale_Maketext +%endif +BuildArch: noarch +Conflicts: perl < 4:5.16.3-268 + +%description Locale-Maketext +It is a common feature of applications (whether run directly, or via the Web) +for them to be "localized" -- i.e., for them to present an English interface +to an English-speaker, a German interface to a German-speaker, and so on for +all languages it's programmed with. Locale::Maketext is a framework for +software localization; it provides you with the tools for organizing and +accessing the bits of text and text-processing code that you need for +producing localized applications. +%endif + +%package Locale-Maketext-Simple +Summary: Simple interface to Locale::Maketext::Lexicon +License: MIT +# Epoch bump for clean upgrade over old standalone package +Epoch: 1 +Version: 0.21 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Locale_Maketext_Simple +%endif +BuildArch: noarch + +%description Locale-Maketext-Simple +This module is a simple wrapper around Locale::Maketext::Lexicon, designed +to alleviate the need of creating Language Classes for module authors. + +%if %{dual_life} || %{rebuild_from_scratch} +%package Math-BigInt +Summary: Arbitrary-size integer and float mathematics +License: GPL+ or Artistic +Epoch: 0 +# Real version 1.999715 +Version: 1.9997.15 +Requires: %perl_compat +Requires: perl(Carp) +# File::Spec not used on recent perl +%if %{defined perl_bootstrap} +%gendep_perl_Math_BigInt +%endif +BuildArch: noarch +Conflicts: perl < 4:5.22.0-347 + +# Do not export unversioned module +%global __provides_exclude %{?__provides_exclude:%__provides_exclude|}^perl\\(Math::BigInt\\)\\s*$ + +%description Math-BigInt +This provides Perl modules for arbitrary-size integer and float mathematics. + +%package Math-BigInt-FastCalc +Summary: Math::BigInt::Calc XS implementation +License: GPL+ or Artistic +Epoch: 0 +# Version normalized to dot format +Version: 0.400 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Math_BigInt_FastCalc +%endif +Conflicts: perl < 4:5.22.0-348 + +%description Math-BigInt-FastCalc +This package provides support for faster big integer calculations. + +%package Math-BigRat +Summary: Arbitrary big rational numbers +License: GPL+ or Artistic +Epoch: 0 +# Real version 0.2608.02 +Version: 0.2608.02 +Requires: %perl_compat +Requires: perl(Math::BigInt) +%if %{defined perl_bootstrap} +%gendep_perl_Math_BigRat +%endif +BuildArch: noarch +Conflicts: perl < 4:5.22.0-348 + +%description Math-BigRat +Math::BigRat complements Math::BigInt and Math::BigFloat by providing support +for arbitrary big rational numbers. +%endif + +%package Math-Complex +Summary: Complex numbers and trigonometric functions +License: GPL+ or Artistic +Epoch: 0 +Version: 1.59 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Math_Complex +%endif +BuildArch: noarch +Conflicts: perl < 4:5.22.0-348 + +%description Math-Complex +This package lets you create and manipulate complex numbers. By default, Perl +limits itself to real numbers, but an extra "use" statement brings full +complex support, along with a full set of mathematical functions typically +associated with and/or extended to complex numbers. + +%package Memoize +Summary: Transparently speed up functions by caching return values +License: GPL+ or Artistic +Epoch: 0 +Version: 1.03 +Requires: %perl_compat +# Keep Time::HiRes optional +%if %{defined perl_bootstrap} +%gendep_perl_Memoize +%endif +BuildArch: noarch +Conflicts: perl < 4:5.22.0-350 + +%description Memoize +Memoizing a function makes it faster by trading space for time. It does +this by caching the return values of the function in a table. If you call +the function again with the same arguments, memoize jumps in and gives +you the value out of the table, instead of letting the function compute +the value all over again. + +%if %{dual_life} || %{rebuild_from_scratch} +%package MIME-Base64 +Summary: Encoding and decoding of Base64 and quoted-printable strings +# cpan/MIME-Base64/Base64.xs: (GPL+ or Artistic) and MIT (Bellcore's part) +# Other files: GPL+ or Artistic +License: (GPL+ or Artistic) and MIT +Epoch: 0 +Version: 3.15 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_MIME_Base64 +%endif +Conflicts: perl < 4:5.22.0-347 + +%description MIME-Base64 +This package contains a Base64 encoder/decoder and a quoted-printable +encoder/decoder. These encoding methods are specified in RFC 2045 - MIME +(Multipurpose Internet Mail Extensions). +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Module-CoreList +Summary: What modules are shipped with versions of perl +License: GPL+ or Artistic +Epoch: 1 +Version: 5.20180414 +Requires: %perl_compat +Requires: perl(List::Util) +Requires: perl(version) >= 0.88 +%if %{defined perl_bootstrap} +%gendep_perl_Module_CoreList +%endif +BuildArch: noarch + +%description Module-CoreList +Module::CoreList provides information on which core and dual-life modules +are shipped with each version of perl. + + +%package Module-CoreList-tools +Summary: Tool for listing modules shipped with perl +License: GPL+ or Artistic +Epoch: 1 +Version: 5.20180414 +Requires: %perl_compat +Requires: perl(feature) +Requires: perl(version) >= 0.88 +Requires: perl-Module-CoreList = %{epoch}:%{version}-%{release} +%if %{defined perl_bootstrap} +%gendep_perl_Module_CoreList_tools +%endif +# The files were distributed with perl.spec's subpackage +# perl-Module-CoreList <= 1:5.020001-309 +Conflicts: perl-Module-CoreList < 1:5.020001-310 +BuildArch: noarch + +%description Module-CoreList-tools +This package provides a corelist(1) tool which can be used to query what +modules were shipped with given perl version. +%endif + + +%if %{dual_life} || %{rebuild_from_scratch} +%package Module-Load +Summary: Runtime require of both modules and files +License: GPL+ or Artistic +# Epoch bump for clean upgrade over old standalone package +Epoch: 1 +Version: 0.32 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Module_Load +%endif +BuildArch: noarch + +%description Module-Load +Module::Load eliminates the need to know whether you are trying to require +either a file or a module. +%endif + + +%if %{dual_life} || %{rebuild_from_scratch} +%package Module-Load-Conditional +Summary: Looking up module information / loading at runtime +License: GPL+ or Artistic +Epoch: 0 +Version: 0.64 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Module_Load_Conditional +%endif +BuildArch: noarch + +%description Module-Load-Conditional +Module::Load::Conditional provides simple ways to query and possibly load any +of the modules you have installed on your system during runtime. +%endif + + +%package Module-Loaded +Summary: Mark modules as loaded or unloaded +License: GPL+ or Artistic +# Epoch bump for clean upgrade over old standalone package +Epoch: 1 +Version: 0.08 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Module_Loaded +%endif +BuildArch: noarch + +%description Module-Loaded +When testing applications, often you find yourself needing to provide +functionality in your test environment that would usually be provided by +external modules. Rather than munging the %%INC by hand to mark these external +modules as loaded, so they are not attempted to be loaded by perl, this module +offers you a very simple way to mark modules as loaded and/or unloaded. + + +%if %{dual_life} || %{rebuild_from_scratch} +%package Module-Metadata +Summary: Gather package and POD information from perl module files +Epoch: 0 +Version: 1.000031 +License: GPL+ or Artistic +BuildArch: noarch +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Module_Metadata +%endif + +%description Module-Metadata +Gather package and POD information from perl module files +%endif + +%package Net-Ping +Summary: Check a remote host for reachability +License: GPL+ or Artistic +Epoch: 0 +Version: 2.43 +Requires: %perl_compat +# Keep Net::Ping::External optional +%if %{defined perl_bootstrap} +%gendep_perl_Net_Ping +%endif +BuildArch: noarch +Conflicts: perl < 4:5.22.0-350 + +%description Net-Ping +Net::Ping module contains methods to test the reachability of remote hosts on +a network. + +%package open +Summary: Perl pragma to set default PerlIO layers for input and output +License: GPL+ or Artistic +Epoch: 0 +Version: 1.10 +Requires: %perl_compat +Requires: perl(Carp) +Requires: perl(Encode) +Requires: perl(encoding) +%if %{defined perl_bootstrap} +%gendep_perl_open +%endif +Conflicts: perl < 4:5.20.2-326 +BuildArch: noarch + +%description open +The "open" pragma serves as one of the interfaces to declare default "layers" +(also known as "disciplines") for all I/O. + +%if %{dual_life} || %{rebuild_from_scratch} +%package parent +Summary: Establish an ISA relationship with base classes at compile time +License: GPL+ or Artistic +# Epoch bump for clean upgrade over old standalone package +Epoch: 1 +Version: 0.234 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_parent +%endif +BuildArch: noarch + +%description parent +parent allows you to both load one or more modules, while setting up +inheritance from those modules at the same time. Mostly similar in effect to: + + package Baz; + + BEGIN { + require Foo; + require Bar; + + push @ISA, qw(Foo Bar); + } +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Params-Check +Summary: Generic input parsing/checking mechanism +License: GPL+ or Artistic +# Epoch bump for clean upgrade over old standalone package +Epoch: 1 +Version: 0.38 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Params_Check +%endif +BuildArch: noarch + +%description Params-Check +Params::Check is a generic input parsing/checking mechanism. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Parse-CPAN-Meta +Summary: Parse META.yml and other similar CPAN metadata files +License: GPL+ or Artistic +# Epoch bump for clean upgrade over old standalone package +Epoch: 1 +Version: 1.4417 +Requires: %perl_compat +BuildArch: noarch +Requires: perl(CPAN::Meta::YAML) >= 0.002 +Requires: perl(JSON::PP) >= 2.27103 +%if %{defined perl_bootstrap} +%gendep_perl_Parse_CPAN_Meta +%endif +# FIXME it could be removed now? +Obsoletes: perl-Parse-CPAN-Meta < 1.40 + +%description Parse-CPAN-Meta +Parse::CPAN::Meta is a parser for META.yml files, based on the parser half of +YAML::Tiny. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package PathTools +Summary: PathTools Perl module (Cwd, File::Spec) +License: (GPL+ or Artistic) and BSD +Epoch: 0 +Version: 3.63 +Requires: %perl_compat +Requires: perl(Carp) +%if %{defined perl_bootstrap} +%gendep_perl_PathTools +%endif + +%description PathTools +PathTools Perl module (Cwd, File::Spec). +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package perlfaq +Summary: Frequently asked questions about Perl +# Code examples are Public Domain +License: (GPL+ or Artistic) and Public Domain +Epoch: 0 +Version: 5.021010 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_perlfaq +%endif +BuildArch: noarch +Conflicts: perl < 4:5.22.0-347 + +%description perlfaq +The perlfaq comprises several documents that answer the most commonly asked +questions about Perl and Perl programming. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package PerlIO-via-QuotedPrint +Summary: PerlIO layer for quoted-printable strings +License: GPL+ or Artistic +Epoch: 0 +Version: 0.08 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_PerlIO_via_QuotedPrint +%endif +BuildArch: noarch +Conflicts: perl < 4:5.22.0-347 + +%description PerlIO-via-QuotedPrint +This module implements a PerlIO layer that works on files encoded in the +quoted-printable format. It will decode from quoted-printable while +reading from a handle, and it will encode as quoted-printable while +writing to a handle. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Perl-OSType +Summary: Map Perl operating system names to generic types +Version: 1.009 +Epoch: 0 +License: GPL+ or Artistic +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Perl_OSType +%endif +BuildArch: noarch + +%description Perl-OSType +Modules that provide OS-specific behaviors often need to know if the current +operating system matches a more generic type of operating systems. For example, +'linux' is a type of 'Unix' operating system and so is 'freebsd'. +This module provides a mapping between an operating system name as given by $^O +and a more generic type. The initial version is based on the OS type mappings +provided in Module::Build and ExtUtils::CBuilder (thus, Microsoft operating +systems are given the type 'Windows' rather than 'Win32'). +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Pod-Checker +Summary: Check POD documents for syntax errors +Epoch: 4 +Version: 1.60 +License: GPL+ or Artistic +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Pod_Checker +%endif +BuildArch: noarch + +%description Pod-Checker +Module and tools to verify POD documentation contents for compliance with the +Plain Old Documentation format specifications. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Pod-Escapes +Summary: Resolve POD escape sequences +License: GPL+ or Artistic +# Epoch bump for clean upgrade over old standalone package +Epoch: 1 +Version: 1.07 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Pod_Escapes +%endif +BuildArch: noarch + +%description Pod-Escapes +This module provides things that are useful in decoding Pod E<...> sequences. +%endif + +%package Pod-Html +Summary: Convert POD files to HTML +License: GPL+ or Artistic +Epoch: 0 +# Real version 1.2201 +Version: 1.22.01 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Pod_Html +%endif +BuildArch: noarch +Conflicts: perl < 4:5.22.0-350 + +%description Pod-Html +This package converts files from POD format (see perlpod) to HTML format. It +can automatically generate indexes and cross-references, and it keeps a cache +of things it knows how to cross-reference. + +%if %{dual_life} || %{rebuild_from_scratch} +%package Pod-Parser +Summary: Basic perl modules for handling Plain Old Documentation (POD) +License: GPL+ or Artistic +Epoch: 0 +Version: 1.63 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Pod_Parser +%endif +BuildArch: noarch + +%description Pod-Parser +This software distribution contains the packages for using Perl5 POD (Plain +Old Documentation). See the "perlpod" and "perlsyn" manual pages from your +Perl5 distribution for more information about POD. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Pod-Perldoc +Summary: Look up Perl documentation in Pod format +License: GPL+ or Artistic +Epoch: 0 +Version: 3.25 +%if %{with perl_enables_groff} +# Pod::Perldoc::ToMan executes roff +Requires: groff-base +%endif +Requires: %perl_compat +Requires: perl(File::Temp) >= 0.22 +Requires: perl(HTTP::Tiny) +Requires: perl(IO::Handle) +Requires: perl(IPC::Open3) +# POD2::Base is optional +# Pod::Checker is not needed if Pod::Simple::Checker is available +Requires: perl(Pod::Simple::Checker) +Requires: perl(Pod::Simple::RTF) >= 3.16 +Requires: perl(Pod::Simple::XMLOutStream) >= 3.16 +Requires: perl(Text::ParseWords) +# Tk is optional +Requires: perl(Symbol) +%if %{defined perl_bootstrap} +%gendep_perl_Pod_Perldoc +%endif +BuildArch: noarch + +%description Pod-Perldoc +perldoc looks up a piece of documentation in .pod format that is embedded +in the perl installation tree or in a perl script, and displays it via +"groff -man | $PAGER". This is primarily used for the documentation for +the perl library modules. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Pod-Simple +Summary: Framework for parsing POD documentation +License: GPL+ or Artistic +# Epoch bump for clean upgrade over old standalone package +Epoch: 1 +Version: 3.32 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Pod_Simple +%endif +BuildArch: noarch + +%description Pod-Simple +Pod::Simple is a Perl library for parsing text in the Pod ("plain old +documentation") markup language that is typically used for writing +documentation for Perl and for Perl modules. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Pod-Usage +Summary: Print a usage message from embedded pod documentation +License: GPL+ or Artistic +Epoch: 4 +Version: 1.68 +Requires: %perl_compat +# Pod::Usage executes perldoc from perl-Pod-Perldoc by default +Requires: perl-Pod-Perldoc +Requires: perl(Pod::Text) +%if %{defined perl_bootstrap} +%gendep_perl_Pod_Usage +%endif +BuildArch: noarch + +%description Pod-Usage +pod2usage will print a usage message for the invoking script (using its +embedded POD documentation) and then exit the script with the desired exit +status. The usage message printed may have any one of three levels of +"verboseness": If the verbose level is 0, then only a synopsis is printed. +If the verbose level is 1, then the synopsis is printed along with a +description (if present) of the command line options and arguments. If the +verbose level is 2, then the entire manual page is printed. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package podlators +Summary: Format POD source into various output formats +License: (GPL+ or Artistic) and MIT +Epoch: 0 +Version: 4.07 +BuildArch: noarch +Requires: %perl_compat +Requires: perl(File::Spec) >= 0.8 +Requires: perl(Pod::Simple) >= 3.06 +%if %{defined perl_bootstrap} +%gendep_perl_podlators +%endif +Conflicts: perl < 4:5.16.1-234 + +%description podlators +This package contains Pod::Man and Pod::Text modules which convert POD input +to *roff source output, suitable for man pages, or plain text. It also +includes several sub-classes of Pod::Text for formatted output to terminals +with various capabilities. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Scalar-List-Utils +Summary: A selection of general-utility scalar and list subroutines +License: GPL+ or Artistic +Epoch: 3 +# Real version 1.42_02 +Version: 1.42 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Scalar_List_Utils +%endif + +%description Scalar-List-Utils +Scalar::Util and List::Util contain a selection of subroutines that people have +expressed would be nice to have in the perl core, but the usage would not +really be high enough to warrant the use of a keyword, and the size so small +such that being individual extensions would be wasteful. +%endif + +%package SelfLoader +Summary: Load functions only on demand +License: GPL+ or Artistic +Epoch: 0 +Version: 1.23 +BuildArch: noarch +Requires: %perl_compat +Requires: perl(Carp) +%if %{defined perl_bootstrap} +%gendep_perl_SelfLoader +%endif +Conflicts: perl < 4:5.22.0-351 + +%description SelfLoader +This Perl module tells its users that functions in a package are to be +autoloaded from after the "__DATA__" token. See also "Autoloading" in +perlsub. + +%if %{dual_life} || %{rebuild_from_scratch} +%package Socket +Summary: C socket.h defines and structure manipulators +License: GPL+ or Artistic +Epoch: 4 +Version: 2.020 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Socket +%endif + +%description Socket +This module is just a translation of the C socket.h file. Unlike the old +mechanism of requiring a translated socket.ph file, this uses the h2xs program +(see the Perl source distribution) and your native C compiler. This means +that it has a far more likely chance of getting the numbers right. This +includes all of the commonly used pound-defines like AF_INET, SOCK_STREAM, etc. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Storable +Summary: Persistence for Perl data structures +License: GPL+ or Artistic +Epoch: 1 +Version: 2.56 +Requires: %perl_compat +# Carp substitutes missing Log::Agent +Requires: perl(Carp) +Requires: perl(Config) +# Fcntl is optional, but locking is good +Requires: perl(Fcntl) +Requires: perl(IO::File) +%if %{defined perl_bootstrap} +%gendep_perl_Storable +%endif +Conflicts: perl < 4:5.16.3-274 + +%description Storable +The Storable package brings persistence to your Perl data structures +containing scalar, array, hash or reference objects, i.e. anything that +can be conveniently stored to disk and retrieved at a later time. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Sys-Syslog +Summary: Perl interface to the UNIX syslog(3) calls +License: GPL+ or Artistic +Epoch: 0 +Version: 0.33 +Requires: %perl_compat +Requires: perl(XSLoader) +%if %{defined perl_bootstrap} +%gendep_perl_Sys_Syslog +%endif +Conflicts: perl < 4:5.16.3-269 + +%description Sys-Syslog +Sys::Syslog is an interface to the UNIX syslog(3) function. Call syslog() with +a string priority and a list of printf() arguments just like at syslog(3). +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Term-ANSIColor +Summary: Color screen output using ANSI escape sequences +License: GPL+ or Artistic +Epoch: 0 +Version: 4.04 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Term_ANSIColor +%endif +BuildArch: noarch +Conflicts: perl < 4:5.18.2-302 + +%description Term-ANSIColor +This module has two interfaces, one through color() and colored() and the +other through constants. It also offers the utility functions uncolor(), +colorstrip(), colorvalid(), and coloralias(), which have to be explicitly +imported to be used. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Term-Cap +Summary: Perl termcap interface +License: GPL+ or Artistic +Epoch: 0 +Version: 1.17 +Requires: %perl_compat +# ncurses for infocmp tool +Requires: ncurses +Requires: perl(Carp) +%if %{defined perl_bootstrap} +%gendep_perl_Term_Cap +%endif +BuildArch: noarch +Conflicts: perl < 4:5.22.0-347 + +%description Term-Cap +These are low-level functions to extract and use capabilities from a terminal +capability (termcap) database. +%endif + +%package Test +Summary: Simple framework for writing test scripts +License: GPL+ or Artistic +Epoch: 0 +Version: 1.28 +Requires: %perl_compat +# Algorithm::Diff 1.15 is optional +Requires: perl(File::Temp) +%if %{defined perl_bootstrap} +%gendep_perl_Test +%endif +BuildArch: noarch +Conflicts: perl < 4:5.22.0-351 + +%description Test +The Test Perl module simplifies the task of writing test files for Perl modules, +such that their output is in the format that Test::Harness expects to see. + +%if %{dual_life} || %{rebuild_from_scratch} +%package Test-Harness +Summary: Run Perl standard test scripts with statistics +License: GPL+ or Artistic +Epoch: 0 +Version: 3.36 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Test_Harness +%endif +BuildArch: noarch + +%description Test-Harness +Run Perl standard test scripts with statistics. +Use TAP::Parser, Test::Harness package was whole rewritten. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Test-Simple +Summary: Basic utilities for writing tests +License: (GPL+ or Artistic) and CC0 and Public Domain +Epoch: 0 +Version: 1.001014 +Requires: %perl_compat +Requires: perl(Data::Dumper) +%if %{defined perl_bootstrap} +%gendep_perl_Test_Simple +%endif +BuildArch: noarch + +%description Test-Simple +Basic utilities for writing tests. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Text-Balanced +Summary: Extract delimited text sequences from strings +License: GPL+ or Artistic +Epoch: 0 +Version: 2.03 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Text_Balanced +%endif +BuildArch: noarch +Conflicts: perl < 4:5.22.0-347 + +%description Text-Balanced +These Perl subroutines may be used to extract a delimited substring, possibly +after skipping a specified prefix string. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Text-ParseWords +Summary: Parse text into an array of tokens or array of arrays +License: GPL+ or Artistic +Epoch: 0 +Version: 3.30 +Requires: %perl_compat +Requires: perl(Carp) +%if %{defined perl_bootstrap} +%gendep_perl_Text_ParseWords +%endif +BuildArch: noarch +Conflicts: perl < 4:5.16.2-256 + +%description Text-ParseWords +Parse text into an array of tokens or array of arrays. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Text-Tabs+Wrap +Summary: Expand tabs and do simple line wrapping +License: TTWL +Epoch: 0 +Version: 2013.0523 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Text_Tabs_Wrap +%endif +BuildArch: noarch +Conflicts: perl < 4:5.20.2-325 + +%description Text-Tabs+Wrap +Text::Tabs performs the same job that the UNIX expand(1) and unexpand(1) +commands do: adding or removing tabs from a document. + +Text::Wrap::wrap() will reformat lines into paragraphs. All it does is break +up long lines, it will not join short lines together. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Thread-Queue +Summary: Thread-safe queues +License: GPL+ or Artistic +Epoch: 0 +Version: 3.09 +Requires: %perl_compat +Requires: perl(Carp) +%if %{defined perl_bootstrap} +%gendep_perl_Thread_Queue +%endif +BuildArch: noarch +Conflicts: perl < 4:5.16.2-257 + +%description Thread-Queue +This module provides thread-safe FIFO queues that can be accessed safely by +any number of threads. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Time-HiRes +Summary: High resolution alarm, sleep, gettimeofday, interval timers +License: GPL+ or Artistic +Epoch: 0 +Version: 1.9741 +Requires: %perl_compat +Requires: perl(Carp) +%if %{defined perl_bootstrap} +%gendep_perl_Time_HiRes +%endif +Conflicts: perl < 4:5.16.3-271 + +%description Time-HiRes +The Time::HiRes module implements a Perl interface to the usleep, nanosleep, +ualarm, gettimeofday, and setitimer/getitimer system calls, in other words, +high resolution time and timers. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Time-Local +Summary: Efficiently compute time from local and GMT time +License: GPL+ or Artistic +Epoch: 0 +Version: 1.2300 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Time_Local +%endif +BuildArch: noarch +Conflicts: perl < 4:5.16.3-262 + +%description Time-Local +This module provides functions that are the inverse of built-in perl functions +localtime() and gmtime(). They accept a date as a six-element array, and +return the corresponding time(2) value in seconds since the system epoch +(Midnight, January 1, 1970 GMT on Unix, for example). This value can be +positive or negative, though POSIX only requires support for positive values, +so dates before the system's epoch may not work on all operating systems. +%endif + +%package Time-Piece +Summary: Time objects from localtime and gmtime +License: (GPL+ or Artistic) and BSD +Epoch: 0 +Version: 1.31 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_Time_Piece +%endif + +%description Time-Piece +The Time::Piece module replaces the standard localtime and gmtime functions +with implementations that return objects. It does so in a backwards compatible +manner, so that using localtime or gmtime as documented in perlfunc still +behave as expected. + +%if %{dual_life} || %{rebuild_from_scratch} +%package threads +Summary: Perl interpreter-based threads +License: GPL+ or Artistic +Epoch: 1 +Version: 2.07 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_threads +%endif + +%description threads +Since Perl 5.8, thread programming has been available using a model called +interpreter threads which provides a new Perl interpreter for each thread, +and, by default, results in no data or state information being shared between +threads. + +(Prior to Perl 5.8, 5005threads was available through the Thread.pm API. This +threading model has been deprecated, and was removed as of Perl 5.10.0.) + +As just mentioned, all variables are, by default, thread local. To use shared +variables, you need to also load threads::shared. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package threads-shared +Summary: Perl extension for sharing data structures between threads +License: GPL+ or Artistic +Epoch: 0 +Version: 1.51 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_threads_shared +%endif + +%description threads-shared +By default, variables are private to each thread, and each newly created thread +gets a private copy of each existing variable. This module allows you to share +variables across different threads (and pseudo-forks on Win32). It is used +together with the threads module. This module supports the sharing of the +following data types only: scalars and scalar refs, arrays and array refs, and +hashes and hash refs. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Unicode-Collate +Summary: Unicode Collation Algorithm +License: (GPL+ or Artistic) and Unicode +Epoch: 0 +Version: 1.14 +Requires: %perl_compat +Requires: perl(Unicode::Normalize) +%if %{defined perl_bootstrap} +%gendep_perl_Unicode_Collate +%endif +Conflicts: perl < 4:5.22.0-347 + +%description Unicode-Collate +This package is Perl implementation of Unicode Technical Standard #10 (Unicode +Collation Algorithm). +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package Unicode-Normalize +Summary: Unicode Normalization Forms +License: GPL+ or Artistic +Epoch: 0 +Version: 1.25 +Requires: %perl_compat +# unicore/CombiningClass.pl and unicore/Decomposition.pl from perl, perl is +# auto-detected. +%if %{defined perl_bootstrap} +%gendep_perl_Unicode_Normalize +%endif +Conflicts: perl < 4:5.22.0-347 + +%description Unicode-Normalize +This package provides Perl functions that can convert strings into various +Unicode normalization forms as defined in Unicode Standard Annex #15. +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%package version +Summary: Perl extension for Version Objects +License: GPL+ or Artistic +# Epoch bump for clean upgrade over old standalone package +Epoch: 5 +# real version 0.9916 +Version: 0.99.16 +Requires: %perl_compat +%if %{defined perl_bootstrap} +%gendep_perl_version +%endif +BuildArch: noarch + +%description version +Perl extension for Version Objects +%endif + +%prep +%setup -q -n perl-%{perl_version} +%patch1 -p1 +%ifarch %{multilib_64_archs} +%patch3 -p1 +%endif +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch15 -p1 +%patch16 -p1 +%patch22 -p1 +%patch26 -p1 +%patch28 -p1 +%patch30 -p1 +%patch34 -p1 +%patch36 -p1 +%patch37 -p1 +%patch40 -p1 +%patch41 -p1 +%patch48 -p1 +%patch49 -p1 +%patch50 -p1 +%patch51 -p1 +%patch52 -p1 +%patch53 -p1 +%patch54 -p1 +%patch55 -p1 +%patch56 -p1 +%patch57 -p1 +%patch58 -p1 +%patch59 -p1 +%patch60 -p1 +%patch61 -p1 +%patch62 -p1 +%patch63 -p1 +%patch64 -p1 +%patch65 -p1 +%patch66 -p1 +%patch67 -p1 +%patch68 -p1 +%patch69 -p1 +%patch70 -p1 +%patch71 -p1 +%patch72 -p1 +%patch73 -p1 +%patch74 -p1 +%patch75 -p1 +%patch76 -p1 +pushd cpan/Compress-Raw-Zlib +%patch77 -p1 +%patch78 -p1 +popd +%patch79 -p1 +%patch80 -p1 +%patch81 -p1 +%patch82 -p1 +%patch83 -p1 +%patch84 -p1 +%patch85 -p1 +%patch87 -p1 +%patch88 -p1 +%patch89 -p1 +%patch90 -p1 +%patch91 -p1 +%patch92 -p1 +%patch93 -p1 +%patch94 -p1 +%patch95 -p1 +%patch97 -p1 +%patch98 -p1 +%patch99 -p1 +%patch100 -p1 +%patch101 -p1 +%patch102 -p1 +%patch103 -p1 +%patch105 -p1 +%patch106 -p1 +%patch107 -p1 +%patch108 -p1 +%patch109 -p1 +%patch110 -p1 +%patch111 -p1 +%patch112 -p1 +%patch113 -p1 +%patch114 -p1 +%patch115 -p1 +%patch116 -p1 +%patch117 -p1 +%patch118 -p1 +%patch119 -p1 +%patch120 -p1 +%patch121 -p1 +%patch122 -p1 +%patch123 -p1 +%patch124 -p1 +%patch125 -p1 +%patch126 -p1 +%patch127 -p1 +%patch128 -p1 +%patch129 -p1 +%patch130 -p1 +%patch131 -p1 +%patch132 -p1 +%patch133 -p1 +%patch200 -p1 +%patch201 -p1 + +%if !%{defined perl_bootstrap} +# Local patch tracking +perl -x patchlevel.h \ + 'Fedora Patch1: Removes date check, Fedora/RHEL specific' \ +%ifarch %{multilib_64_archs} \ + 'Fedora Patch3: support for libdir64' \ +%endif \ + 'Fedora Patch4: use libresolv instead of libbind' \ + 'Fedora Patch5: USE_MM_LD_RUN_PATH' \ + 'Fedora Patch6: Provide MM::maybe_command independently (bug #1129443)' \ + 'Fedora Patch7: Dont run one io test due to random builder failures' \ + 'Fedora Patch15: Define SONAME for libperl.so' \ + 'Fedora Patch16: Install libperl.so to -Dshrpdir value' \ + 'Fedora Patch22: Document Math::BigInt::CalcEmu requires Math::BigInt (CPAN RT#85015)' \ + 'Fedora Patch26: Make *DBM_File desctructors thread-safe (RT#61912)' \ + 'Fedora Patch27: Make PadlistNAMES() lvalue again (CPAN RT#101063)' \ + 'Fedora Patch28: Make magic vtable writable as a work-around for Coro (CPAN RT#101063)' \ + 'Fedora Patch30: Replace EU::MakeMaker dependency with EU::MM::Utils in IPC::Cmd (bug #1129443)' \ + 'Fedora Patch34: Do not use unitialized memory in $h{\const} warnings (RT#128189)' \ + 'Fedora Patch36: Do not treat %: as a stash (RT#128238)' \ + 'Fedora Patch37: Do not crash when inserting a non-stash into a stash (RT#128238)' \ + 'Fedora Patch40: Fix a crash when vivifying a stub in a deleted package (RT#128532)' \ + 'Fedora Patch41: Fix a crash in "Subroutine redefined" warning (RT#128257)' \ + 'Fedora Petch48: Fix crash in splice (RT#129164, RT#129166, RT#129167)' \ + 'Fedora Patch49: Fix string overrun in Perl_gv_fetchmethod_pvn_flags (RT#129267)' \ + 'Fedora Patch50: Fix string overrun in Perl_gv_fetchmethod_pvn_flags (RT#129267)' \ + 'Fedora Patch51: Fix string overrun in Perl_gv_fetchmethod_pvn_flags (RT#129267)' \ + 'Fedora Patch52: Fix string overrun in Perl_gv_fetchmethod_pvn_flags (RT#129267)' \ + 'Fedora Patch53: Fix string overrun in Perl_gv_fetchmethod_pvn_flags (RT#129267)' \ + 'Fedora Patch54: Fix crash when matching UTF-8 string with non-UTF-8 substrings (RT#129350)' \ + 'Fedora Patch55: Fix parsing perl options in shell bang line (RT#129336)' \ + 'Fedora Patch56: Fix firstchar bitmap under UTF-8 with prefix optimization (RT#129950)' \ + 'Fedora Patch57: Avoid infinite loop in h2xs tool if enum and type have the same name (RT130001)' \ + 'Fedora Patch58: Fix stack handling when calling chdir without an argument (RT#129130)' \ + 'Fedora Patch59: Fix crash in Storable when deserializing malformed code reference (RT#68348, RT#130098)' \ + 'Fedora Patch60: Fix crash on explicit return from regular expression substitution (RT#130188)' \ + 'Fedora Patch61: Fix assigning split() return values to an array' \ + 'Fedora Patch62: Fix const correctness in hv_func.h (RT#130169)' \ + 'Fedora Patch63: Fix a crash in optimized evaluation of "or ((0) x 0))" (RT#130247)' \ + 'Fedora Patch64: Fix a memory leak in IO::Poll (RT#129788)' \ + 'Fedora Patch65: Fix regular expression matching (RT#130307)' \ + 'Fedora Patch66: Fix a buffer overflow in split in scalar context (RT#130262)' \ + 'Fedora Patch67: Fix a heap overflow with pack "W" (RT129149)' \ + 'Fedora Patch69: Fix a use-after-free when processing scalar variables in forms (RT#129125)' \ + 'Fedora Patch70: Fix a heap overflow if invalid octal or hexadecimal number is used in transliteration expression (RT#129342)' \ + 'Fedora Patch71: Fix out-of-bound read in case of unmatched regexp backreference (RT#129377)' \ + 'Fedora Patch72: Fix UTF-8 string handling in & operator (RT#129287)' \ + 'Fedora Patch73: Fix recreation of *:: (RT#129869)' \ + 'Fedora Patch74: Fix a memory leak in B::RHE->HASH method (RT#130504)' \ + 'Fedora Patch75: Fix parsing goto statements in multicalled subroutine (RT#113938)' \ + 'Fedora Patch76: Fix a heap overlow in parsing $# (RT#129274)' \ + 'Fedora Patch77: Adapt to zlib-1.2.11 (CPAN RT#119762)' \ + 'Fedora Patch78: Fix compiler fatal warnings in Compress-Raw-Zlib (CPAN RT#120272)' \ + 'Fedora Patch79: Fix a crash when compiling a regexp with impossible quantifiers (RT#130561)' \ + 'Fedora Patch82: Fix a buffer overrun with format and "use bytes" (RT#130703)' \ + 'Fedora Patch83: Fix a buffer overflow when studying some regexps repeatedly (RT#129281, RT#129061)' \ + 'Fedora Patch85: Fix a heap buffer overflow when evaluating regexps with embedded code blocks from more than one source, RT#129881' \ + 'Fedora Patch87: Fix a null-pointer dereference on malformed code (RT#130815)' \ + 'Fedora Patch88: Fix an use-after-free in substr() that modifies a magic variable (RT#129340)' \ + 'Fedora Patch89: Fix a memory leak leak in Perl_reg_named_buff_fetch() (RT#130822)' \ + 'Fedora Patch90: Fix an invalid memory read when parsing a loop variable (RT#130814)' \ + 'Fedora Patch94: Fix a heap-use-after-free in four-arguments substr call (RT#130624)' \ + 'Fedora Patch95: Make File::Glob more resistant against degenerative matching (RT#131211)' \ + 'Fedora Patch98: Fix a crash when calling a subroutine from a stash (RT#131085)' \ + 'Fedora Patch99: Fix an improper cast of a negative integer to an unsigned 8-bit type (RT#131190)' \ + 'Fedora Patch100: Fix cloning :via handles on thread creation (RT#131221)' \ + 'Fedora Patch102: Fix glob UTF-8 flag on a glob reassignment (RT#131263)' \ + 'Fedora Patch103: Fix a buffer overflow in my_atof2() (RT#131526)' \ + 'Fedora Patch105: Fix handling backslashes in PATH environment variable when executing "perl -S" (RT#129183)' \ + 'Fedora Patch106: Fix a conditional jump on uninitilized memory in re_intuit_start() (RT#131575)' \ + 'Fedora Patch107: Fix spurious "Assuming NOT a POSIX class" warning (RT#131522)' \ + 'Fedora Patch109: Fix handling attribute specification on our variables (RT#131597)' \ + 'Fedora Patch110: Fix a crash when a match for inversely repeated group fails (RT#132017)' \ + 'Fedora Patch111: Fix an overflow when parsing a character range with no preceding character (RT#132245)' \ + 'Fedora Patch112: Fix walking symbol table for ISA in Carp' \ + 'Fedora Patch113: Fix handling file names with null bytes in stat and lstat functions (RT#131895)' \ + 'Fedora Patch114: Fix a crash when untying an object witout a stash' \ + 'Fedora Patch115: Fix deparsing of transliterations with unprintable characters (RT#132405)' \ + 'Fedora Patch116: Fix error reporting on do() on a directory (RT#125774)' \ + 'Fedora Patch117: Fix stack manipulation when a lexical subroutine is defined in a do block in a member of an iteration list (RT#132442)' \ + 'Fedora Patch118: Fix setting $! when statting a closed filehandle (RT#108288)' \ + 'Fedora Patch119: Fix tainting of s/// with overloaded replacement (RT#115266)' \ + 'Fedora Patch120: Expand system() arguments before a fork (RT#121105)' \ + 'Fedora Patch123: Avoid undefined behavior when copying memory in Glob and pp_caller (RT#131746)' \ + 'Fedora Patch125: Fix compatibility with libxcrypt (bug #1536752)' \ + 'Fedora Patch126: Link XS modules to pthread library to fix linking with -z defs' \ + 'Fedora Patch127: Fix parsing braced subscript after parentheses (RT#8045)' \ + 'Fedora Patch128: Adjust tests to gdbm-1.15 (RT#133295)' \ + 'Fedora Patch129: Pass the correct CFLAGS to dtrace' \ + 'Fedora Patch200: Link XS modules to libperl.so with EU::CBuilder on Linux' \ + 'Fedora Patch201: Link XS modules to libperl.so with EU::MM on Linux' \ + %{nil} +%endif + +#copy the example script +cp -a %{SOURCE5} . + +#copy Pod-Html license clarification +cp %{SOURCE6} . + +# +# Candidates for doc recoding (need case by case review): +# find . -name "*.pod" -o -name "README*" -o -name "*.pm" | xargs file -i | grep charset= | grep -v '\(us-ascii\|utf-8\)' +recode() +{ + iconv -f "${2:-iso-8859-1}" -t utf-8 < "$1" > "${1}_" + touch -r "$1" "${1}_" + mv -f "${1}_" "$1" +} +# TODO iconv fail on this one +##recode README.tw big5 +#recode pod/perlebcdic.pod +#recode pod/perlhack.pod +#recode pod/perlhist.pod +#recode pod/perlthrtut.pod +#recode AUTHORS + +find . -name \*.orig -exec rm -fv {} \; + +# Configure Compress::Zlib to use system zlib +sed -i 's|BUILD_ZLIB = True|BUILD_ZLIB = False| + s|INCLUDE = ./zlib-src|INCLUDE = %{_includedir}| + s|LIB = ./zlib-src|LIB = %{_libdir}|' \ + cpan/Compress-Raw-Zlib/config.in + +# Ensure that we never accidentally bundle zlib or bzip2 +rm -rf cpan/Compress-Raw-Zlib/zlib-src +rm -rf cpan/Compress-Raw-Bzip2/bzip2-src +sed -i '/\(bzip2\|zlib\)-src/d' MANIFEST + +%if !%{with gdbm} +# Do not install anything requiring NDBM_File if NDBM is not available. +rm -rf 'cpan/Memoize/Memoize/NDBM_File.pm' +sed -i '\|cpan/Memoize/Memoize/NDBM_File.pm|d' MANIFEST +%endif + + +%build +echo "RPM Build arch: %{_arch}" + +# use "lib", not %%{_lib}, for privlib, sitelib, and vendorlib +# To build production version, we would need -DDEBUGGING=-g + +# Perl INC path (perl -V) in search order: +# - /usr/local/share/perl5 -- for CPAN (site lib) +# - /usr/local/lib[64]/perl5 -- for CPAN (site arch) +# - /usr/share/perl5/vendor_perl -- 3rd party (vendor lib) +# - /usr/lib[64]/perl5/vendor_perl -- 3rd party (vendor arch) +# - /usr/share/perl5 -- Fedora (priv lib) +# - /usr/lib[64]/perl5 -- Fedora (arch lib) + +%global privlib %{_prefix}/share/perl5 +%global archlib %{_libdir}/perl5 + +%global perl_vendorlib %{privlib}/vendor_perl +%global perl_vendorarch %{archlib}/vendor_perl + +# ldflags is not used when linking XS modules. +# Only ldflags is used when linking miniperl. +# Only ccflags and ldflags are used for Configure's compiler checks. +# Set optimize=none to prevent from injecting upstream's value. +/bin/sh Configure -des \ + -Doptimize="none" \ + -Dccflags="$RPM_OPT_FLAGS" \ + -Dldflags="$RPM_LD_FLAGS" \ + -Dccdlflags="-Wl,--enable-new-dtags $RPM_LD_FLAGS" \ + -Dlddlflags="-shared $RPM_LD_FLAGS" \ + -Dshrpdir="%{_libdir}" \ + -DDEBUGGING=-g \ + -Dversion=%{perl_version} \ + -Dmyhostname=localhost \ + -Dperladmin=root@localhost \ + -Dcc='%{__cc}' \ + -Dcf_by='Red Hat, Inc.' \ + -Dprefix=%{_prefix} \ +%if %{without perl_enables_groff} + -Dman1dir="%{_mandir}/man1" \ + -Dman3dir="%{_mandir}/man3" \ +%endif + -Dvendorprefix=%{_prefix} \ + -Dsiteprefix=%{_prefix}/local \ + -Dsitelib="%{_prefix}/local/share/perl5" \ + -Dsitearch="%{_prefix}/local/%{_lib}/perl5" \ + -Dprivlib="%{privlib}" \ + -Dvendorlib="%{perl_vendorlib}" \ + -Darchlib="%{archlib}" \ + -Dvendorarch="%{perl_vendorarch}" \ + -Darchname=%{perl_archname} \ +%ifarch %{multilib_64_archs} + -Dlibpth="/usr/local/lib64 /lib64 %{_prefix}/lib64" \ +%endif +%ifarch sparc sparcv9 + -Ud_longdbl \ +%endif + -Duseshrplib \ + -Dusethreads \ + -Duseithreads \ +%if %{with perl_enables_systemtap} + -Dusedtrace='/usr/bin/dtrace' \ +%else + -Uusedtrace \ +%endif + -Duselargefiles \ + -Dd_semctl_semun \ + -Di_db \ +%if %{with gdbm} + -Ui_ndbm \ + -Di_gdbm \ +%endif + -Di_shadow \ + -Di_syslog \ + -Dman3ext=3pm \ + -Duseperlio \ + -Dinstallusrbinperl=n \ + -Ubincompat5005 \ + -Uversiononly \ + -Dpager='/usr/bin/less -isr' \ + -Dd_gethostent_r_proto -Ud_endhostent_r_proto -Ud_sethostent_r_proto \ + -Ud_endprotoent_r_proto -Ud_setprotoent_r_proto \ + -Ud_endservent_r_proto -Ud_setservent_r_proto \ + -Dscriptdir='%{_bindir}' \ + -Dusesitecustomize \ + -Duse64bitint1 + +# -Duseshrplib creates libperl.so, -Ubincompat5005 help create DSO -> libperl.so + +BUILD_BZIP2=0 +BZIP2_LIB=%{_libdir} +export BUILD_BZIP2 BZIP2_LIB + +# Prepapre a symlink from proper DSO name to libperl.so now so that new perl +# can be executed from make. +%global soname libperl.so.%(echo '%{perl_version}' | sed 's/^\\([^.]*\\.[^.]*\\).*/\\1/') +test -L %soname || ln -s libperl.so %soname + +%ifarch sparc64 %{arm} +make +%else +make %{?_smp_mflags} +%endif + +%install +make install DESTDIR=$RPM_BUILD_ROOT + +%global build_archlib $RPM_BUILD_ROOT%{archlib} +%global build_privlib $RPM_BUILD_ROOT%{privlib} +%global build_bindir $RPM_BUILD_ROOT%{_bindir} +%global new_perl LD_PRELOAD="%{build_archlib}/CORE/libperl.so" \\\ + LD_LIBRARY_PATH="%{build_archlib}/CORE" \\\ + PERL5LIB="%{build_archlib}:%{build_privlib}" \\\ + %{build_bindir}/perl + +# Make proper DSO names, move libperl to standard path. +mv "%{build_archlib}/CORE/libperl.so" \ + "$RPM_BUILD_ROOT%{_libdir}/libperl.so.%{perl_version}" +ln -s "libperl.so.%{perl_version}" "$RPM_BUILD_ROOT%{_libdir}/%{soname}" +ln -s "libperl.so.%{perl_version}" "$RPM_BUILD_ROOT%{_libdir}/libperl.so" +# XXX: Keep symlink from original location because various code glues +# $archlib/CORE/$libperl to get the DSO. +ln -s "../../libperl.so.%{perl_version}" "%{build_archlib}/CORE/libperl.so" +# XXX: Remove the soname named file from CORE directory that was created as +# a symlink in build section and installed as a regular file by perl build +# system. +rm -f "%{build_archlib}/CORE/%{soname}" + +install -p -m 755 utils/pl2pm %{build_bindir}/pl2pm + +for i in asm/termios.h syscall.h syslimits.h syslog.h \ + sys/ioctl.h sys/socket.h sys/time.h wait.h +do + %{new_perl} %{build_bindir}/h2ph -a -d %{build_archlib} $i || true +done + +# vendor directories (in this case for third party rpms) +# perl doesn't create the auto subdirectory, but modules put things in it, +# so we need to own it. + +mkdir -p $RPM_BUILD_ROOT%{perl_vendorarch}/auto +mkdir -p $RPM_BUILD_ROOT%{perl_vendorlib} + +# +# perl RPM macros +# +mkdir -p ${RPM_BUILD_ROOT}%{_rpmconfigdir}/macros.d +install -p -m 644 %{SOURCE3} ${RPM_BUILD_ROOT}%{_rpmconfigdir}/macros.d/ + +# +# Core modules removal +# +# Dual-living binaries clashes on debuginfo files between perl and standalone +# packages. Excluding is not enough, we need to remove them. This is +# a work-around for rpmbuild bug #878863. +find $RPM_BUILD_ROOT -type f -name '*.bs' -empty -delete +chmod -R u+w $RPM_BUILD_ROOT/* + +# miniperl? As an interpreter? How odd. Anyway, a symlink does it: +rm %{build_privlib}/ExtUtils/xsubpp +ln -s ../../../bin/xsubpp %{build_privlib}/ExtUtils/ + +# Don't need the .packlist +rm %{build_archlib}/.packlist + +# Do not distribute File::Spec::VMS as it works on VMS only (bug #973713) +# We cannot remove it in %%prep because dist/Cwd/t/Spec.t test needs it. +rm %{build_archlib}/File/Spec/VMS.pm +rm $RPM_BUILD_ROOT%{_mandir}/man3/File::Spec::VMS.3* + +# Fix some manpages to be UTF-8 +mkdir -p $RPM_BUILD_ROOT%{_mandir}/man1/ +pushd $RPM_BUILD_ROOT%{_mandir}/man1/ + for i in perl588delta.1 perldelta.1 ; do + iconv -f MS-ANSI -t UTF-8 $i --output new-$i + rm $i + mv new-$i $i + done +popd + +# for now, remove Bzip2: +# Why? Now is missing Bzip2 files and provides +##find $RPM_BUILD_ROOT -name Bzip2 | xargs rm -r +##find $RPM_BUILD_ROOT -name '*B*zip2*'| xargs rm + +# tests -- FIXME need to validate that this all works as expected +mkdir -p %{buildroot}%{perl5_testdir}/perl-tests + +# "core" +tar -cf - t/ | ( cd %{buildroot}%{perl5_testdir}/perl-tests && tar -xf - ) + +# "dual-lifed" +for dir in `find ext/ -type d -name t -maxdepth 2` ; do + + tar -cf - $dir | ( cd %{buildroot}%{perl5_testdir}/perl-tests/t && tar -xf - ) +done + +# Normalize shell bangs in tests. +# brp-mangle-shebangs executed by rpm-build chokes on t/TEST. +%{new_perl} -MConfig -i -pn \ + -e 's"\A#!(?:perl|\./perl|/usr/bin/perl|/usr/bin/env perl)\b"$Config{startperl}"' \ + $(find %{buildroot}%{perl5_testdir}/perl-tests -type f) + +%if %{with perl_enables_systemtap} +# Systemtap tapset install +mkdir -p %{buildroot}%{tapsetdir} +%ifarch %{multilib_64_archs} +%global libperl_stp libperl%{perl_version}-64.stp +%else +%global libperl_stp libperl%{perl_version}-32.stp +%endif + +sed \ + -e "s|LIBRARY_PATH|%{_libdir}/%{soname}|" \ + %{SOURCE4} \ + > %{buildroot}%{tapsetdir}/%{libperl_stp} +%endif + +# TODO: Canonicalize test files (rewrite intrerpreter path, fix permissions) +# XXX: We cannot rewrite ./perl before %%check phase. Otherwise the test +# would run against system perl at build-time. +# See __spec_check_pre global macro in macros.perl. +#T_FILES=`find %%{buildroot}%%{perl5_testdir} -type f -name '*.t'` +#%%fix_shbang_line $T_FILES +#%%{__chmod} +x $T_FILES +#%%{_fixperms} %%{buildroot}%%{perl5_testdir} +# +# lib/perl5db.t will fail if Term::ReadLine::Gnu is available +%check +%if %{with test} +%{new_perl} -I/lib regen/lib_cleanup.pl +pushd t +%{new_perl} -I../lib porting/customized.t --regen +popd +%if %{parallel_tests} + JOBS=$(printf '%%s' "%{?_smp_mflags}" | sed 's/.*-j\([0-9][0-9]*\).*/\1/') + LC_ALL=C TEST_JOBS=$JOBS make test_harness +%else + LC_ALL=C make test +%endif +%endif + +%ldconfig_scriptlets libs + +%files +%{_mandir}/man1/*.1* +%{_mandir}/man3/*.3* +%{_bindir}/* +%{archlib}/* +%{privlib}/* + + +# libs +%exclude %dir %{archlib} +%exclude %dir %{archlib}/auto +%exclude %{archlib}/auto/re +%exclude %dir %{archlib}/CORE +%exclude %{archlib}/CORE/libperl.so +%exclude %{archlib}/re.pm +%exclude %{_libdir}/libperl.so.* +%exclude %dir %{perl_vendorarch} +%exclude %dir %{perl_vendorarch}/auto +%exclude %dir %{privlib} +%exclude %{privlib}/integer.pm +%exclude %{privlib}/strict.pm +%exclude %{privlib}/unicore +%exclude %{privlib}/utf8.pm +%exclude %{privlib}/utf8_heavy.pl +%exclude %{privlib}/warnings.pm +%exclude %{privlib}/XSLoader.pm +%exclude %dir %{perl_vendorlib} +%exclude %{_mandir}/man3/integer.* +%exclude %{_mandir}/man3/re.* +%exclude %{_mandir}/man3/strict.* +%exclude %{_mandir}/man3/utf8.* +%exclude %{_mandir}/man3/warnings.* +%exclude %{_mandir}/man3/XSLoader.* + +# devel +%exclude %{_bindir}/h2xs +%exclude %{_mandir}/man1/h2xs* +%exclude %{_bindir}/perlivp +%exclude %{_mandir}/man1/perlivp* +%exclude %{archlib}/CORE/*.h +%exclude %{_libdir}/libperl.so +%exclude %{_mandir}/man1/perlxs* +%if %{with perl_enables_systemtap} +%exclude %dir %{_datadir}/systemtap +%exclude %dir %{_datadir}/systemtap/tapset +%endif + +# utils +%exclude %{_bindir}/c2ph +%exclude %{_bindir}/h2ph +%exclude %{_bindir}/perlbug +%exclude %{_bindir}/perlthanks +%exclude %{_bindir}/pl2pm +%exclude %{_bindir}/pstruct +%exclude %{_bindir}/splain +%exclude %{privlib}/pod/perlutil.pod +%exclude %{_mandir}/man1/c2ph.* +%exclude %{_mandir}/man1/h2ph.* +%exclude %{_mandir}/man1/perlbug.* +%exclude %{_mandir}/man1/perlthanks.* +%exclude %{_mandir}/man1/perlutil.* +%exclude %{_mandir}/man1/pl2pm.* +%exclude %{_mandir}/man1/pstruct.* +%exclude %{_mandir}/man1/splain.* + +# Archive-Tar +%exclude %{_bindir}/ptar +%exclude %{_bindir}/ptardiff +%exclude %{_bindir}/ptargrep +%exclude %dir %{privlib}/Archive +%exclude %{privlib}/Archive/Tar +%exclude %{privlib}/Archive/Tar.pm +%exclude %{_mandir}/man1/ptar.1* +%exclude %{_mandir}/man1/ptardiff.1* +%exclude %{_mandir}/man1/ptargrep.1* +%exclude %{_mandir}/man3/Archive::Tar* + +# Attribute-Handlers +%exclude %{privlib}/Attribute +%exclude %{_mandir}/man3/Attribute::Handlers.* + +# autodie +%exclude %{privlib}/autodie/ +%exclude %{privlib}/autodie.pm +%exclude %{privlib}/Fatal.pm +%exclude %{_mandir}/man3/autodie.3* +%exclude %{_mandir}/man3/autodie::* +%exclude %{_mandir}/man3/Fatal.3* + +# B-Debug +%exclude %{privlib}/B/Debug.pm +%exclude %{_mandir}/man3/B::Debug.3* + +# bignum +%exclude %{privlib}/bigint.pm +%exclude %{privlib}/bignum.pm +%exclude %{privlib}/bigrat.pm +%exclude %{privlib}/Math/BigFloat +%exclude %{privlib}/Math/BigInt/Trace.pm +%exclude %{_mandir}/man3/bigint.* +%exclude %{_mandir}/man3/bignum.* +%exclude %{_mandir}/man3/bigrat.* + +# Carp +%exclude %{privlib}/Carp +%exclude %{privlib}/Carp.* +%exclude %{_mandir}/man3/Carp.* + +# Config-Perl-V +%exclude %{privlib}/Config/Perl +%exclude %{_mandir}/man3/Config::Perl::V.* + +# constant +%exclude %{privlib}/constant.pm +%exclude %{_mandir}/man3/constant.3* + +# CPAN +%exclude %{_bindir}/cpan +%exclude %dir %{privlib}/App +%exclude %{privlib}/App/Cpan.pm +%exclude %{privlib}/CPAN +%exclude %{privlib}/CPAN.pm +%exclude %{_mandir}/man1/cpan.1* +%exclude %{_mandir}/man3/App::Cpan.* +%exclude %{_mandir}/man3/CPAN.* +%exclude %{_mandir}/man3/CPAN:* + +# CPAN-Meta +%exclude %dir %{privlib}/CPAN +%exclude %{privlib}/CPAN/Meta.pm +%exclude %dir %{privlib}/CPAN/Meta +%exclude %{privlib}/CPAN/Meta/Converter.pm +%exclude %{privlib}/CPAN/Meta/Feature.pm +%exclude %dir %{privlib}/CPAN/Meta/History +%exclude %{privlib}/CPAN/Meta/History.pm +%exclude %{privlib}/CPAN/Meta/Merge.pm +%exclude %{privlib}/CPAN/Meta/Prereqs.pm +%exclude %{privlib}/CPAN/Meta/Spec.pm +%exclude %{privlib}/CPAN/Meta/Validator.pm +%exclude %{_mandir}/man3/CPAN::Meta* + +# CPAN-Meta-Requirements +%exclude %dir %{privlib}/CPAN +%exclude %dir %{privlib}/CPAN/Meta +%exclude %{privlib}/CPAN/Meta/Requirements.pm +%exclude %{_mandir}/man3/CPAN::Meta::Requirements.3* + +# CPAN-Meta-YAML +%exclude %dir %{privlib}/CPAN +%exclude %dir %{privlib}/CPAN/Meta +%exclude %{privlib}/CPAN/Meta/YAML.pm +%exclude %{_mandir}/man3/CPAN::Meta::YAML* + +# Parse-CPAN-Meta +%exclude %dir %{privlib}/Parse +%exclude %dir %{privlib}/Parse/CPAN +%exclude %{privlib}/Parse/CPAN/Meta.pm +%exclude %{_mandir}/man3/Parse::CPAN::Meta.3* + +# Compress-Raw-Bzip2 +%exclude %dir %{archlib}/Compress +%exclude %dir %{archlib}/Compress/Raw +%exclude %{archlib}/Compress/Raw/Bzip2.pm +%exclude %dir %{archlib}/auto/Compress +%exclude %dir %{archlib}/auto/Compress/Raw +%exclude %{archlib}/auto/Compress/Raw/Bzip2 +%exclude %{_mandir}/man3/Compress::Raw::Bzip2* + +# Compress-Raw-Zlib +%exclude %dir %{archlib}/Compress +%exclude %dir %{archlib}/Compress/Raw +%exclude %{archlib}/Compress/Raw/Zlib.pm +%exclude %dir %{archlib}/auto/Compress +%exclude %dir %{archlib}/auto/Compress/Raw +%exclude %{archlib}/auto/Compress/Raw/Zlib +%exclude %{_mandir}/man3/Compress::Raw::Zlib* + +# Data-Dumper +%exclude %dir %{archlib}/auto/Data +%exclude %dir %{archlib}/auto/Data/Dumper +%exclude %{archlib}/auto/Data/Dumper/Dumper.so +%exclude %dir %{archlib}/Data +%exclude %{archlib}/Data/Dumper.pm +%exclude %{_mandir}/man3/Data::Dumper.3* + +# DB_File +%exclude %{archlib}/DB_File.pm +%exclude %dir %{archlib}/auto/DB_File +%exclude %{archlib}/auto/DB_File/DB_File.so +%exclude %{_mandir}/man3/DB_File* + +# Devel-Peek +%dir %exclude %{archlib}/Devel +%exclude %{archlib}/Devel/Peek.pm +%dir %exclude %{archlib}/auto/Devel +%exclude %{archlib}/auto/Devel/Peek +%exclude %{_mandir}/man3/Devel::Peek.* + +# Devel-PPPort +%exclude %{archlib}/Devel/PPPort.pm +%exclude %{_mandir}/man3/Devel::PPPort.3* + +# Devel-SelfStubber +%exclude %dir %{privlib}/Devel +%exclude %{privlib}/Devel/SelfStubber.pm +%exclude %{_mandir}/man3/Devel::SelfStubber.* + +# Digest +%exclude %{privlib}/Digest.pm +%exclude %dir %{privlib}/Digest +%exclude %{privlib}/Digest/base.pm +%exclude %{privlib}/Digest/file.pm +%exclude %{_mandir}/man3/Digest.3* +%exclude %{_mandir}/man3/Digest::base.3* +%exclude %{_mandir}/man3/Digest::file.3* + +# Digest-MD5 +%exclude %dir %{archlib}/Digest +%exclude %{archlib}/Digest/MD5.pm +%exclude %dir %{archlib}/auto/Digest +%exclude %{archlib}/auto/Digest/MD5 +%exclude %{_mandir}/man3/Digest::MD5.3* + +# Digest-SHA +%exclude %{_bindir}/shasum +%exclude %dir %{archlib}/Digest +%exclude %{archlib}/Digest/SHA.pm +%exclude %dir %{archlib}/auto/Digest +%exclude %{archlib}/auto/Digest/SHA +%exclude %{_mandir}/man1/shasum.1* +%exclude %{_mandir}/man3/Digest::SHA.3* + +# Encode +%exclude %{_bindir}/encguess +%exclude %{_bindir}/piconv +%exclude %{archlib}/Encode* +%exclude %{archlib}/auto/Encode* +%exclude %{privlib}/Encode +%exclude %{_mandir}/man1/encguess.1* +%exclude %{_mandir}/man1/piconv.1* +%exclude %{_mandir}/man3/Encode*.3* + +# encoding +%exclude %{archlib}/encoding.pm +%exclude %{_mandir}/man3/encoding.3* + +# Encode-devel +%exclude %{_bindir}/enc2xs +%exclude %dir %{privlib}/Encode +%exclude %{privlib}/Encode/*.e2x +%exclude %{privlib}/Encode/encode.h +%exclude %{_mandir}/man1/enc2xs.1* + +# Env +%exclude %{privlib}/Env.pm +%exclude %{_mandir}/man3/Env.3* + +# Errno +%exclude %{archlib}/Errno.pm +%exclude %{_mandir}/man3/Errno.* + +# Exporter +%exclude %{privlib}/Exporter* +%exclude %{_mandir}/man3/Exporter* + +# experimental +%exclude %{privlib}/experimental* +%exclude %{_mandir}/man3/experimental* + +# ExtUtils-CBuilder +%exclude %{privlib}/ExtUtils/CBuilder +%exclude %{privlib}/ExtUtils/CBuilder.pm +%exclude %{_mandir}/man3/ExtUtils::CBuilder* + +# ExtUtils-Command +%exclude %{privlib}/ExtUtils/Command.pm +%exclude %{_mandir}/man3/ExtUtils::Command.* + +# ExtUtils-Embed +%exclude %{privlib}/ExtUtils/Embed.pm +%exclude %{_mandir}/man3/ExtUtils::Embed* + +# ExtUtils-Install +%exclude %{privlib}/ExtUtils/Install.pm +%exclude %{privlib}/ExtUtils/Installed.pm +%exclude %{privlib}/ExtUtils/Packlist.pm +%exclude %{_mandir}/man3/ExtUtils::Install.3* +%exclude %{_mandir}/man3/ExtUtils::Installed.3* +%exclude %{_mandir}/man3/ExtUtils::Packlist.3* + +# ExtUtils-Manifest +%exclude %{privlib}/ExtUtils/Manifest.pm +%exclude %{privlib}/ExtUtils/MANIFEST.SKIP +%exclude %{_mandir}/man3/ExtUtils::Manifest.3* + +# ExtUtils-MakeMaker +%exclude %{_bindir}/instmodsh +%exclude %{privlib}/ExtUtils/Command +%exclude %{privlib}/ExtUtils/Liblist +%exclude %{privlib}/ExtUtils/Liblist.pm +%exclude %{privlib}/ExtUtils/MakeMaker +%exclude %{privlib}/ExtUtils/MakeMaker.pm +%exclude %{privlib}/ExtUtils/MM.pm +%exclude %{privlib}/ExtUtils/MM_*.pm +%exclude %{privlib}/ExtUtils/MY.pm +%exclude %{privlib}/ExtUtils/Mkbootstrap.pm +%exclude %{privlib}/ExtUtils/Mksymlists.pm +%exclude %{privlib}/ExtUtils/testlib.pm +%exclude %{_mandir}/man1/instmodsh.1* +%exclude %{_mandir}/man3/ExtUtils::Command::MM* +%exclude %{_mandir}/man3/ExtUtils::Liblist.3* +%exclude %{_mandir}/man3/ExtUtils::MM.3* +%exclude %{_mandir}/man3/ExtUtils::MM_* +%exclude %{_mandir}/man3/ExtUtils::MY.3* +%exclude %{_mandir}/man3/ExtUtils::MakeMaker* +%exclude %{_mandir}/man3/ExtUtils::Mkbootstrap.3* +%exclude %{_mandir}/man3/ExtUtils::Mksymlists.3* +%exclude %{_mandir}/man3/ExtUtils::testlib.3* + +# ExtUtils-Miniperl +%exclude %{privlib}/ExtUtils/Miniperl.pm +%exclude %{_mandir}/man3/ExtUtils::Miniperl.3* + +# ExtUtils-MM-Utils +%exclude %dir %{privlib}/ExtUtils/MM +%exclude %{privlib}/ExtUtils/MM/Utils.pm +%exclude %{_mandir}/man3/ExtUtils::MM::Utils.* + +# ExtUtils-ParseXS +%exclude %dir %{privlib}/ExtUtils/ParseXS +%exclude %{privlib}/ExtUtils/ParseXS.pm +%exclude %{privlib}/ExtUtils/ParseXS.pod +%exclude %{privlib}/ExtUtils/ParseXS/Constants.pm +%exclude %{privlib}/ExtUtils/ParseXS/CountLines.pm +%exclude %{privlib}/ExtUtils/ParseXS/Eval.pm +%exclude %{privlib}/ExtUtils/ParseXS/Utilities.pm +%exclude %dir %{privlib}/ExtUtils/Typemaps +%exclude %{privlib}/ExtUtils/Typemaps.pm +%exclude %{privlib}/ExtUtils/Typemaps/Cmd.pm +%exclude %{privlib}/ExtUtils/Typemaps/InputMap.pm +%exclude %{privlib}/ExtUtils/Typemaps/OutputMap.pm +%exclude %{privlib}/ExtUtils/Typemaps/Type.pm +%exclude %{privlib}/ExtUtils/xsubpp +%exclude %{_bindir}/xsubpp +%exclude %{_mandir}/man1/xsubpp* +%exclude %{_mandir}/man3/ExtUtils::ParseXS.3* +%exclude %{_mandir}/man3/ExtUtils::ParseXS::Constants.3* +%exclude %{_mandir}/man3/ExtUtils::ParseXS::Eval.3* +%exclude %{_mandir}/man3/ExtUtils::ParseXS::Utilities.3* +%exclude %{_mandir}/man3/ExtUtils::Typemaps.3* +%exclude %{_mandir}/man3/ExtUtils::Typemaps::Cmd.3* +%exclude %{_mandir}/man3/ExtUtils::Typemaps::InputMap.3* +%exclude %{_mandir}/man3/ExtUtils::Typemaps::OutputMap.3* +%exclude %{_mandir}/man3/ExtUtils::Typemaps::Type.3* + +# File-Fetch +%exclude %{privlib}/File/Fetch.pm +%exclude %{_mandir}/man3/File::Fetch.3* + +# File-Path +%exclude %{privlib}/File/Path.pm +%exclude %{_mandir}/man3/File::Path.3* + +# File-Temp +%exclude %{privlib}/File/Temp.pm +%exclude %{_mandir}/man3/File::Temp.3* + +# Filter +%exclude %dir %{archlib}/auto/Filter +%exclude %{archlib}/auto/Filter/Util +%exclude %dir %{archlib}/Filter +%exclude %{archlib}/Filter/Util +%exclude %{privlib}/pod/perlfilter.pod +%exclude %{_mandir}/man1/perlfilter.* +%exclude %{_mandir}/man3/Filter::Util::* + +# Filter-Simple +%exclude %dir %{privlib}/Filter +%exclude %{privlib}/Filter/Simple.pm +%exclude %{_mandir}/man3/Filter::Simple.3* + +# Getopt-Long +%exclude %{privlib}/Getopt/Long.pm +%exclude %{_mandir}/man3/Getopt::Long.3* + +# IO +%exclude %dir %{archlib}/IO +%exclude %{archlib}/IO.pm +%exclude %{archlib}/IO/Dir.pm +%exclude %{archlib}/IO/File.pm +%exclude %{archlib}/IO/Handle.pm +%exclude %{archlib}/IO/Pipe.pm +%exclude %{archlib}/IO/Poll.pm +%exclude %{archlib}/IO/Seekable.pm +%exclude %{archlib}/IO/Select.pm +%exclude %dir %{archlib}/IO/Socket +%exclude %{archlib}/IO/Socket/INET.pm +%exclude %{archlib}/IO/Socket/UNIX.pm +%exclude %{archlib}/IO/Socket.pm +%exclude %dir %{archlib}/auto/IO +%exclude %{archlib}/auto/IO/IO.so +%exclude %{_mandir}/man3/IO.* +%exclude %{_mandir}/man3/IO::Dir.* +%exclude %{_mandir}/man3/IO::File.* +%exclude %{_mandir}/man3/IO::Handle.* +%exclude %{_mandir}/man3/IO::Pipe.* +%exclude %{_mandir}/man3/IO::Poll.* +%exclude %{_mandir}/man3/IO::Seekable.* +%exclude %{_mandir}/man3/IO::Select.* +%exclude %{_mandir}/man3/IO::Socket::INET.* +%exclude %{_mandir}/man3/IO::Socket::UNIX.* +%exclude %{_mandir}/man3/IO::Socket.* + +# IO-Compress +%exclude %{_bindir}/zipdetails +%exclude %dir %{privlib}/IO +%exclude %dir %{privlib}/IO/Compress +%exclude %{privlib}/IO/Compress/FAQ.pod +%exclude %{_mandir}/man1/zipdetails.* +%exclude %{_mandir}/man3/IO::Compress::FAQ.* +# Compress-Zlib +%exclude %dir %{privlib}/Compress +%exclude %{privlib}/Compress/Zlib.pm +%exclude %{_mandir}/man3/Compress::Zlib* +# IO-Compress-Base +%exclude %{privlib}/File/GlobMapper.pm +%exclude %dir %{privlib}/IO +%exclude %dir %{privlib}/IO/Compress +%exclude %{privlib}/IO/Compress/Base +%exclude %{privlib}/IO/Compress/Base.pm +%exclude %dir %{privlib}/IO/Uncompress +%exclude %{privlib}/IO/Uncompress/AnyUncompress.pm +%exclude %{privlib}/IO/Uncompress/Base.pm +%exclude %{_mandir}/man3/File::GlobMapper.* +%exclude %{_mandir}/man3/IO::Compress::Base.* +%exclude %{_mandir}/man3/IO::Uncompress::AnyUncompress.* +%exclude %{_mandir}/man3/IO::Uncompress::Base.* +# IO-Compress-Zlib +%exclude %dir %{privlib}/IO +%exclude %dir %{privlib}/IO/Compress +%exclude %{privlib}/IO/Compress/Adapter +%exclude %{privlib}/IO/Compress/Deflate.pm +%exclude %{privlib}/IO/Compress/Gzip +%exclude %{privlib}/IO/Compress/Gzip.pm +%exclude %{privlib}/IO/Compress/RawDeflate.pm +%exclude %{privlib}/IO/Compress/Bzip2.pm +%exclude %{privlib}/IO/Compress/Zip +%exclude %{privlib}/IO/Compress/Zip.pm +%exclude %{privlib}/IO/Compress/Zlib +%exclude %dir %{privlib}/IO/Uncompress +%exclude %{privlib}/IO/Uncompress/Adapter +%exclude %{privlib}/IO/Uncompress/AnyInflate.pm +%exclude %{privlib}/IO/Uncompress/Bunzip2.pm +%exclude %{privlib}/IO/Uncompress/Gunzip.pm +%exclude %{privlib}/IO/Uncompress/Inflate.pm +%exclude %{privlib}/IO/Uncompress/RawInflate.pm +%exclude %{privlib}/IO/Uncompress/Unzip.pm +%exclude %{_mandir}/man3/IO::Compress::Deflate* +%exclude %{_mandir}/man3/IO::Compress::Bzip2* +%exclude %{_mandir}/man3/IO::Compress::Gzip* +%exclude %{_mandir}/man3/IO::Compress::RawDeflate* +%exclude %{_mandir}/man3/IO::Compress::Zip* +%exclude %{_mandir}/man3/IO::Uncompress::AnyInflate* +%exclude %{_mandir}/man3/IO::Uncompress::Bunzip2* +%exclude %{_mandir}/man3/IO::Uncompress::Gunzip* +%exclude %{_mandir}/man3/IO::Uncompress::Inflate* +%exclude %{_mandir}/man3/IO::Uncompress::RawInflate* +%exclude %{_mandir}/man3/IO::Uncompress::Unzip* + +# IO-Socket-IP +%exclude %dir %{privlib}/IO +%exclude %dir %{privlib}/IO/Socket +%exclude %{privlib}/IO/Socket/IP.pm +%exclude %{_mandir}/man3/IO::Socket::IP.* + +# IO-Zlib +%exclude %dir %{privlib}/IO +%exclude %{privlib}/IO/Zlib.pm +%exclude %{_mandir}/man3/IO::Zlib.* + +# HTTP-Tiny +%exclude %dir %{privlib}/HTTP +%exclude %{privlib}/HTTP/Tiny.pm +%exclude %{_mandir}/man3/HTTP::Tiny* + +# IPC-Cmd +%exclude %{privlib}/IPC/Cmd.pm +%exclude %{_mandir}/man3/IPC::Cmd.3* + +# IPC-SysV +%exclude %{archlib}/auto/IPC +%exclude %{archlib}/IPC/Msg.pm +%exclude %{archlib}/IPC/Semaphore.pm +%exclude %{archlib}/IPC/SharedMem.pm +%exclude %{archlib}/IPC/SysV.pm +%exclude %{_mandir}/man3/IPC::Msg.* +%exclude %{_mandir}/man3/IPC::Semaphore.* +%exclude %{_mandir}/man3/IPC::SharedMem.* +%exclude %{_mandir}/man3/IPC::SysV.* + +# JSON-PP +%exclude %{_bindir}/json_pp +%exclude %dir %{privlib}/JSON +%exclude %{privlib}/JSON/PP +%exclude %{privlib}/JSON/PP.pm +%exclude %{_mandir}/man1/json_pp.1* +%exclude %{_mandir}/man3/JSON::PP.3* +%exclude %{_mandir}/man3/JSON::PP::Boolean.3pm* + +# libnet +%exclude %{privlib}/Net/Cmd.pm +%exclude %{privlib}/Net/Config.pm +%exclude %{privlib}/Net/Domain.pm +%exclude %{privlib}/Net/FTP +%exclude %{privlib}/Net/FTP.pm +%exclude %{privlib}/Net/libnetFAQ.pod +%exclude %{privlib}/Net/NNTP.pm +%exclude %{privlib}/Net/Netrc.pm +%exclude %{privlib}/Net/POP3.pm +%exclude %{privlib}/Net/SMTP.pm +%exclude %{privlib}/Net/Time.pm +%exclude %{_mandir}/man3/Net::Cmd.* +%exclude %{_mandir}/man3/Net::Config.* +%exclude %{_mandir}/man3/Net::Domain.* +%exclude %{_mandir}/man3/Net::FTP.* +%exclude %{_mandir}/man3/Net::libnetFAQ.* +%exclude %{_mandir}/man3/Net::NNTP.* +%exclude %{_mandir}/man3/Net::Netrc.* +%exclude %{_mandir}/man3/Net::POP3.* +%exclude %{_mandir}/man3/Net::SMTP.* +%exclude %{_mandir}/man3/Net::Time.* + +# libnetcfg +%exclude %{_bindir}/libnetcfg +%exclude %{_mandir}/man1/libnetcfg* + +# Locale-Codes +%exclude %dir %{privlib}/Locale +%exclude %{privlib}/Locale/Codes +%exclude %{privlib}/Locale/Codes.* +%exclude %{privlib}/Locale/Country.* +%exclude %{privlib}/Locale/Currency.* +%exclude %{privlib}/Locale/Language.* +%exclude %{privlib}/Locale/Script.* +%exclude %{_mandir}/man3/Locale::Codes::* +%exclude %{_mandir}/man3/Locale::Codes.* +%exclude %{_mandir}/man3/Locale::Country.* +%exclude %{_mandir}/man3/Locale::Currency.* +%exclude %{_mandir}/man3/Locale::Language.* +%exclude %{_mandir}/man3/Locale::Script.* + +# Locale-Maketext +%exclude %dir %{privlib}/Locale +%exclude %dir %{privlib}/Locale/Maketext +%exclude %{privlib}/Locale/Maketext.* +%exclude %{privlib}/Locale/Maketext/Cookbook.* +%exclude %{privlib}/Locale/Maketext/Guts.* +%exclude %{privlib}/Locale/Maketext/GutsLoader.* +%exclude %{privlib}/Locale/Maketext/TPJ13.* +%exclude %{_mandir}/man3/Locale::Maketext.* +%exclude %{_mandir}/man3/Locale::Maketext::Cookbook.* +%exclude %{_mandir}/man3/Locale::Maketext::Guts.* +%exclude %{_mandir}/man3/Locale::Maketext::GutsLoader.* +%exclude %{_mandir}/man3/Locale::Maketext::TPJ13.* + +# Locale-Maketext-Simple +%exclude %dir %{privlib}/Locale +%exclude %dir %{privlib}/Locale/Maketext +%exclude %{privlib}/Locale/Maketext/Simple.pm +%exclude %{_mandir}/man3/Locale::Maketext::Simple.* + +# Math-BigInt +%exclude %{privlib}/Math/BigFloat.pm +%exclude %{privlib}/Math/BigInt.pm +%exclude %dir %exclude %{privlib}/Math/BigInt +%exclude %{privlib}/Math/BigInt/Calc.pm +%exclude %{privlib}/Math/BigInt/CalcEmu.pm +%exclude %{_mandir}/man3/Math::BigFloat.* +%exclude %{_mandir}/man3/Math::BigInt.* +%exclude %{_mandir}/man3/Math::BigInt::Calc.* +%exclude %{_mandir}/man3/Math::BigInt::CalcEmu.* + +# Math-BigInt-FastCalc +%exclude %{archlib}/Math +%exclude %{archlib}/auto/Math +%exclude %{_mandir}/man3/Math::BigInt::FastCalc.* + +# Math-BigRat +%exclude %{privlib}/Math/BigRat.pm +%exclude %{_mandir}/man3/Math::BigRat.* + +# Math-Complex +%dir %exclude %{privlib}/Math +%exclude %{privlib}/Math/Complex.pm +%exclude %{privlib}/Math/Trig.pm +%exclude %{_mandir}/man3/Math::Complex.* +%exclude %{_mandir}/man3/Math::Trig.* + +# Memoize +%exclude %{privlib}/Memoize +%exclude %{privlib}/Memoize.pm +%exclude %{_mandir}/man3/Memoize::* +%exclude %{_mandir}/man3/Memoize.* + +# MIME-Base64 +%exclude %{archlib}/auto/MIME +%exclude %{archlib}/MIME +%exclude %{_mandir}/man3/MIME::* + +# Module-CoreList +%exclude %dir %{privlib}/Module +%exclude %{privlib}/Module/CoreList +%exclude %{privlib}/Module/CoreList.pm +%exclude %{privlib}/Module/CoreList.pod +%exclude %{_mandir}/man3/Module::CoreList* + +# Module-CoreList-tools +%exclude %{_bindir}/corelist +%exclude %{_mandir}/man1/corelist* + +# Module-Load +%exclude %dir %{privlib}/Module +%exclude %{privlib}/Module/Load.pm +%exclude %{_mandir}/man3/Module::Load.* + +# Module-Load-Conditional +%exclude %dir %{privlib}/Module +%exclude %{privlib}/Module/Load +%exclude %{_mandir}/man3/Module::Load::Conditional* + +# Module-Loaded +%exclude %dir %{privlib}/Module +%exclude %{privlib}/Module/Loaded.pm +%exclude %{_mandir}/man3/Module::Loaded* + +# Module-Metadata +%exclude %dir %{privlib}/Module +%exclude %{privlib}/Module/Metadata.pm +%exclude %{_mandir}/man3/Module::Metadata.3pm* + +# Net-Ping +%exclude %{privlib}/Net/Ping.pm +%exclude %{_mandir}/man3/Net::Ping.* + +# PathTools +%exclude %{archlib}/Cwd.pm +%exclude %{archlib}/File/Spec* +%exclude %{archlib}/auto/Cwd/ +%exclude %{_mandir}/man3/Cwd* +%exclude %{_mandir}/man3/File::Spec* + +# Params-Check +%exclude %{privlib}/Params/ +%exclude %{_mandir}/man3/Params::Check* + +# perlfaq +%exclude %{privlib}/perlfaq.pm +%exclude %{privlib}/pod/perlfaq* +%exclude %{privlib}/pod/perlglossary.pod +%exclude %{_mandir}/man1/perlfaq* +%exclude %{_mandir}/man1/perlglossary.* + +# PerlIO-via-QuotedPrint +%exclude %{privlib}/PerlIO +%exclude %{_mandir}/man3/PerlIO::via::QuotedPrint.* + +# Perl-OSType +%exclude %dir %{privlib}/Perl +%exclude %{privlib}/Perl/OSType.pm +%exclude %{_mandir}/man3/Perl::OSType.3pm* + +# open +%exclude %{privlib}/open.pm +%exclude %{_mandir}/man3/open.3* + +# parent +%exclude %{privlib}/parent.pm +%exclude %{_mandir}/man3/parent.3* + +# Pod-Checker +%exclude %{_bindir}/podchecker +%exclude %{privlib}/Pod/Checker.pm +%exclude %{_mandir}/man1/podchecker.* +%exclude %{_mandir}/man3/Pod::Checker.* + +# Pod-Escapes +%exclude %{privlib}/Pod/Escapes.pm +%exclude %{_mandir}/man3/Pod::Escapes.* + +# Pod-Html +%exclude %{_bindir}/pod2html +%exclude %{privlib}/Pod/Html.pm +%exclude %{_mandir}/man1/pod2html.1* +%exclude %{_mandir}/man3/Pod::Html.* + +# Pod-Parser +%exclude %{_bindir}/podselect +%exclude %{privlib}/Pod/Find.pm +%exclude %{privlib}/Pod/InputObjects.pm +%exclude %{privlib}/Pod/ParseUtils.pm +%exclude %{privlib}/Pod/Parser.pm +%exclude %{privlib}/Pod/PlainText.pm +%exclude %{privlib}/Pod/Select.pm +%exclude %{_mandir}/man1/podselect.1* +%exclude %{_mandir}/man3/Pod::Find.* +%exclude %{_mandir}/man3/Pod::InputObjects.* +%exclude %{_mandir}/man3/Pod::ParseUtils.* +%exclude %{_mandir}/man3/Pod::Parser.* +%exclude %{_mandir}/man3/Pod::PlainText.* +%exclude %{_mandir}/man3/Pod::Select.* + +# Pod-Perldoc +%exclude %{_bindir}/perldoc +%exclude %{privlib}/pod/perldoc.pod +%exclude %{privlib}/Pod/Perldoc.pm +%exclude %{privlib}/Pod/Perldoc/ +%exclude %{_mandir}/man1/perldoc.1* +%exclude %{_mandir}/man3/Pod::Perldoc* + +# Pod-Usage +%exclude %{_bindir}/pod2usage +%exclude %{privlib}/Pod/Usage.pm +%exclude %{_mandir}/man1/pod2usage.* +%exclude %{_mandir}/man3/Pod::Usage.* + +# podlators +%exclude %{_bindir}/pod2man +%exclude %{_bindir}/pod2text +%exclude %{privlib}/pod/perlpodstyle.pod +%exclude %{privlib}/Pod/Man.pm +%exclude %{privlib}/Pod/ParseLink.pm +%exclude %{privlib}/Pod/Text +%exclude %{privlib}/Pod/Text.pm +%exclude %{_mandir}/man1/pod2man.1* +%exclude %{_mandir}/man1/pod2text.1* +%exclude %{_mandir}/man1/perlpodstyle.1* +%exclude %{_mandir}/man3/Pod::Man* +%exclude %{_mandir}/man3/Pod::ParseLink* +%exclude %{_mandir}/man3/Pod::Text* + +# Pod-Simple +%exclude %{privlib}/Pod/Simple/ +%exclude %{privlib}/Pod/Simple.pm +%exclude %{privlib}/Pod/Simple.pod +%exclude %{_mandir}/man3/Pod::Simple* + +# Scalar-List-Utils +%exclude %{archlib}/List/ +%exclude %{archlib}/Scalar/ +%exclude %{archlib}/Sub/ +%exclude %{archlib}/auto/List/ +%exclude %{_mandir}/man3/List::Util* +%exclude %{_mandir}/man3/Scalar::Util* +%exclude %{_mandir}/man3/Sub::Util* + +# SelfLoader +%exclude %{privlib}/SelfLoader.pm +%exclude %{_mandir}/man3/SelfLoader* + +# Storable +%exclude %{archlib}/Storable.pm +%exclude %{archlib}/auto/Storable/ +%exclude %{_mandir}/man3/Storable.* + +# Sys-Syslog +%exclude %{archlib}/Sys/Syslog.pm +%exclude %{archlib}/auto/Sys/Syslog/ +%exclude %{_mandir}/man3/Sys::Syslog.* + +# Term-ANSIColor +%exclude %{privlib}/Term/ANSIColor.pm +%exclude %{_mandir}/man3/Term::ANSIColor* + +# Term-Cap +%exclude %{privlib}/Term/Cap.pm +%exclude %{_mandir}/man3/Term::Cap.* + +# Test +%exclude %{privlib}/Test.pm +%exclude %{_mandir}/man3/Test.* + +# Test-Harness +%exclude %{_bindir}/prove +%exclude %dir %{privlib}/App +%exclude %{privlib}/App/Prove* +%exclude %{privlib}/TAP* +%exclude %dir %{privlib}/Test +%exclude %{privlib}/Test/Harness* +%exclude %{_mandir}/man1/prove.1* +%exclude %{_mandir}/man3/App::Prove* +%exclude %{_mandir}/man3/TAP* +%exclude %{_mandir}/man3/Test::Harness* + +# Test-Simple +%exclude %{privlib}/ok* +%exclude %dir %{privlib}/Test +%exclude %{privlib}/Test/More* +%exclude %{privlib}/Test/Builder* +%exclude %{privlib}/Test/Tester* +%exclude %{privlib}/Test/Simple* +%exclude %{privlib}/Test/Tutorial* +%exclude %{privlib}/Test/use +%exclude %{_mandir}/man3/ok* +%exclude %{_mandir}/man3/Test::More* +%exclude %{_mandir}/man3/Test::Builder* +%exclude %{_mandir}/man3/Test::Tester* +%exclude %{_mandir}/man3/Test::Simple* +%exclude %{_mandir}/man3/Test::Tutorial* +%exclude %{_mandir}/man3/Test::use::* + +# Text-Balanced +%exclude %{privlib}/Text/Balanced.pm +%exclude %{_mandir}/man3/Text::Balanced.* + +# Text-ParseWords +%exclude %{privlib}/Text/ParseWords.pm +%exclude %{_mandir}/man3/Text::ParseWords.* + +# Text-Tabs+Wrap +%exclude %{privlib}/Text/Tabs.pm +%exclude %{privlib}/Text/Wrap.pm +%exclude %{_mandir}/man3/Text::Tabs.* +%exclude %{_mandir}/man3/Text::Wrap.* + +# Thread-Queue +%exclude %{privlib}/Thread/Queue.pm +%exclude %{_mandir}/man3/Thread::Queue.* + +# Time-HiRes +%exclude %dir %{archlib}/Time +%exclude %{archlib}/Time/HiRes.pm +%exclude %dir %{archlib}/auto/Time +%exclude %{archlib}/auto/Time/HiRes +%exclude %{_mandir}/man3/Time::HiRes.* + +# Time-Local +%exclude %{privlib}/Time/Local.pm +%exclude %{_mandir}/man3/Time::Local.* + +# Time-Piece +%exclude %dir %{archlib}/Time +%exclude %{archlib}/Time/Piece.pm +%exclude %{archlib}/Time/Seconds.pm +%exclude %dir %{archlib}/auto/Time +%exclude %{archlib}/auto/Time/Piece +%exclude %{_mandir}/man3/Time::Piece.3* +%exclude %{_mandir}/man3/Time::Seconds.3* + +# Socket +%exclude %dir %{archlib}/auto/Socket +%exclude %{archlib}/auto/Socket/Socket.* +%exclude %{archlib}/Socket.pm +%exclude %{_mandir}/man3/Socket.3* + +# threads +%dir %exclude %{archlib}/auto/threads +%exclude %{archlib}/auto/threads/threads* +%exclude %{archlib}/threads.pm +%exclude %{_mandir}/man3/threads.3* + +# threads-shared +%exclude %{archlib}/auto/threads/shared* +%exclude %dir %{archlib}/threads +%exclude %{archlib}/threads/shared* +%exclude %{_mandir}/man3/threads::shared* + +# Unicode-Collate +%dir %exclude %{archlib}/auto/Unicode +%exclude %{archlib}/auto/Unicode/Collate +%dir %exclude %{archlib}/Unicode +%exclude %{archlib}/Unicode/Collate +%exclude %{archlib}/Unicode/Collate.pm +%exclude %{privlib}/Unicode/Collate +%exclude %{_mandir}/man3/Unicode::Collate.* +%exclude %{_mandir}/man3/Unicode::Collate::* + +# Unicode-Normalize +%exclude %{archlib}/auto/Unicode/Normalize +%exclude %{archlib}/Unicode/Normalize.pm +%exclude %{_mandir}/man3/Unicode::Normalize.* + +# version +%exclude %{privlib}/version.pm +%exclude %{privlib}/version.pod +%exclude %{privlib}/version/ +%exclude %{_mandir}/man3/version.3* +%exclude %{_mandir}/man3/version::Internals.3* + +%files libs +%license Artistic Copying +%doc AUTHORS README Changes +%dir %{archlib} +%dir %{archlib}/auto +%{archlib}/auto/re +%dir %{archlib}/CORE +%{archlib}/CORE/libperl.so +%{archlib}/re.pm +%{_libdir}/libperl.so.* +%dir %{perl_vendorarch} +%dir %{perl_vendorarch}/auto +%dir %{privlib} +%{privlib}/integer.pm +%{privlib}/strict.pm +%{privlib}/unicore +%{privlib}/utf8.pm +%{privlib}/utf8_heavy.pl +%{privlib}/warnings.pm +%{privlib}/XSLoader.pm +%dir %{perl_vendorlib} +%{_mandir}/man3/integer.* +%{_mandir}/man3/re.* +%{_mandir}/man3/strict.* +%{_mandir}/man3/utf8.* +%{_mandir}/man3/warnings.* +%{_mandir}/man3/XSLoader.* + +%files devel +%{_bindir}/h2xs +%{_mandir}/man1/h2xs* +%{_bindir}/perlivp +%{_mandir}/man1/perlivp* +%{archlib}/CORE/*.h +%{_libdir}/libperl.so +%{_mandir}/man1/perlxs* +%if %{with perl_enables_systemtap} +%dir %{_datadir}/systemtap +%dir %{_datadir}/systemtap/tapset +%{tapsetdir}/%{libperl_stp} +%doc perl-example.stp +%endif + +%files macros +%{_rpmconfigdir}/macros.d/macros.perl + +%files tests +%{perl5_testdir}/ + +%files utils +%{_bindir}/c2ph +%{_bindir}/h2ph +%{_bindir}/perlbug +%{_bindir}/perlthanks +%{_bindir}/pl2pm +%{_bindir}/pstruct +%{_bindir}/splain +%dir %{privlib}/pod +%{privlib}/pod/perlutil.pod +%{_mandir}/man1/c2ph.* +%{_mandir}/man1/h2ph.* +%{_mandir}/man1/perlbug.* +%{_mandir}/man1/perlthanks.* +%{_mandir}/man1/perlutil.* +%{_mandir}/man1/pl2pm.* +%{_mandir}/man1/pstruct.* +%{_mandir}/man1/splain.* + +%if %{dual_life} || %{rebuild_from_scratch} +%files Archive-Tar +%{_bindir}/ptar +%{_bindir}/ptardiff +%{_bindir}/ptargrep +%dir %{privlib}/Archive +%{privlib}/Archive/Tar +%{privlib}/Archive/Tar.pm +%{_mandir}/man1/ptar.1* +%{_mandir}/man1/ptardiff.1* +%{_mandir}/man1/ptargrep.1* +%{_mandir}/man3/Archive::Tar* +%endif + +%files Attribute-Handlers +%{privlib}/Attribute +%{_mandir}/man3/Attribute::Handlers.* + +%if %{dual_life} || %{rebuild_from_scratch} +%files autodie +%{privlib}/autodie/ +%{privlib}/autodie.pm +%{privlib}/Fatal.pm +%{_mandir}/man3/autodie.3* +%{_mandir}/man3/autodie::* +%{_mandir}/man3/Fatal.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files B-Debug +%dir %{privlib}/B +%{privlib}/B/Debug.pm +%{_mandir}/man3/B::Debug.3* + +%files bignum +%{privlib}/bigint.pm +%{privlib}/bignum.pm +%{privlib}/bigrat.pm +%dir %{privlib}/Math +%{privlib}/Math/BigFloat +%dir %{privlib}/Math/BigInt +%{privlib}/Math/BigInt/Trace.pm +%{_mandir}/man3/bigint.* +%{_mandir}/man3/bignum.* +%{_mandir}/man3/bigrat.* + +%files Carp +%{privlib}/Carp +%{privlib}/Carp.* +%{_mandir}/man3/Carp.* + +%files Compress-Raw-Bzip2 +%dir %{archlib}/Compress +%dir %{archlib}/Compress/Raw +%{archlib}/Compress/Raw/Bzip2.pm +%dir %{archlib}/auto/Compress +%dir %{archlib}/auto/Compress/Raw +%{archlib}/auto/Compress/Raw/Bzip2 +%{_mandir}/man3/Compress::Raw::Bzip2* + +%files Compress-Raw-Zlib +%dir %{archlib}/Compress +%dir %{archlib}/Compress/Raw +%{archlib}/Compress/Raw/Zlib.pm +%dir %{archlib}/auto/Compress +%dir %{archlib}/auto/Compress/Raw +%{archlib}/auto/Compress/Raw/Zlib +%{_mandir}/man3/Compress::Raw::Zlib* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Config-Perl-V +%dir %{privlib}/Config +%{privlib}/Config/Perl +%{_mandir}/man3/Config::Perl::V.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files constant +%{privlib}/constant.pm +%{_mandir}/man3/constant.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files CPAN +%{_bindir}/cpan +%dir %{privlib}/App +%{privlib}/App/Cpan.pm +%{privlib}/CPAN +%{privlib}/CPAN.pm +%{_mandir}/man1/cpan.1* +%{_mandir}/man3/App::Cpan.* +%{_mandir}/man3/CPAN.* +%{_mandir}/man3/CPAN:* +%exclude %{privlib}/CPAN/Meta/ +%exclude %{privlib}/CPAN/Meta.pm +%exclude %{_mandir}/man3/CPAN::Meta* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files CPAN-Meta +%dir %{privlib}/CPAN/Meta +%{privlib}/CPAN/Meta.pm +%{privlib}/CPAN/Meta/Converter.pm +%{privlib}/CPAN/Meta/Feature.pm +%dir %{privlib}/CPAN/Meta/History +%{privlib}/CPAN/Meta/History.pm +%{privlib}/CPAN/Meta/Merge.pm +%{privlib}/CPAN/Meta/Prereqs.pm +%{privlib}/CPAN/Meta/Spec.pm +%{privlib}/CPAN/Meta/Validator.pm +%{_mandir}/man3/CPAN::Meta* +%exclude %{_mandir}/man3/CPAN::Meta::YAML* +%exclude %{_mandir}/man3/CPAN::Meta::Requirements* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files CPAN-Meta-Requirements +%dir %{privlib}/CPAN +%dir %{privlib}/CPAN/Meta +%{privlib}/CPAN/Meta/Requirements.pm +%{_mandir}/man3/CPAN::Meta::Requirements.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files CPAN-Meta-YAML +%dir %{privlib}/CPAN +%dir %{privlib}/CPAN/Meta +%{privlib}/CPAN/Meta/YAML.pm +%{_mandir}/man3/CPAN::Meta::YAML* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Data-Dumper +%dir %{archlib}/auto/Data +%dir %{archlib}/auto/Data/Dumper +%{archlib}/auto/Data/Dumper/Dumper.so +%dir %{archlib}/Data +%{archlib}/Data/Dumper.pm +%{_mandir}/man3/Data::Dumper.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files DB_File +%{archlib}/DB_File.pm +%dir %{archlib}/auto/DB_File +%{archlib}/auto/DB_File/DB_File.so +%{_mandir}/man3/DB_File* +%endif + +%files Devel-Peek +%dir %{archlib}/Devel +%{archlib}/Devel/Peek.pm +%dir %{archlib}/auto/Devel +%{archlib}/auto/Devel/Peek +%{_mandir}/man3/Devel::Peek.* + +%if %{dual_life} || %{rebuild_from_scratch} +%files Devel-PPPort +%dir %{archlib}/Devel +%{archlib}/Devel/PPPort.pm +%{_mandir}/man3/Devel::PPPort.3* +%endif + +%files Devel-SelfStubber +%dir %{privlib}/Devel +%{privlib}/Devel/SelfStubber.pm +%{_mandir}/man3/Devel::SelfStubber.* + +%if %{dual_life} || %{rebuild_from_scratch} +%files Digest +%{privlib}/Digest.pm +%dir %{privlib}/Digest +%{privlib}/Digest/base.pm +%{privlib}/Digest/file.pm +%{_mandir}/man3/Digest.3* +%{_mandir}/man3/Digest::base.3* +%{_mandir}/man3/Digest::file.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Digest-MD5 +%dir %{archlib}/Digest +%{archlib}/Digest/MD5.pm +%dir %{archlib}/auto/Digest +%{archlib}/auto/Digest/MD5 +%{_mandir}/man3/Digest::MD5.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Digest-SHA +%{_bindir}/shasum +%dir %{archlib}/Digest +%{archlib}/Digest/SHA.pm +%dir %{archlib}/auto/Digest +%{archlib}/auto/Digest/SHA +%{_mandir}/man1/shasum.1* +%{_mandir}/man3/Digest::SHA.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Encode +%{_bindir}/encguess +%{_bindir}/piconv +%{archlib}/Encode* +%{archlib}/auto/Encode* +%{privlib}/Encode +%exclude %{privlib}/Encode/*.e2x +%exclude %{privlib}/Encode/encode.h +%{_mandir}/man1/encguess.1* +%{_mandir}/man1/piconv.1* +%{_mandir}/man3/Encode*.3* + +%files encoding +%{archlib}/encoding.pm +%{_mandir}/man3/encoding.3* + +%files Encode-devel +%{_bindir}/enc2xs +%dir %{privlib}/Encode +%{privlib}/Encode/*.e2x +%{privlib}/Encode/encode.h +%{_mandir}/man1/enc2xs.1* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Env +%{privlib}/Env.pm +%{_mandir}/man3/Env.3* +%endif + +%files Errno +%{archlib}/Errno.pm +%{_mandir}/man3/Errno.* + +%if %{dual_life} || %{rebuild_from_scratch} +%files Exporter +%{privlib}/Exporter* +%{_mandir}/man3/Exporter* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files experimental +%{privlib}/experimental* +%{_mandir}/man3/experimental* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files ExtUtils-CBuilder +%dir %{privlib}/ExtUtils +%{privlib}/ExtUtils/CBuilder +%{privlib}/ExtUtils/CBuilder.pm +%{_mandir}/man3/ExtUtils::CBuilder* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files ExtUtils-Command +%dir %{privlib}/ExtUtils +%{privlib}/ExtUtils/Command.pm +%{_mandir}/man3/ExtUtils::Command.* +%endif + +%files ExtUtils-Embed +%dir %{privlib}/ExtUtils +%{privlib}/ExtUtils/Embed.pm +%{_mandir}/man3/ExtUtils::Embed* + +%if %{dual_life} || %{rebuild_from_scratch} +%files ExtUtils-Install +%dir %{privlib}/ExtUtils +%{privlib}/ExtUtils/Install.pm +%{privlib}/ExtUtils/Installed.pm +%{privlib}/ExtUtils/Packlist.pm +%{_mandir}/man3/ExtUtils::Install.3* +%{_mandir}/man3/ExtUtils::Installed.3* +%{_mandir}/man3/ExtUtils::Packlist.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files ExtUtils-Manifest +%dir %{privlib}/ExtUtils +%{privlib}/ExtUtils/Manifest.pm +%{privlib}/ExtUtils/MANIFEST.SKIP +%{_mandir}/man3/ExtUtils::Manifest.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files ExtUtils-MakeMaker +%{_bindir}/instmodsh +%dir %{privlib}/ExtUtils +%{privlib}/ExtUtils/Command/ +%{privlib}/ExtUtils/Liblist +%{privlib}/ExtUtils/Liblist.pm +%{privlib}/ExtUtils/MakeMaker +%{privlib}/ExtUtils/MakeMaker.pm +%{privlib}/ExtUtils/MM.pm +%{privlib}/ExtUtils/MM_*.pm +%{privlib}/ExtUtils/MY.pm +%{privlib}/ExtUtils/Mkbootstrap.pm +%{privlib}/ExtUtils/Mksymlists.pm +%{privlib}/ExtUtils/testlib.pm +%{_mandir}/man1/instmodsh.1* +%{_mandir}/man3/ExtUtils::Command::MM* +%{_mandir}/man3/ExtUtils::Liblist.3* +%{_mandir}/man3/ExtUtils::MM.3* +%{_mandir}/man3/ExtUtils::MM_* +%{_mandir}/man3/ExtUtils::MY.3* +%{_mandir}/man3/ExtUtils::MakeMaker* +%{_mandir}/man3/ExtUtils::Mkbootstrap.3* +%{_mandir}/man3/ExtUtils::Mksymlists.3* +%{_mandir}/man3/ExtUtils::testlib.3* +%endif + +%files ExtUtils-Miniperl +%dir %{privlib}/ExtUtils +%{privlib}/ExtUtils/Miniperl.pm +%{_mandir}/man3/ExtUtils::Miniperl.3* + +%if %{dual_life} || %{rebuild_from_scratch} +%files ExtUtils-MM-Utils +%dir %{privlib}/ExtUtils +%dir %{privlib}/ExtUtils/MM +%{privlib}/ExtUtils/MM/Utils.pm +%{_mandir}/man3/ExtUtils::MM::Utils.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files ExtUtils-ParseXS +%dir %{privlib}/ExtUtils +%dir %{privlib}/ExtUtils/ParseXS +%{privlib}/ExtUtils/ParseXS.pm +%{privlib}/ExtUtils/ParseXS.pod +%{privlib}/ExtUtils/ParseXS/Constants.pm +%{privlib}/ExtUtils/ParseXS/CountLines.pm +%{privlib}/ExtUtils/ParseXS/Eval.pm +%{privlib}/ExtUtils/ParseXS/Utilities.pm +%dir %{privlib}/ExtUtils/Typemaps +%{privlib}/ExtUtils/Typemaps.pm +%{privlib}/ExtUtils/Typemaps/Cmd.pm +%{privlib}/ExtUtils/Typemaps/InputMap.pm +%{privlib}/ExtUtils/Typemaps/OutputMap.pm +%{privlib}/ExtUtils/Typemaps/Type.pm +%{privlib}/ExtUtils/xsubpp +%{_bindir}/xsubpp +%{_mandir}/man1/xsubpp* +%{_mandir}/man3/ExtUtils::ParseXS.3* +%{_mandir}/man3/ExtUtils::ParseXS::Constants.3* +%{_mandir}/man3/ExtUtils::ParseXS::Eval.3* +%{_mandir}/man3/ExtUtils::ParseXS::Utilities.3* +%{_mandir}/man3/ExtUtils::Typemaps.3* +%{_mandir}/man3/ExtUtils::Typemaps::Cmd.3* +%{_mandir}/man3/ExtUtils::Typemaps::InputMap.3* +%{_mandir}/man3/ExtUtils::Typemaps::OutputMap.3* +%{_mandir}/man3/ExtUtils::Typemaps::Type.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files File-Fetch +%dir %{privlib}/File +%{privlib}/File/Fetch.pm +%{_mandir}/man3/File::Fetch.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files File-Path +%dir %{privlib}/File +%{privlib}/File/Path.pm +%{_mandir}/man3/File::Path.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files File-Temp +%dir %{privlib}/File +%{privlib}/File/Temp.pm +%{_mandir}/man3/File::Temp.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Filter +%dir %{archlib}/auto/Filter +%{archlib}/auto/Filter/Util +%dir %{archlib}/Filter +%{archlib}/Filter/Util +%{privlib}/pod/perlfilter.pod +%{_mandir}/man1/perlfilter.* +%{_mandir}/man3/Filter::Util::* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Filter-Simple +%dir %{privlib}/Filter +%{privlib}/Filter/Simple.pm +%{_mandir}/man3/Filter::Simple.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Getopt-Long +%dir %{privlib}/Getopt +%{privlib}/Getopt/Long.pm +%{_mandir}/man3/Getopt::Long.3* +%endif + +%files IO +%dir %{archlib}/IO +%{archlib}/IO.pm +%{archlib}/IO/Dir.pm +%{archlib}/IO/File.pm +%{archlib}/IO/Handle.pm +%{archlib}/IO/Pipe.pm +%{archlib}/IO/Poll.pm +%{archlib}/IO/Seekable.pm +%{archlib}/IO/Select.pm +%dir %{archlib}/IO/Socket +%{archlib}/IO/Socket/INET.pm +%{archlib}/IO/Socket/UNIX.pm +%{archlib}/IO/Socket.pm +%dir %{archlib}/auto/IO +%{archlib}/auto/IO/IO.so +%{_mandir}/man3/IO.* +%{_mandir}/man3/IO::Dir.* +%{_mandir}/man3/IO::File.* +%{_mandir}/man3/IO::Handle.* +%{_mandir}/man3/IO::Pipe.* +%{_mandir}/man3/IO::Poll.* +%{_mandir}/man3/IO::Seekable.* +%{_mandir}/man3/IO::Select.* +%{_mandir}/man3/IO::Socket::INET.* +%{_mandir}/man3/IO::Socket::UNIX.* +%{_mandir}/man3/IO::Socket.* + +%if %{dual_life} || %{rebuild_from_scratch} +%files IO-Compress +# IO-Compress +%{_bindir}/zipdetails +%dir %{privlib}/IO +%dir %{privlib}/IO/Compress +%{privlib}/IO/Compress/FAQ.pod +%{_mandir}/man1/zipdetails.* +%{_mandir}/man3/IO::Compress::FAQ.* +# Compress-Zlib +%dir %{privlib}/Compress +%{privlib}/Compress/Zlib.pm +%{_mandir}/man3/Compress::Zlib* +#IO-Compress-Base +%dir %{privlib}/File +%{privlib}/File/GlobMapper.pm +%dir %{privlib}/IO +%dir %{privlib}/IO/Compress +%{privlib}/IO/Compress/Base +%{privlib}/IO/Compress/Base.pm +%dir %{privlib}/IO/Uncompress +%{privlib}/IO/Uncompress/AnyUncompress.pm +%{privlib}/IO/Uncompress/Base.pm +%{_mandir}/man3/File::GlobMapper.* +%{_mandir}/man3/IO::Compress::Base.* +%{_mandir}/man3/IO::Uncompress::AnyUncompress.* +%{_mandir}/man3/IO::Uncompress::Base.* +# IO-Compress-Zlib +%dir %{privlib}/IO +%dir %{privlib}/IO/Compress +%{privlib}/IO/Compress/Adapter +%{privlib}/IO/Compress/Deflate.pm +%{privlib}/IO/Compress/Bzip2.pm +%{privlib}/IO/Compress/Gzip +%{privlib}/IO/Compress/Gzip.pm +%{privlib}/IO/Compress/RawDeflate.pm +%{privlib}/IO/Compress/Zip +%{privlib}/IO/Compress/Zip.pm +%{privlib}/IO/Compress/Zlib +%dir %{privlib}/IO/Uncompress +%{privlib}/IO/Uncompress/Adapter/ +%{privlib}/IO/Uncompress/AnyInflate.pm +%{privlib}/IO/Uncompress/Bunzip2.pm +%{privlib}/IO/Uncompress/Gunzip.pm +%{privlib}/IO/Uncompress/Inflate.pm +%{privlib}/IO/Uncompress/RawInflate.pm +%{privlib}/IO/Uncompress/Unzip.pm +%{_mandir}/man3/IO::Compress::Deflate* +%{_mandir}/man3/IO::Compress::Gzip* +%{_mandir}/man3/IO::Compress::Bzip2* +%{_mandir}/man3/IO::Compress::RawDeflate* +%{_mandir}/man3/IO::Compress::Zip* +%{_mandir}/man3/IO::Uncompress::AnyInflate* +%{_mandir}/man3/IO::Uncompress::Bunzip2* +%{_mandir}/man3/IO::Uncompress::Gunzip* +%{_mandir}/man3/IO::Uncompress::Inflate* +%{_mandir}/man3/IO::Uncompress::RawInflate* +%{_mandir}/man3/IO::Uncompress::Unzip* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files IO-Socket-IP +%dir %{privlib}/IO +%dir %{privlib}/IO/Socket +%{privlib}/IO/Socket/IP.pm +%{_mandir}/man3/IO::Socket::IP.* +%endif + +%files IO-Zlib +%dir %{privlib}/IO +%{privlib}/IO/Zlib.pm +%{_mandir}/man3/IO::Zlib.* + +%if %{dual_life} || %{rebuild_from_scratch} +%files HTTP-Tiny +%dir %{privlib}/HTTP +%{privlib}/HTTP/Tiny.pm +%{_mandir}/man3/HTTP::Tiny* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files IPC-Cmd +%dir %{privlib}/IPC +%{privlib}/IPC/Cmd.pm +%{_mandir}/man3/IPC::Cmd.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files IPC-SysV +%{archlib}/auto/IPC +%dir %{archlib}/IPC +%{archlib}/IPC/Msg.pm +%{archlib}/IPC/Semaphore.pm +%{archlib}/IPC/SharedMem.pm +%{archlib}/IPC/SysV.pm +%{_mandir}/man3/IPC::Msg.* +%{_mandir}/man3/IPC::Semaphore.* +%{_mandir}/man3/IPC::SharedMem.* +%{_mandir}/man3/IPC::SysV.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files JSON-PP +%{_bindir}/json_pp +%dir %{privlib}/JSON +%{privlib}/JSON/PP +%{privlib}/JSON/PP.pm +%{_mandir}/man1/json_pp.1* +%{_mandir}/man3/JSON::PP.3* +%{_mandir}/man3/JSON::PP::Boolean.3pm* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files libnet +%dir %{privlib}/Net +%{privlib}/Net/Cmd.pm +%{privlib}/Net/Config.pm +%{privlib}/Net/Domain.pm +%{privlib}/Net/FTP +%{privlib}/Net/FTP.pm +%{privlib}/Net/libnetFAQ.pod +%{privlib}/Net/NNTP.pm +%{privlib}/Net/Netrc.pm +%{privlib}/Net/POP3.pm +%{privlib}/Net/SMTP.pm +%{privlib}/Net/Time.pm +%{_mandir}/man3/Net::Cmd.* +%{_mandir}/man3/Net::Config.* +%{_mandir}/man3/Net::Domain.* +%{_mandir}/man3/Net::FTP.* +%{_mandir}/man3/Net::libnetFAQ.* +%{_mandir}/man3/Net::NNTP.* +%{_mandir}/man3/Net::Netrc.* +%{_mandir}/man3/Net::POP3.* +%{_mandir}/man3/Net::SMTP.* +%{_mandir}/man3/Net::Time.* +%endif + +%files libnetcfg +%{_bindir}/libnetcfg +%{_mandir}/man1/libnetcfg* + +%if %{dual_life} || %{rebuild_from_scratch} +%files Locale-Codes +%dir %{privlib}/Locale +%{privlib}/Locale/Codes +%{privlib}/Locale/Codes.* +%{privlib}/Locale/Country.* +%{privlib}/Locale/Currency.* +%{privlib}/Locale/Language.* +%{privlib}/Locale/Script.* +%{_mandir}/man3/Locale::Codes::* +%{_mandir}/man3/Locale::Codes.* +%{_mandir}/man3/Locale::Country.* +%{_mandir}/man3/Locale::Currency.* +%{_mandir}/man3/Locale::Language.* +%{_mandir}/man3/Locale::Script.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Locale-Maketext +%dir %{privlib}/Locale +%dir %{privlib}/Locale/Maketext +%{privlib}/Locale/Maketext.* +%{privlib}/Locale/Maketext/Cookbook.* +%{privlib}/Locale/Maketext/Guts.* +%{privlib}/Locale/Maketext/GutsLoader.* +%{privlib}/Locale/Maketext/TPJ13.* +%{_mandir}/man3/Locale::Maketext.* +%{_mandir}/man3/Locale::Maketext::Cookbook.* +%{_mandir}/man3/Locale::Maketext::Guts.* +%{_mandir}/man3/Locale::Maketext::GutsLoader.* +%{_mandir}/man3/Locale::Maketext::TPJ13.* +%endif + +%files Locale-Maketext-Simple +%dir %{privlib}/Locale +%dir %{privlib}/Locale/Maketext +%{privlib}/Locale/Maketext/Simple.pm +%{_mandir}/man3/Locale::Maketext::Simple.* + +%if %{dual_life} || %{rebuild_from_scratch} +%files Math-BigInt +%dir %{privlib}/Math +%{privlib}/Math/BigFloat.pm +%{privlib}/Math/BigInt.pm +%dir %{privlib}/Math/BigInt +%{privlib}/Math/BigInt/Calc.pm +%{privlib}/Math/BigInt/CalcEmu.pm +%{_mandir}/man3/Math::BigFloat.* +%{_mandir}/man3/Math::BigInt.* +%{_mandir}/man3/Math::BigInt::Calc.* +%{_mandir}/man3/Math::BigInt::CalcEmu.* + +%files Math-BigInt-FastCalc +%{archlib}/Math +%{archlib}/auto/Math +%{_mandir}/man3/Math::BigInt::FastCalc.* + +%files Math-BigRat +%dir %{privlib}/Math +%{privlib}/Math/BigRat.pm +%{_mandir}/man3/Math::BigRat.* +%endif + +%files Math-Complex +%dir %{privlib}/Math +%{privlib}/Math/Complex.pm +%{privlib}/Math/Trig.pm +%{_mandir}/man3/Math::Complex.* +%{_mandir}/man3/Math::Trig.* + +%files Memoize +%{privlib}/Memoize +%{privlib}/Memoize.pm +%{_mandir}/man3/Memoize::* +%{_mandir}/man3/Memoize.* + +%if %{dual_life} || %{rebuild_from_scratch} +%files MIME-Base64 +%{archlib}/auto/MIME +%{archlib}/MIME +%{_mandir}/man3/MIME::* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Module-CoreList +%dir %{privlib}/Module +%{privlib}/Module/CoreList +%{privlib}/Module/CoreList.pm +%{privlib}/Module/CoreList.pod +%{_mandir}/man3/Module::CoreList* + +%files Module-CoreList-tools +%{_bindir}/corelist +%{_mandir}/man1/corelist* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Module-Load +%dir %{privlib}/Module +%{privlib}/Module/Load.pm +%{_mandir}/man3/Module::Load.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Module-Load-Conditional +%dir %{privlib}/Module +%{privlib}/Module/Load +%{_mandir}/man3/Module::Load::Conditional* +%endif + +%files Module-Loaded +%dir %{privlib}/Module +%{privlib}/Module/Loaded.pm +%{_mandir}/man3/Module::Loaded* + +%if %{dual_life} || %{rebuild_from_scratch} +%files Module-Metadata +%dir %{privlib}/Module +%{privlib}/Module/Metadata.pm +%{_mandir}/man3/Module::Metadata.3pm* +%endif + +%files Net-Ping +%dir %{privlib}/Net +%{privlib}/Net/Ping.pm +%{_mandir}/man3/Net::Ping.* + +%if %{dual_life} || %{rebuild_from_scratch} +%files PathTools +%{archlib}/Cwd.pm +%dir %{archlib}/File +%{archlib}/File/Spec* +%{archlib}/auto/Cwd +%{_mandir}/man3/Cwd* +%{_mandir}/man3/File::Spec* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Params-Check +%{privlib}/Params/ +%{_mandir}/man3/Params::Check* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Parse-CPAN-Meta +%dir %{privlib}/Parse/ +%dir %{privlib}/Parse/CPAN/ +%{privlib}/Parse/CPAN/Meta.pm +%{_mandir}/man3/Parse::CPAN::Meta.3* +%endif + +%files open +%{privlib}/open.pm +%{_mandir}/man3/open.3* + +%if %{dual_life} || %{rebuild_from_scratch} +%files parent +%{privlib}/parent.pm +%{_mandir}/man3/parent.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files perlfaq +%{privlib}/perlfaq.pm +%dir %{privlib}/pod +%{privlib}/pod/perlfaq* +%{privlib}/pod/perlglossary.pod +%{_mandir}/man1/perlfaq* +%{_mandir}/man1/perlglossary.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files PerlIO-via-QuotedPrint +%{privlib}/PerlIO +%{_mandir}/man3/PerlIO::via::QuotedPrint.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Perl-OSType +%dir %{privlib}/Perl +%{privlib}/Perl/OSType.pm +%{_mandir}/man3/Perl::OSType.3pm* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Pod-Checker +%{_bindir}/podchecker +%dir %{privlib}/Pod +%{privlib}/Pod/Checker.pm +%{_mandir}/man1/podchecker.* +%{_mandir}/man3/Pod::Checker.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Pod-Escapes +%dir %{privlib}/Pod +%{privlib}/Pod/Escapes.pm +%{_mandir}/man3/Pod::Escapes.* +%endif + +%files Pod-Html +%license Pod-Html-license-clarification +%dir %{privlib}/Pod +%{_bindir}/pod2html +%{privlib}/Pod/Html.pm +%{_mandir}/man1/pod2html.1* +%{_mandir}/man3/Pod::Html.* + +%if %{dual_life} || %{rebuild_from_scratch} +%files Pod-Parser +%{_bindir}/podselect +%dir %{privlib}/Pod +%{privlib}/Pod/Find.pm +%{privlib}/Pod/InputObjects.pm +%{privlib}/Pod/ParseUtils.pm +%{privlib}/Pod/Parser.pm +%{privlib}/Pod/PlainText.pm +%{privlib}/Pod/Select.pm +%{_mandir}/man1/podselect.1* +%{_mandir}/man3/Pod::Find.* +%{_mandir}/man3/Pod::InputObjects.* +%{_mandir}/man3/Pod::ParseUtils.* +%{_mandir}/man3/Pod::Parser.* +%{_mandir}/man3/Pod::PlainText.* +%{_mandir}/man3/Pod::Select.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Pod-Perldoc +%{_bindir}/perldoc +%{privlib}/pod/perldoc.pod +%dir %{privlib}/Pod +%{privlib}/Pod/Perldoc +%{privlib}/Pod/Perldoc.pm +%{_mandir}/man1/perldoc.1* +%{_mandir}/man3/Pod::Perldoc* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Pod-Usage +%{_bindir}/pod2usage +%dir %{privlib}/Pod +%{privlib}/Pod/Usage.pm +%{_mandir}/man1/pod2usage.* +%{_mandir}/man3/Pod::Usage.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files podlators +%{_bindir}/pod2man +%{_bindir}/pod2text +%{privlib}/pod/perlpodstyle.pod +%dir %{privlib}/Pod +%{privlib}/Pod/Man.pm +%{privlib}/Pod/ParseLink.pm +%{privlib}/Pod/Text +%{privlib}/Pod/Text.pm +%{_mandir}/man1/pod2man.1* +%{_mandir}/man1/pod2text.1* +%{_mandir}/man1/perlpodstyle.1* +%{_mandir}/man3/Pod::Man* +%{_mandir}/man3/Pod::ParseLink* +%{_mandir}/man3/Pod::Text* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Pod-Simple +%dir %{privlib}/Pod +%{privlib}/Pod/Simple +%{privlib}/Pod/Simple.pm +%{privlib}/Pod/Simple.pod +%{_mandir}/man3/Pod::Simple* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Scalar-List-Utils +%{archlib}/List +%{archlib}/Scalar +%{archlib}/Sub +%{archlib}/auto/List +%{_mandir}/man3/List::Util* +%{_mandir}/man3/Scalar::Util* +%{_mandir}/man3/Sub::Util* +%endif + +%files SelfLoader +%{privlib}/SelfLoader.pm +%{_mandir}/man3/SelfLoader* + +%if %{dual_life} || %{rebuild_from_scratch} +%files Sys-Syslog +%dir %{archlib}/Sys +%{archlib}/Sys/Syslog.pm +%dir %{archlib}/auto/Sys +%{archlib}/auto/Sys/Syslog +%{_mandir}/man3/Sys::Syslog.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Socket +%dir %{archlib}/auto/Socket +%{archlib}/auto/Socket/Socket.* +%{archlib}/Socket.pm +%{_mandir}/man3/Socket.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Storable +%{archlib}/Storable.pm +%{archlib}/auto/Storable +%{_mandir}/man3/Storable.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Term-ANSIColor +%dir %{privlib}/Term +%{privlib}/Term/ANSIColor.pm +%{_mandir}/man3/Term::ANSIColor* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Term-Cap +%dir %{privlib}/Term +%{privlib}/Term/Cap.pm +%{_mandir}/man3/Term::Cap.* +%endif + +%files Test +%{privlib}/Test.pm +%{_mandir}/man3/Test.* + +%if %{dual_life} || %{rebuild_from_scratch} +%files Test-Harness +%{_bindir}/prove +%dir %{privlib}/App +%{privlib}/App/Prove* +%{privlib}/TAP* +%dir %{privlib}/Test +%{privlib}/Test/Harness* +%{_mandir}/man1/prove.1* +%{_mandir}/man3/App::Prove* +%{_mandir}/man3/TAP* +%{_mandir}/man3/Test::Harness* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Test-Simple +%{privlib}/ok* +%dir %{privlib}/Test +%{privlib}/Test/More* +%{privlib}/Test/Builder* +%{privlib}/Test/Tester* +%{privlib}/Test/Simple* +%{privlib}/Test/Tutorial* +%{privlib}/Test/use +%{_mandir}/man3/ok* +%{_mandir}/man3/Test::More* +%{_mandir}/man3/Test::Builder* +%{_mandir}/man3/Test::Tester* +%{_mandir}/man3/Test::Simple* +%{_mandir}/man3/Test::Tutorial* +%{_mandir}/man3/Test::use::* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Text-Balanced +%dir %{privlib}/Text +%{privlib}/Text/Balanced.pm +%{_mandir}/man3/Text::Balanced.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Text-ParseWords +%dir %{privlib}/Text +%{privlib}/Text/ParseWords.pm +%{_mandir}/man3/Text::ParseWords.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Text-Tabs+Wrap +%dir %{privlib}/Text +%{privlib}/Text/Tabs.pm +%{privlib}/Text/Wrap.pm +%{_mandir}/man3/Text::Tabs.* +%{_mandir}/man3/Text::Wrap.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Thread-Queue +%dir %{privlib}/Thread +%{privlib}/Thread/Queue.pm +%{_mandir}/man3/Thread::Queue.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Time-HiRes +%dir %{archlib}/Time +%{archlib}/Time/HiRes.pm +%dir %{archlib}/auto/Time +%{archlib}/auto/Time/HiRes +%{_mandir}/man3/Time::HiRes.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Time-Local +%dir %{privlib}/Time +%{privlib}/Time/Local.pm +%{_mandir}/man3/Time::Local.* +%endif + +%files Time-Piece +%dir %{archlib}/Time +%{archlib}/Time/Piece.pm +%{archlib}/Time/Seconds.pm +%dir %{archlib}/auto/Time +%{archlib}/auto/Time/Piece +%{_mandir}/man3/Time::Piece.3* +%{_mandir}/man3/Time::Seconds.3* + +%if %{dual_life} || %{rebuild_from_scratch} +%files threads +%dir %{archlib}/auto/threads +%{archlib}/auto/threads/threads* +%{archlib}/threads.pm +%{_mandir}/man3/threads.3* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files threads-shared +%dir %{archlib}/auto/threads +%{archlib}/auto/threads/shared* +%dir %{archlib}/threads +%{archlib}/threads/shared* +%{_mandir}/man3/threads::shared* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Unicode-Collate +%dir %{archlib}/auto/Unicode +%{archlib}/auto/Unicode/Collate +%dir %{archlib}/Unicode +%{archlib}/Unicode/Collate +%{archlib}/Unicode/Collate.pm +%dir %{privlib}/Unicode +%{privlib}/Unicode/Collate +%{_mandir}/man3/Unicode::Collate.* +%{_mandir}/man3/Unicode::Collate::* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files Unicode-Normalize +%dir %{archlib}/auto/Unicode +%{archlib}/auto/Unicode/Normalize +%dir %{archlib}/Unicode +%{archlib}/Unicode/Normalize.pm +%{_mandir}/man3/Unicode::Normalize.* +%endif + +%if %{dual_life} || %{rebuild_from_scratch} +%files version +%{privlib}/version.pm +%{privlib}/version.pod +%{privlib}/version/ +%{_mandir}/man3/version.3* +%{_mandir}/man3/version::Internals.3* +%endif + +%files core +# Nothing. Nada. Zilch. Zarro. Uh uh. Nope. Sorry. + +%files interpreter +# Empty on purpose. + +# Old changelog entries are preserved in CVS. +%changelog +* Mon Mar 25 2019 Jitka Plesnikova - 4:5.24.4-404 +- Fix annocheck failure by enabling hardening (bug #1636329) + +* Thu Feb 07 2019 Petr Pisar - 4:5.24.4-403 +- Require perl-interpreter from perl (bug #1670435) + +* Thu Jan 31 2019 Petr Pisar - 4:5.24.4-402 +- Add a dummy perl-interpreter package to mask non-modular one (bug #1670435) + +* Wed Dec 05 2018 Jitka Plesnikova - 4:5.24.4-401 +- Resolves: #1656293 + - Fix CVE-2018-18311 Integer overflow leading to buffer overflow + - Fix CVE-2018-18312 Heap-buffer-overflow write in regcomp.c + - Fix CVE-2018-18313 Heap-buffer-overflow read in regcomp.c + - Fix CVE-2018-18314 Heap-buffer-overflow write in regcomp.c + +* Fri Nov 02 2018 Petr Pisar - 4:5.24.4-400 +- Install Encode developmental files when installing complete Perl + (bug #1645225) + +* Tue Oct 02 2018 Jitka Plesnikova - 4:5.24.4-399 +- Fix annocheck failure by passing CFLAGS to dtrace (bug #1630617) + +* Mon Jul 09 2018 Petr Pisar - 4:5.24.4-398 +- Adjust tests to gdbm-1.15 (RT#133295) + +* Mon Apr 16 2018 Petr Pisar - 4:5.24.4-397 +- 5.24.4 bump +- Fix CVE-2018-6913 (heap buffer overflow in pp_pack.c) (bug #1567776) +- Fix CVE-2018-6798 (heap read overflow in regexec.c) (bug #1567777) +- Fix CVE-2018-6797 (heap write overflow in regcomp.c) (bug #1567778) + +* Tue Feb 06 2018 Petr Pisar - 4:5.24.3-396 +- Fix handling attribute specification on our variables (RT#131597) +- Remove invalid macro definitions from macros.perl (bug #1532539) +- Fix a crash when a match for inversely repeated group fails (RT#132017) +- Fix an overflow when parsing a character range with no preceding character + (RT#132245) +- Fix walking symbol table for ISA in Carp +- Fix handling file names with null bytes in stat and lstat functions + (RT#131895) +- Fix a crash when untying an object witout a stash +- Fix deparsing of transliterations with unprintable characters (RT#132405) +- Fix error reporting on do() on a directory (RT#125774) +- Fix stack manipulation when a lexical subroutine is defined in a do block in + a member of an iteration list (RT#132442) +- Fix setting $! when statting a closed filehandle (RT#108288) +- Fix tainting of s/// with overloaded replacement (RT#115266) +- Expand system() arguments before a fork (RT#121105) +- Avoid undefined behavior when copying memory in Glob and pp_caller (RT#131746) +- Add patch to conditionalize a fix for an old and long fixed bug + in libcrypt / glibc (rhbz#1536752) +- Link XS modules to pthread library to fix linking with -z defs +- Correct shell bangs in tests +- Fix parsing braced subscript after parentheses (RT#8045) +- Call ldconfig scriptlets using a macro + +* Mon Sep 25 2017 Jitka Plesnikova - 4:5.24.3-395 +- Update perl(:MODULE_COMPAT_*) + +* Mon Sep 25 2017 Jitka Plesnikova - 4:5.24.3-394 +- 5.24.3 bump (see + for release notes) + +* Mon Jul 17 2017 Jitka Plesnikova - 4:5.24.2-393 +- 5.24.2 bump (see + for release notes) + +* Mon Jun 19 2017 Petr Pisar - 4:5.24.1-392 +- Make File::Glob more resistant against degenerative matching (RT#131211) +- Fix a memory wrap in sv_vcatpvfn_flags() (RT#131260) +- Fix a crash when calling a subroutine from a stash (RT#131085) +- Fix an improper cast of a negative integer to an unsigned 8-bit type (RT#131190) +- Fix cloning :via handles on thread creation (RT#131221) +- Fix glob UTF-8 flag on a glob reassignment (RT#131263) +- Fix a buffer overflow in my_atof2() (RT#131526) +- Fix checks for tainted directory in $ENV{PATH} if a backslash escape presents +- Fix handling backslashes in PATH environment variable when executing + "perl -S" (RT#129183) +- Fix a conditional jump on uninitilized memory in re_intuit_start() (RT#131575) +- Fix spurious "Assuming NOT a POSIX class" warning (RT#131522) +- Provide perl-interpreter RPM dependency symbol + + +* Fri Mar 31 2017 Petr Pisar - 4:5.24.1-391 +- Introduce build-conditions for groff, systemtap, syslog tests, and tcsh + +* Wed Mar 08 2017 Petr Pisar - 4:5.24.1-390 +- Fix a null-pointer dereference on malformed code (RT#130815) +- Fix an use-after-free in substr() that modifies a magic variable (RT#129340) +- Fix a memory leak leak in Perl_reg_named_buff_fetch() (RT#130822) +- Fix an invalid memory read when parsing a loop variable (RT#130814) +- Fix a heap-use-after-free in four-arguments substr call (RT#130624) + +* Fri Feb 17 2017 Petr Pisar - 4:5.24.1-389 +- Adapt Compress::Raw::Zlib to zlib-1.2.11 (bug #1420326) +- Fix a heap buffer overflow when evaluating regexps with embedded code blocks + from more than one source (RT#129881) +- Fix a memory leak in list assignment from or to magic values (RT#130766) + +* Fri Feb 10 2017 Petr Pisar - 4:5.24.1-388 +- Adapt tests to zlib-1.2.11 (bug #1420326) +- Fix a crash when compiling a regexp with impossible quantifiers (RT#130561) +- Fix a buffer overrun with format and "use bytes" (RT#130703) +- Fix a buffer overflow when studying some regexps repeatedly + (RT#129281, RT#129061) + +* Thu Jan 26 2017 Petr Pisar - 4:5.24.1-387 +- Fix UTF-8 string handling in & operator (RT#129287) +- Fix recreation of *:: (RT#129869) +- Fix a memory leak in B::RHE->HASH method (RT#130504) +- Fix parsing goto statements in multicalled subroutine (RT#113938) +- Fix a heap overlow in parsing $# (RT#129274) + +* Fri Jan 20 2017 Petr Pisar - 4:5.24.1-386 +- Fix a buffer overflow in split in scalar context (RT#130262) +- Fix a heap overflow with pack "W" (RT129149) +- Fix a use-after-free when processing scalar variables in forms (RT#129125) +- Fix a heap overflow if invalid octal or hexadecimal number is used in + transliteration expression (RT#129342) +- Fix out-of-bound read in case of unmatched regexp backreference (RT#129377) + +* Mon Jan 16 2017 Jitka Plesnikova - 4:5.24.1-385 +- 5.24.1 bump (see + for release notes) + +* Thu Jan 12 2017 Igor Gnatenko - 4:5.24.0-384 +- Rebuild for readline 7.x + +* Fri Jan 06 2017 Petr Pisar - 4:5.24.0-383 +- Remove bundled Math-BigInt-FastCalc (bug #1408463) +- Remove bundled Math-BigRat (bug #1408467) +- Remove bundled bignum (bug #1409585) + +* Mon Dec 19 2016 Petr Pisar - 4:5.24.0-382 +- Fix a crash in optimized evaluation of "or ((0) x 0))" (RT#130247) +- Fix a memory leak in IO::Poll (RT#129788) +- Fix regular expression matching (RT#130307) + +* Thu Dec 01 2016 Petr Pisar - 4:5.24.0-381 +- Fix crash in Storable when deserializing malformed code reference + (RT#68348, RT#130098) +- Fix crash on explicit return from regular expression substitution (RT#130188) +- Tighten dependencies between architecture specific sub-packages to ISA +- Fix assigning split() return values to an array +- Fix const correctness in hv_func.h (bug #1242980) + +* Wed Nov 09 2016 Petr Pisar - 4:5.24.0-380 +- Tie perl-Errno release to interpreter build because of kernel version check + (bug #1393421) + +* Thu Nov 03 2016 Petr Pisar - 4:5.24.0-379 +- Fix crash in "evalbytes S" (RT#129196) +- Fix crash in splice (RT#129164, RT#129166, RT#129167) +- Fix string overrun in Perl_gv_fetchmethod_pvn_flags (RT#129267) +- Fix crash when matching UTF-8 string with non-UTF-8 substrings (RT#129350) +- Fix parsing perl options in shell bang line (RT#129336) +- Fix firstchar bitmap under UTF-8 with prefix optimization (RT#129950) +- Avoid infinite loop in h2xs tool if enum and type have the same name + (RT130001) +- Fix stack handling when calling chdir without an argument (RT#129130) + +* Fri Sep 02 2016 Petr Pisar - 4:5.24.0-378 +- perl-core depends on Parse::CPAN::Meta module instead of package name to allow + upgrading perl-CPAN-Meta to 2.150010 (bug #1370681) + +* Tue Aug 02 2016 Jitka Plesnikova - 4:5.24.0-377 +- Avoid loading of modules from current directory, CVE-2016-1238, (bug #1360425) + +* Thu Jul 28 2016 Petr Pisar - 4:5.24.0-376 +- Fix handling \N{} in tr for characters in range 128--255 (RT#128734) + +* Tue Jul 26 2016 Petr Pisar - 4:5.24.0-375 +- Fix building without perl in the build root +- Own systemtap directories by perl-devel + +* Tue Jul 12 2016 Petr Pisar - 4:5.24.0-374 +- Fix a crash in lexical scope warnings (RT#128597) + +* Fri Jul 08 2016 Petr Pisar - 4:5.24.0-373 +- Fix a crash in "Subroutine redefined" warning (RT#128257) + +* Thu Jul 07 2016 Petr Pisar - 4:5.24.0-372 +- Fix a crash when vivifying a stub in a deleted package (RT#128532) + +* Thu Jul 07 2016 Jitka Plesnikova - 4:5.24.0-371 +- Do not let XSLoader load relative paths (CVE-2016-6185) + +* Mon Jul 04 2016 Petr Pisar - 4:5.24.0-370 +- Fix line numbers with perl -x (RT#128508) + +* Fri Jun 24 2016 Petr Pisar - 4:5.24.0-369 +- Do not crash when inserting a non-stash into a stash (RT#128238) + +* Wed Jun 22 2016 Petr Pisar - 4:5.24.0-368 +- Do not use unitialized memory in $h{\const} warnings (RT#128189) +- Fix precedence in hv_ename_delete (RT#128086) +- Do not treat %: as a stash (RT#128238) + +* Mon Jun 20 2016 Petr Pisar - 4:5.24.0-367 +- Fix compiling regular expressions like /\X*(?0)/ (RT#128109) + +* Thu Jun 16 2016 Petr Pisar - 4:5.24.0-366 +- Do not mangle errno from failed socket calls (RT#128316) + +* Tue Jun 14 2016 Petr Pisar - 4:5.24.0-365 +- Fix a memory leak when compiling a regular expression with a POSIX class + (RT#128313) + +* Thu May 19 2016 Petr Pisar - 4:5.24.0-364 +- Remove reflexive dependencies +- Use pregenerated dependencies on bootstrapping +- Specify more build-time dependencies + +* Wed May 18 2016 Jitka Plesnikova - 4:5.24.0-363 +- Stop providing old perl(MODULE_COMPAT_5.22.*) +- Update license tags + +* Wed May 11 2016 Jitka Plesnikova - 4:5.24.0-362 +- 5.24.0 bump (see + for release notes) +- Update sub-packages; Update or remove patches + +* Mon May 02 2016 Jitka Plesnikova - 4:5.22.6-361 +- 5.22.2 bump (see + for release notes) + +* Mon Apr 18 2016 Petr Pisar - 4:5.22.1-360 +- Weak perl-Encode-devel dependency on perl-devel to Recommends level + (bug #1129443) +- Remove perl-ExtUtils-ParseXS dependency on perl-devel (bug #1129443) +- Require perl-devel by perl-ExtUtils-MakeMaker +- Provide MM::maybe_command independently (bug #1129443) +- Replace ExtUtils::MakeMaker dependency with ExtUtils::MM::Utils in IPC::Cmd + (bug #1129443) +- Remove perl-ExtUtils-Install dependency on perl-devel (bug #1129443) +- Remove perl-ExtUtils-Manifest dependency on perl-devel (bug #1129443) + +* Tue Mar 15 2016 Petr Pisar - 4:5.22.1-359 +- Do not filter FCGI dependency, CGI is non-core now + +* Fri Mar 04 2016 Petr Pisar - 4:5.22.1-358 +- Remove bundled perl-IPC-SysV (bug #1308527) + +* Wed Mar 02 2016 Petr Pisar - 4:5.22.1-357 +- Fix CVE-2016-2381 (ambiguous environment variables handling) (bug #1313702) + +* Thu Feb 04 2016 Fedora Release Engineering - 4:5.22.1-356 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Tue Dec 15 2015 Petr Pisar - 4:5.22.1-355 +- Remove bundled Math-BigInt (bug #1277203) + +* Mon Dec 14 2015 Jitka Plesnikova - 5.22.1-354 +- 5.22.1 bump (see + for release notes) + +* Tue Oct 20 2015 Petr Pisar - 4:5.22.0-353 +- Rebuild to utilize perl(:VERSION) dependency symbol + +* Tue Oct 13 2015 Petr Pisar - 4:5.22.0-352 +- Do not own IO::Socket::IP manual page by perl-IO + +* Fri Oct 09 2015 Petr Pisar - 4:5.22.0-351 +- Sub-package Attribute-Handlers +- Sub-package Devel-Peek +- Sub-package Devel-SelfStubber +- Sub-package SelfLoader +- Sub-package IO +- Sub-package Errno +- Correct perl-Digest-SHA dependencies +- Correct perl-Pod-Perldoc dependencies +- Move utf8 and dependencies to perl-libs +- Correct perl-devel and perl-CPAN dependencies +- Sub-package IPC-SysV +- Sub-package Test +- Sub-package utilities (splain) into perl-utils +- Provide perl version in perl(:VERSION) dependency symbol + +* Fri Aug 07 2015 Petr Pisar - 4:5.22.0-350 +- Sub-package Memoize +- Sub-package Net-Ping +- Sub-package Pod-Html + +* Thu Jul 16 2015 Petr Pisar - 4:5.22.0-349 +- Disable hardening due to some run-time failures (bug #1238804) + +* Mon Jul 13 2015 Petr Pisar - 4:5.22.0-348 +- Sub-package bignum +- Sub-package Math-BigRat +- Sub-package Math-BigInt-FastCalc +- Sub-package Math-Complex +- Remove bundled perl-Config-Perl-V (bug #1238203) +- Remove bundled perl-MIME-Base64 (bug #1238222) +- Remove bundled perl-PerlIO-via-QuotedPrint (bug #1238229) +- Remove bundled perl-Pod-Escapes (bug #1238237) +- Remove bundled perl-Term-Cap (bug #1238248) +- Remove bundled perl-Text-Balanced (bug #1238269) +- Remove bundled perl-libnet (bug #1238689) +- Remove bundled perl-perlfaq (bug #1238703) +- Remove bundled perl-Unicode-Normalize (bug #1238730) +- Remove bundled perl-Unicode-Collate (bug #1238760) + +* Wed Jul 08 2015 Petr Pisar - 4:5.22.0-347 +- Store distribution's linker and compiler flags to more Config's options + in order to apply them when linking executable programs (bug #1238804) +- Sub-package Config-Perl-V (bug #1238203) +- Sub-package MIME-Base64 (bug #1238222) +- Sub-package PerlIO-via-QuotedPrint (bug #1238229) +- Update Pod-Escapes metadata (bug #1238237) +- Sub-package Term-Cap (bug #1238248) +- Sub-package Text-Balanced (bug #1238269) +- Sub-package libnet (bug #1238689) +- Sub-package perlfaq (bug #1238703) +- Sub-package Unicode-Normalize (bug #1238730) +- Sub-package Unicode-Collate (bug #1238760) +- Sub-package Math-BigInt +- Do not provide Net/libnet.cfg (bug #1238689) +- Revert downstream change in Net::Config default configuration +- Move libnetcfg tool from perl-devel into perl-libnetcfg sub-package + +* Thu Jun 18 2015 Petr Pisar - 4:5.22.0-346 +- Subpackage "open" module in order to keep deprecated "encoding" module + optional (bug #1228378) +- Control building dual-lived sub-packages by perl_bootstrap macro +- Make PadlistNAMES() lvalue again (bug #1231165) +- Make magic vtable writable as a work-around for Coro (bug #1231165) +- Explain file break-down into RPM packages in perl package description + +* Thu Jun 18 2015 Fedora Release Engineering - 4:5.22.0-345 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Wed Jun 10 2015 Jitka Plesnikova - 4:5.22.0-244 +- Stop providing old perl(MODULE_COMPAT_5.20.*) + +* Thu Jun 04 2015 Jitka Plesnikova - 4:5.22.0-243 +- Move ok and Test::Use::ok to perl-Test-Simple + +* Wed Jun 03 2015 Jitka Plesnikova - 4:5.22.0-242 +- Move bin/encguess to perl-Encode + +* Mon Jun 01 2015 Jitka Plesnikova - 4:5.22.0-241 +- 5.22.0 bump (see + for release notes) +- Update sub-packages and erase the removed modules from the core +- Clean patches, not needed with new version +- Update patches to work with new version + +* Wed Apr 15 2015 Jitka Plesnikova - 4:5.20.2-328 +- Sub-package perl-CGI-Fast and perl-Module-Build-Deprecated +- Add missing dual-life modules to perl-core + +* Thu Apr 02 2015 Petr Šabata - 4:5.20.2-327 +- Bump to make koji happy + +* Thu Apr 02 2015 Petr Šabata - 4:5.20.2-326 +- Correct license tags of the main package, CGI, Compress-Raw-Zlib, + Digest-MD5, Test-Simple and Time-Piece +- Package a Pod-Html license clarification email + +* Wed Mar 25 2015 Petr Pisar - 4:5.20.2-325 +- Sub-package Text-Tabs+Wrap (bug #910798) + +* Thu Mar 19 2015 Lubomir Rintel - 4:5.20.2-324 +- Add systemtap probes for new dtrace markers + +* Mon Mar 16 2015 Petr Pisar - 4:5.20.2-323 +- Move perl(:MODULE_COMPAT_*) symbol and include directories to perl-libs + package (bug #1174951) + +* Sat Feb 21 2015 Till Maas - 4:5.20.2-322 +- Rebuilt for Fedora 23 Change + https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-independent_code + +* Wed Feb 18 2015 Jitka Plesnikova - 4:5.20.2-321 +- Provide 5.20.2 MODULE_COMPAT +- Clean list of provided files +- Update names of changed patches + +* Tue Feb 17 2015 Jitka Plesnikova - 4:5.20.2-320 +- 5.20.2 bump (see + for release notes) +- Regenerate a2p.c (BZ#1177672) + +* Mon Feb 16 2015 Petr Pisar - 4:5.20.1-319 +- Improve h2ph fix for GCC 5.0 + +* Thu Feb 12 2015 Petr Pisar - 4:5.20.1-318 +- Fix regressions with GCC 5.0 + +* Tue Feb 03 2015 Jitka Plesnikova - 4:5.20.1-317 +- Sub-package inc-latest module + +* Fri Jan 23 2015 Petr Pisar - 4:5.20.1-316 +- Delete dual-living programs clashing on debuginfo files (bug #878863) + +* Mon Dec 01 2014 Petr Pisar - 4:5.20.1-315 +- Report inaccesible file on failed require (bug #1166504) +- Use stronger algorithm needed for FIPS in t/op/taint.t (bug #1128032) + +* Wed Nov 19 2014 Petr Pisar - 4:5.20.1-314 +- Consider Filter::Util::Call dependency as mandatory (bug #1165183) +- Sub-package encoding module +- Own upper directories by each package that installs a file there and + remove empty directories (bug #1165013) + +* Thu Nov 13 2014 Petr Pisar - 4:5.20.1-313 +- Freeze epoch at perl-Pod-Checker and perl-Pod-Usage (bug #1163490) +- Remove bundled perl-ExtUtils-Command (bug #1158536) +- Remove bundled perl-Filter-Simple (bug #1158542) + +* Wed Nov 12 2014 Petr Pisar - 4:5.20.1-312 +- Do not double-own perl-Pod-Usage' and perl-Pod-Checker' files by + perl-Pod-Parser on bootstrap +- Sub-package ExtUtils-Command (bug #1158536) +- Sub-package Filter-Simple (bug #1158542) +- Build-require groff-base instead of big groff + +* Wed Oct 29 2014 Petr Pisar - 4:5.20.1-311 +- Remove bundled perl-Devel-PPPort (bug #1143999) +- Remove bundled perl-B-Debug (bug #1142952) +- Remove bundled perl-ExtUtils-CBuilder (bug #1144033) +- Remove bundled perl-ExtUtils-Install (bug #1144068) + +* Thu Oct 23 2014 Petr Pisar - 4:5.20.1-310 +- Move all Module-CoreList files into perl-Module-CoreList +- Sub-package corelist(1) into perl-Module-CoreList-tools (bug #1142757) +- Remove bundled perl-Module-CoreList, and perl-Module-CoreList-tools + (bug #1142757) +- Sub-package Devel-PPPort (bug #1143999) +- Sub-package B-Debug (bug #1142952) +- Use native version for perl-ExtUtils-CBuilder +- Specify all dependencies for perl-ExtUtils-Install (bug #1144068) +- Require perl-ExtUtils-ParseXS by perl-ExtUtils-MakeMaker because of xsubpp + +* Tue Sep 16 2014 Petr Šabata - 4:5.20.1-309 +- Provide 5.20.0 MODULE_COMPAT + +* Mon Sep 15 2014 Jitka Plesnikova - 4:5.20.1-308 +- 5.20.1 bump (see + for release notes) +- Sub-package perl-ExtUtils-Miniperl (bug #1141222) + +* Wed Sep 10 2014 Petr Pisar - 4:5.20.0-307 +- Specify all dependencies for perl-CPAN (bug #1090112) +- Disable non-core modules at perl-CPAN when bootstrapping +- Remove bundled perl-CPAN (bug #1090112) + +* Sun Sep 07 2014 Jitka Plesnikova - 4:5.20.0-306 +- Stop providing old perl(MODULE_COMPAT_5.18.*) + +* Mon Aug 18 2014 Jitka Plesnikova - 4:5.20.0-305 +- Update to Perl 5.20.0 +- Clean patches, not needed with new version +- Update patches to work with new version +- Update version of sub-packages, remove the deleted sub-packages +- Sub-package perl-IO-Socket-IP, perl-experimental +- Disable BR perl(local::lib) for cpan tool when bootstraping + +* Sun Aug 17 2014 Fedora Release Engineering - 4:5.18.2-304 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Fri Aug 08 2014 Petr Pisar - 4:5.18.2-303 +- Declare dependencies for cpan tool (bug #1122498) +- Use stronger algorithm needed for FIPS in t/op/crypt.t (bug #1128032) +- Make *DBM_File desctructors thread-safe (bug #1107543) + +* Tue Jul 29 2014 Jitka Plesnikova - 4:5.18.2-302 +- Sub-package perl-Term-ANSIColor and remove it (bug #1121924) + +* Fri Jun 27 2014 Petr Pisar - 4:5.18.2-301 +- Remove bundled perl-App-a2p, perl-App-find2perl, perl-App-s2p, and + perl-Package-Constants +- Correct perl-App-s2p license to ((GPL+ or Artistic) and App-s2p) + +* Thu Jun 19 2014 Petr Pisar - 4:5.18.2-300 +- Sub-package perl-App-find2perl (bug #1111196) +- Sub-package perl-App-a2p (bug #1111232) +- Sub-package perl-App-s2p (bug #1111242) + +* Sat Jun 07 2014 Fedora Release Engineering - 4:5.18.2-299 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Thu Apr 10 2014 Petr Pisar - 4:5.18.2-298 +- Pass -fwrapv to stricter GCC 4.9 (bug #1082957) + +* Fri Apr 04 2014 Petr Pisar - 4:5.18.2-297 +- Fix t/comp/parser.t not to load system modules (bug #1084399) + +* Mon Feb 03 2014 Petr Pisar - 4:5.18.2-296 +- Move macro files into %%{_rpmconfigdir}/macros.d + +* Wed Jan 29 2014 Petr Pisar - 4:5.18.2-295 +- Provide perl(CPAN::Meta::Requirements) with six decimal places + +* Tue Jan 21 2014 Petr Pisar - 4:5.18.2-294 +- Drop perl-Test-Simple-tests package is it is not delivered by dual-lived + version +- Hide dual-lived perl-Object-Accessor + +* Tue Jan 14 2014 Petr Pisar - 4:5.18.2-293 +- Use a macro to cover all 64-bit PowerPC architectures (bug #1052709) + +* Tue Jan 14 2014 Petr Pisar - 4:5.18.2-292 +- Use upstream patch to fix a test failure in perl5db.t when TERM=vt100 + +* Tue Dec 10 2013 Jitka Plesnikova - 4:5.18.2-291 +- 5.18.2 bump (see + for release notes) + +* Mon Dec 02 2013 Petr Pisar - 4:5.18.1-290 +- Document Math::BigInt::CalcEmu requires Math::BigInt (bug #959096) + +* Tue Oct 22 2013 Petr Pisar - 4:5.18.1-289 +- perl_default_filter macro does not need to filter private libraries from + provides (bug #1020809) +- perl_default_filter anchors the filter regular expressions +- perl_default_filter appends the filters instead of redefining them + +* Mon Sep 09 2013 Jitka Plesnikova - 4:5.18.1-288 +- Fix rules for parsing numeric escapes in regexes (bug #978233) +- Fix crash with \&$glob_copy (bug #989486) +- Fix coreamp.t's rand test (bug #970567) +- Reap child in case where exception has been thrown (bug #988805) +- Fix using regexes with multiple code blocks (bug #982131) + +* Tue Aug 13 2013 Jitka Plesnikova - 4:5.18.1-287 +- 5.18.1 bump (see + for release notes) +- Disable macro %%{rebuild_from_scratch} +- Fix regex seqfault 5.18 regression (bug #989921) +- Fixed interpolating downgraded variables into upgraded (bug #970913) +- SvTRUE returns correct value (bug #967463) +- Fixed doc command in perl debugger (bug #967461) +- Fixed unaligned access in slab allocator (bug #964950) + +* Sat Aug 03 2013 Fedora Release Engineering - 4:5.18.0-286 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Mon Jul 15 2013 Petr Pisar - 4:5.18.0-285 +- Stop providing old perl(MODULE_COMPAT_5.16.*) + +* Fri Jul 12 2013 Petr Pisar - 4:5.18.0-284 +- Perl 5.18 rebuild + +* Tue Jul 09 2013 Petr Pisar - 4:5.18.0-283 +- Define SONAME for libperl.so and move the libary into standard path +- Link XS modules to libperl.so on Linux (bug #960048) + +* Mon Jul 08 2013 Petr Pisar - 4:5.18.0-282 +- Do not load system Term::ReadLine::Gnu while running tests +- Disable ornaments on perl5db AutoTrace tests + +* Thu Jul 04 2013 Jitka Plesnikova - 4:5.18.0-281 +- Update to Perl 5.18.0 +- Clean patches, not needed with new version + +* Wed Jun 26 2013 Petr Pisar - 4:5.16.3-280 +- Edit local patch level before compilation + +* Fri Jun 14 2013 Petr Pisar - 4:5.16.3-279 +- Do not distribute File::Spec::VMS (bug #973713) +- Remove bundled CPANPLUS-Dist-Build (bug #973041) + +* Wed Jun 12 2013 Petr Pisar - 4:5.16.3-278 +- Update SystemTap scripts to recognize new phase__change marker and new probe + arguments (bug #971094) +- Update h2ph(1) documentation (bug #948538) +- Update pod2html(1) documentation (bug #948538) +- Do not double-own archlib directory (bug #894195) + +* Tue Jun 11 2013 Petr Pisar - 4:5.16.3-277 +- Move CPANPLUS-Dist-Build files from perl-CPANPLUS +- Move CPAN-Meta-Requirements files from CPAN-Meta +- Add perl-Scalar-List-Utils to perl-core dependencies + +* Thu Jun 06 2013 Petr Pisar - 4:5.16.3-276 +- Require $Config{libs} providers (bug #905482) + +* Thu May 30 2013 Petr Pisar - 4:5.16.3-275 +- Correct typo in perl-Storable file list (bug #966865) +- Remove bundled Storable (bug #966865) + +* Wed May 29 2013 Petr Pisar - 4:5.16.3-274 +- Sub-package Storable (bug #966865) + +* Mon May 13 2013 Petr Pisar - 4:5.16.3-273 +- Use lib64 directories on aarch64 architecture (bug #961900) + +* Fri May 10 2013 Petr Pisar - 4:5.16.3-272 +- Make regular expression engine safe in a signal handler (bug #849703) +- Remove bundled ExtUtils-ParseXS, and Time-HiRes + +* Fri Apr 26 2013 Petr Pisar - 4:5.16.3-271 +- Sub-package Time-HiRes (bug #957048) +- Remove bundled Getopt-Long, Locale-Maketext, and Sys-Syslog + +* Wed Apr 10 2013 Petr Pisar - 4:5.16.3-270 +- Fix leaking tied hashes (bug #859910) +- Fix dead lock in PerlIO after fork from thread (bug #947444) +- Add proper conflicts to perl-Getopt-Long, perl-Locale-Maketext, and + perl-Sys-Syslog + +* Tue Apr 09 2013 Petr Pisar - 4:5.16.3-269 +- Sub-package Sys-Syslog (bug #950057) + +* Fri Apr 05 2013 Petr Pisar - 4:5.16.3-268 +- Sub-package Getopt-Long (bug #948855) +- Sub-package Locale-Maketext (bug #948974) + +* Fri Apr 05 2013 Petr Pisar - 4:5.16.3-267 +- Remove bundled constant, DB_File, Digest-MD5, Env, Exporter, File-Path, + File-Temp, Module-Load, Log-Message-Simple, Pod-Simple, Test-Harness, + Text-ParseWords + +* Mon Mar 25 2013 Petr Pisar - 4:5.16.3-266 +- Filter provides from *.pl files (bug #924938) + +* Fri Mar 22 2013 Petr Pisar - 4:5.16.3-265 +- Conflict perl-autodie with older perl (bug #911226) +- Sub-package Env (bug #924619) +- Sub-package Exporter (bug #924645) +- Sub-package File-Path (bug #924782) +- Sub-package File-Temp (bug #924822) + +* Thu Mar 21 2013 Petr Pisar - 4:5.16.3-264 +- Sub-package constant (bug #924169) +- Sub-package DB_File (bug #924351) + +* Tue Mar 19 2013 Petr Pisar - 4:5.16.3-263 +- Correct perl-Digest-MD5 dependencies +- Remove bundled Archive-Extract, File-Fetch, HTTP-Tiny, + Module-Load-Conditional, Time-Local + +* Fri Mar 15 2013 Petr Pisar - 4:5.16.3-262 +- Correct dependencies of perl-HTTP-Tiny +- Sub-package Time-Local (bug #922054) + +* Thu Mar 14 2013 Petr Pisar - 4:5.16.3-261 +- 5.16.3 bump (see + for release notes) +- Remove bundled autodie, B-Lint, CPANPLUS, Encode, File-CheckTree, IPC-Cmd, + Params-Check, Text-Soundex, Thread-Queue + +* Tue Mar 05 2013 Petr Pisar - 4:5.16.2-260 +- Fix CVE-2013-1667 (DoS in rehashing code) (bug #918008) + +* Mon Feb 18 2013 Petr Pisar - 4:5.16.2-259 +- Sub-package autodie (bug #911226) +- Add NAME headings to CPAN modules (bug #908113) + +* Thu Feb 14 2013 Petr Pisar - 4:5.16.2-258 +- Fix perl-Encode-devel dependency declaration + +* Thu Feb 14 2013 Petr Pisar - 4:5.16.2-257 +- Sub-package Thread-Queue (bug #911062) + +* Wed Feb 13 2013 Petr Pisar - 4:5.16.2-256 +- Sub-package File-CheckTree (bug #909144) +- Sub-package Text-ParseWords +- Sub-package Encode (bug #859149) + +* Fri Feb 08 2013 Petr Pisar - 4:5.16.2-255 +- Remove bundled Log-Message +- Remove bundled Term-UI + +* Thu Feb 07 2013 Petr Pisar - 4:5.16.2-254 +- Correct perl-podlators dependencies +- Obsolete perl-ExtUtils-Typemaps by perl-ExtUtils-ParseXS (bug #891952) + +* Tue Feb 05 2013 Petr Pisar - 4:5.16.2-253 +- Sub-package Pod-Checker and Pod-Usage (bugs #907546, #907550) + +* Mon Feb 04 2013 Petr Pisar - 4:5.16.2-252 +- Remove bundled PathTools + +* Wed Jan 30 2013 Petr Pisar - 4:5.16.2-251 +- Sub-package B-Lint (bug #906015) + +* Wed Jan 30 2013 Petr Pisar - 4:5.16.2-250 +- Sub-package Text-Soundex (bug #905889) +- Fix conflict declaration at perl-Pod-LaTeX (bug #904085) +- Remove bundled Module-Pluggable (bug #903624) + +* Tue Jan 29 2013 Petr Pisar - 4:5.16.2-249 +- Run-require POD convertors by Module-Build and ExtUtils-MakeMaker to + generate documentation when building other packages + +* Fri Jan 25 2013 Petr Pisar - 4:5.16.2-248 +- Sub-package Pod-LaTeX (bug #904085) + +* Wed Jan 16 2013 Petr Pisar - 4:5.16.2-247 +- Remove bundled Pod-Parser + +* Fri Jan 11 2013 Petr Pisar - 4:5.16.2-246 +- Fix CVE-2012-6329 (misparsing of maketext strings) (bug #884354) + +* Thu Jan 10 2013 Petr Pisar - 4:5.16.2-245 +- Do not package App::Cpan(3pm) to perl-Test-Harness (bug #893768) + +* Tue Dec 18 2012 Petr Pisar - 4:5.16.2-244 +- Remove bundled Archive-Tar +- Remove bundled CPAN-Meta-YAML +- Remove bundled Module-Metadata + +* Tue Dec 18 2012 Petr Pisar - 4:5.16.2-243 +- Remove bundled Filter modules + +* Mon Nov 05 2012 Jitka Plesnikova - 4:5.16.2-242 +- 5.16.2 bump (see + http://search.cpan.org/dist/perl-5.16.1/pod/perldelta.pod for release + notes) + +* Wed Oct 31 2012 Petr Pisar - 4:5.16.1-241 +- Remove bundled podlators (bug #856516) + +* Wed Oct 17 2012 Jitka Plesnikova - 4:5.16.1-240 +- Do not crash when vivifying $| (bug #865296) + +* Mon Sep 24 2012 Petr Pisar - 4:5.16.1-239 +- Conflict perl-podlators with perl before sub-packaging (bug #856516) + +* Fri Sep 21 2012 Petr Pisar - 4:5.16.1-238 +- Do not leak with attribute on my variable (bug #858966) +- Allow operator after numeric keyword argument (bug #859328) +- Extend stack in File::Glob::glob (bug #859332) + +* Thu Sep 20 2012 Petr Pisar - 4:5.16.1-237 +- Put perl-podlators into perl-core list (bug #856516) + +* Tue Sep 18 2012 Petr Pisar - 4:5.16.1-236 +- Remove bundled perl-ExtUtils-Manifest +- perl-PathTools uses Carp + +* Fri Sep 14 2012 Petr Pisar - 4:5.16.1-235 +- Override the Pod::Simple::parse_file to set output to STDOUT by default + (bug #826872) + +* Wed Sep 12 2012 Petr Pisar - 4:5.16.1-234 +- Sub-package perl-podlators (bug #856516) + +* Tue Sep 11 2012 Petr Pisar - 4:5.16.1-233 +- Do not access freed memory when cloning thread (bug #825749) +- Match non-breakable space with /[\h]/ in ASCII mode (bug #844919) +- Clear $@ before `do' I/O error (bug #834226) +- Do not truncate syscall() return value to 32 bits (bug #838551) + +* Wed Sep 05 2012 Petr Pisar - 4:5.16.1-232 +- Move App::Cpan from perl-Test-Harness to perl-CPAN (bug #854577) + +* Fri Aug 24 2012 Petr Pisar - 4:5.16.1-231 +- Remove perl-devel dependency from perl-Test-Harness and perl-Test-Simple + +* Mon Aug 13 2012 Marcela Mašláňová - 4:5.16.0-230 +- define perl_compat by macro for rebuilds +- sub-packages depend on compat rather than on nvr + +* Thu Aug 9 2012 Marcela Mašláňová - 4:5.16.0-229 +- apply conditionals for dual life patches + +* Thu Aug 09 2012 Jitka Plesnikova 4:5.16.1-228 +- 5.16.1 bump (see + http://search.cpan.org/dist/perl-5.16.1/pod/perldelta.pod for release + notes) +- Fixed reopening by scalar handle (bug #834221) +- Fixed tr/// multiple transliteration (bug #831679) +- Fixed heap-overflow in gv_stashpv (bug #826516) + +* Fri Jul 20 2012 Fedora Release Engineering - 4:5.16.0-227 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Fri Jul 13 2012 Paul Howarth 4:5.16.0-226 +- Move the rest of ExtUtils-ParseXS into its sub-package, so that the main + perl package doesn't need to pull in perl-devel (bug #839953) + +* Mon Jul 02 2012 Jitka Plesnikova 4:5.16.0-225 +- Fix broken atof (bug #835452) + +* Wed Jun 27 2012 Petr Pisar - 4:5.16.0-224 +- perl-Pod-Perldoc must require groff-base because Pod::Perldoc::ToMan executes + roff + +* Mon Jun 25 2012 Petr Pisar - 4:5.16.0-223 +- Test::Build requires Data::Dumper +- Sub-package perl-Pod-Parser + +* Thu Jun 07 2012 Petr Pisar - 4:5.16.0-222 +- Remove MODULE_COMPAT_5.14.* Provides + +* Wed Jun 06 2012 Petr Pisar - 4:5.16.0-221 +- Perl 5.16 rebuild + +* Wed Jun 06 2012 Petr Pisar - 4:5.16.0-220 +- perl_bootstrap macro is distributed in perl-srpm-macros now + +* Fri Jun 01 2012 Petr Pisar - 4:5.16.0-219 +- Own zipdetails and IO::Compress::FAQ by perl-IO-Compress + +* Fri Jun 1 2012 Jitka Plesnikova - 4:5.16.0-218 +- Fix find2perl to translate ? glob properly (bug #825701) + +* Thu May 31 2012 Petr Pisar - 4:5.16.0-218 +- Shorten perl-Module-Build version to 2 digits to follow upstream + +* Fri May 25 2012 Marcela Mašláňová - 4:5.16.0-217 +- upload the stable 5.16.0 + +* Wed May 16 2012 Marcela Mašláňová - 4:5.16.0-RC2-217 +- clean patches, not needed with new version +- regen by podcheck list of failed pods. cn, jp, ko pods failed. I can't decide + whether it's a real problem or false positives. + +* Mon Apr 30 2012 Petr Pisar - 4:5.14.2-216 +- Enable usesitecustomize + +* Thu Apr 19 2012 Petr Pisar - 4:5.14.2-215 +- Rebuild perl against Berkeley database version 5 (bug #768846) + +* Fri Apr 13 2012 Petr Pisar - 4:5.14.2-214 +- perl-Data-Dumper requires Scalar::Util (bug #811239) + +* Tue Apr 10 2012 Petr Pisar - 4:5.14.2-213 +- Sub-package Data::Dumper (bug #811239) + +* Tue Feb 21 2012 Petr Pisar - 4:5.14.2-212 +- Sub-package Filter (bug #790349) + +* Mon Feb 06 2012 Petr Pisar - 4:5.14.2-211 +- Fix searching for Unicode::Collate::Locale data (bug #756118) +- Run safe signal handlers before returning from sigsuspend() and pause() + (bug #771228) +- Correct perl-Scalar-List-Utils files list +- Stop !$^V from leaking (bug #787613) + +* Tue Jan 10 2012 Paul Howarth - 4:5.14.2-210 +- Rebuild again now that perl dependency generator is fixed (#772632, #772699) + +* Fri Jan 06 2012 Iain Arnell -4:5.14.2-209 +- perl-ExtUtils-MakeMaker sub-package requires ExtUtils::Install + +* Fri Jan 6 2012 Paul Howarth - 4:5.14.2-208 +- Rebuild for gcc 4.7 + +* Tue Dec 20 2011 Petr Pisar - 4:5.14.2-207 +- Fix interrupted reading. Thanks to Šimon Lukašík for reporting this issue + and thanks to Marcela Mašláňová for finding fix. (bug #767931) + +* Wed Dec 14 2011 Petr Pisar - 4:5.14.2-206 +- Fix leak with non-matching named captures (bug #767597) + +* Tue Nov 29 2011 Petr Pisar - 4:5.14.2-205 +- Sub-package ExtUtils::Install +- Sub-package ExtUtils::Manifest +- Do not provide private perl(ExtUtils::MakeMaker::_version) + +* Thu Nov 24 2011 Ville Skyttä - 4:5.14.2-204 +- Add $RPM_LD_FLAGS to lddlflags. + +* Wed Nov 23 2011 Petr Pisar - 4:5.14.2-203 +- Sub-package Socket + +* Mon Nov 21 2011 Petr Pisar - 4:5.14.2-202 +- Sub-package Pod::Perldoc + +* Fri Nov 18 2011 Petr Pisar - 4:5.14.2-201 +- Increase epoch of perl-Module-CoreList to overcome version regression in + upstream (bug #754641) + +* Thu Nov 3 2011 Marcela Mašláňová - 4:5.14.2-200 +- perl(DBIx::Simple) is not needed in spec requirement in CPANPLUS. It's generated + automatically. + +* Wed Nov 02 2011 Petr Pisar - 4:5.14.2-199 +- Provide perl(DB) by perl + +* Mon Oct 24 2011 Petr Pisar - 4:5.14.2-198 +- Do not warn about missing site directories (bug #732799) + +* Thu Oct 20 2011 Marcela Mašláňová - 4:5.14.2-197 +- cleaned spec (thanks to Grigory Batalov) +- Module-Metadata sub-package contained perl_privlib instead of privlib +- %%files parent section was repeated twice + +* Fri Oct 14 2011 Petr Pisar - 4:5.14.2-196 +- Filter false perl(DynaLoader) provide from perl-ExtUtils-MakeMaker + (bug #736714) +- Change Perl_repeatcpy() prototype to allow repeat count above 2^31 + (bug #720610) +- Do not own site directories located in /usr/local (bug #732799) + +* Tue Oct 04 2011 Petr Pisar - 4:5.14.2-195 +- Fix CVE-2011-3597 (code injection in Digest) (bug #743010) +- Sub-package Digest and thus Digest::MD5 module (bug #743247) + +* Tue Oct 04 2011 Iain Arnell 4:5.14.2-194 +- add provide for perl(:MODULE_COMPAT_5.14.2) + +* Mon Oct 03 2011 Petr Pisar - 4:5.14.2-193 +- 5.14.2 bump (see + https://metacpan.org/module/FLORA/perl-5.14.2/pod/perldelta.pod for release + notes). +- Fixes panics when processing regular expression with \b class and /aa + modifier (bug #731062) +- Fixes CVE-2011-2728 (File::Glob bsd_glob() crash with certain glob flags) + (bug #742987) + +* Mon Oct 03 2011 Petr Pisar - 4:5.14.1-192 +- Enable GDBM support again to build against new gdbm 1.9.1 + +* Fri Sep 30 2011 Petr Pisar - 4:5.14.1-191 +- Disable NDBM support temporarily too as it's provided by gdbm package + +* Wed Sep 21 2011 Petr Pisar - 4:5.14.1-190 +- Disable GDBM support temporarily to build new GDBM + +* Thu Sep 15 2011 Petr Pisar - 4:5.14.1-189 +- Correct perl-CGI list of Provides +- Make tests optional +- Correct perl-ExtUtils-ParseXS Provides +- Correct perl-Locale-Codes Provides +- Correct perl-Module-CoreList version +- Automate perl-Test-Simple-tests Requires version + +* Tue Sep 13 2011 Petr Pisar - 4:5.14.1-188 +- Make gdbm support optional to bootstrap with new gdbm +- Split Carp into standalone sub-package to dual-live with newer versions + (bug #736768) + +* Tue Aug 30 2011 Petr Pisar - 4:5.14.1-187 +- Split Locale::Codes into standalone sub-package to dual-live with newer + versions (bug #717863) + +* Sun Aug 14 2011 Iain Arnell 4:5.14.1-186 +- perl needs to own vendorarch/auto directory + +* Fri Aug 05 2011 Petr Sabata - 4:5.14.1-185 +- Move xsubpp to ExtUtils::ParseXS (#728393) + +* Fri Jul 29 2011 Iain Arnell 4:5.14.1-184 +- fix Compress-Raw-Bzip2 pacakging +- ensure that we never bundle bzip2 or zlib + +* Tue Jul 26 2011 Marcela Mašláňová - 4:5.14.1-183 +- remove from provides MODULE_COMPAT 5.12.* + +* Fri Jul 22 2011 Paul Howarth - 4:5.14.1-182 +- Have perl-Module-Build explicitly require perl(CPAN::Meta) >= 2.110420, + needed for creation of MYMETA files by Build.PL; the dual-life version of + the package already has this dependency + +* Tue Jul 19 2011 Petr Sabata - 4:5.14.1-181 +- Temporarily provide 5.12.* MODULE_COMPAT + +* Sat Jul 16 2011 Iain Arnell 4:5.14.1-180 +- fix escaping of the __provides_exclude_from macro + +* Wed Jul 13 2011 Iain Arnell 4:5.14.1-179 +- Parse-CPAN-Meta explicitly requires CPAN::Meta::YAML and JSON::PP +- Exclude CPAN::Meta* from CPAN sub-package +- Don't try to normalize CPAN-Meta, JSON-PP, and Parse-CPAN-Meta versions; + their dual-life packages aren't and have much higher numbers already + +* Mon Jun 27 2011 Marcela Mašláňová - 4:5.14.1-178 +- update macros -> add %%perl_bootstrap 1 and example for readability +- add into Module::Build dependency on perl-devel (contains macros.perl) +- create new sub-package macros, because we need macros in minimal buildroot + +* Thu Jun 23 2011 Marcela Mašláňová - 4:5.14.1-175 +- remove from macros BSD, because there exists BSD::Resources + +* Tue Jun 21 2011 Marcela Mašláňová - 4:5.14.1-174 +- remove old MODULE_COMPATs + +* Mon Jun 20 2011 Iain Arnell 4:5.14.1-173 +- move ptargrep to Archive-Tar sub-package +- fix version numbers in last two changelog entries + +* Mon Jun 20 2011 Paul Howarth - 4:5.14.1-172 +- add provide for perl(:MODULE_COMPAT_5.14.1) + +* Mon Jun 20 2011 Marcela Mašláňová - 4:5.14.1-171 +- update to 5.14.1 - no new modules, just serious bugfixes and doc +- switch off fork test, which is failing only on koji + +* Thu Jun 16 2011 Marcela Mašláňová - 4:5.14.0-170 +- try to update to latest ExtUtils::MakeMaker, no luck -> rebuild with current + version, fix bug RT#67618 in modules + +* Wed Jun 15 2011 Marcela Mašláňová - 4:5.14.0-169 +- filter even Mac:: requires, polish filter again for correct installation +- add sub-package Compress-Raw-Bzip2, solve Bzip2 conflicts after install +- and add IO::Uncompress::Bunzip2 correctly into IO-Compress + +* Mon Jun 13 2011 Marcela Mašláňová - 4:5.14.0-167 +- Perl 5.14 mass rebuild, bump release, remove releases in subpackages + +* Thu Jun 09 2011 Marcela Mašláňová - 4:5.14.0-165 +- Perl 5.14 mass rebuild + +* Thu Jun 09 2011 Marcela Mašláňová - 4:5.14.0-163 +- Perl 5.14 mass rebuild + +* Thu Jun 9 2011 Marcela Mašláňová - 4:5.14.0-162 +- add new sub-packages, remove BR in them + +* Wed Jun 1 2011 Marcela Mašláňová - 4:5.14.0-161 +- arm can't do parallel builds +- add require EE::MM into IPC::Cmd 711486 + +* Mon May 16 2011 Marcela Mašláňová - 4:5.14.0-161 +- test build of released 5.14.0 +- remove Class::ISA from sub-packages +- patches 8+ are part of new release +- remove vendorarch/auto/Compress/Zlib + +* Wed Apr 13 2011 Marcela Mašláňová - 4:5.12.3-160 +- add provides UNIVERSAL and DB back into perl + +* Thu Apr 07 2011 Petr Pisar - 4:5.12.3-159 +- Remove rpath-make patch because we use --enable-new-dtags linker option + +* Fri Apr 1 2011 Marcela Mašláňová - 4:5.12.3-158 +- 692900 - lc launders tainted flag, RT #87336 + +* Fri Apr 1 2011 Robin Lee - 4:5.12.3-157 +- Cwd.so go to the PathTools sub-package + +* Tue Mar 15 2011 Marcela Mašláňová - 4:5.12.3-156 +- sub-package Path-Tools + +* Sat Feb 19 2011 Iain Arnell 4:5.12.3-154 +- sub-package Scalar-List-Utils + +* Tue Feb 08 2011 Fedora Release Engineering - 4:5.12.3-153 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Thu Jan 27 2011 Petr Pisar - 4:5.12.3-152 +- Document ExtUtils::ParseXS upgrade in local patch tracking + +* Wed Jan 26 2011 Tom Callaway - 4:5.12.3-151 +- update ExtUtils::ParseXS to 2.2206 (current) to fix Wx build + +* Wed Jan 26 2011 Petr Pisar - 4:5.12.3-150 +- Make %%global perl_default_filter lazy +- Do not hard-code tapsetdir path + +* Tue Jan 25 2011 Lukas Berk - 4:5.12.3-149 +- added systemtap tapset to make use of systemtap-sdt-devel +- added an example systemtap script + +* Mon Jan 24 2011 Marcela Mašláňová - 4:5.12.3-148 +- stable update 5.12.3 +- add COMPAT + +* Thu Dec 9 2010 Marcela Mašláňová - 4:5.12.2-146 +- 463773 revert change. txt files are needed for example by UCD::Unicode, + PDF::API2,... + +* Thu Dec 9 2010 Marcela Mašláňová - 4:5.12.2-145 +- required systemtap-sdt-devel on request in 661553 + +* Mon Nov 29 2010 Marcela Mašláňová - 4:5.12.2-144 +- create sub-package for CGI 3.49 + +* Tue Nov 09 2010 Petr Pisar - 4:5.12.2-143 +- Sub-package perl-Class-ISA (bug #651317) + +* Mon Nov 08 2010 Petr Pisar - 4:5.12.2-142 +- Make perl(ExtUtils::ParseXS) version 4 digits long (bug #650882) + +* Tue Oct 19 2010 Marcela Mašláňová - 4:5.12.2-141 +- 643447 fix redefinition of constant C in h2ph (visible in git send mail, + XML::Twig test suite) +- remove ifdef for s390 + +* Thu Oct 07 2010 Petr Pisar - 4:5.12.2-140 +- Package Test-Simple tests to dual-live with standalone package (bug #640752) + +* Wed Oct 6 2010 Marcela Mašláňová - 4:5.12.2-139 +- remove removal of NDBM + +* Tue Oct 05 2010 Petr Pisar - 4:5.12.2-138 +- Consolidate Requires filtering +- Consolidate libperl.so* Provides + +* Fri Oct 1 2010 Marcela Mašláňová - 4:5.12.2-137 +- filter useless requires, provide libperl.so + +* Fri Oct 01 2010 Petr Pisar - 4:5.12.2-136 +- Reformat perl-threads description +- Fix threads directories ownership + +* Thu Sep 30 2010 Marcela Mašláňová - 4:5.12.2-135 +- sub-package threads + +* Thu Sep 23 2010 Marcela Mašláňová - 4:5.12.2-134 +- add vendor path, clean paths in Configure in spec file +- create sub-package threads-shared + +* Tue Sep 7 2010 Petr Pisar - 4:5.12.2-133 +- Do not leak when destroying thread (RT #77352, RHBZ #630667) + +* Tue Sep 7 2010 Petr Sabata - 5:5.12.2-132 +- Fixing release number for modules + +* Tue Sep 7 2010 Petr Sabata - 4:5.12.2-1 +- Update to 5.12.2 +- Removed one hardcoded occurence of perl version in build process +- Added correct path to dtrace binary +- BuildRequires: systemtap-sdt-devel + +* Tue Sep 7 2010 Marcela Mašláňová - 4:5.12.1-131 +- run Configure with -Dusedtrace for systemtap support + +* Wed Aug 18 2010 Petr Pisar - 4:5.12.1-130 +- Run tests in parallel +- Add "-Wl,--enable-new-dtags" to linker to allow to override perl's rpath by + LD_LIBRARY_PATH used in tests. Otherwise tested perl would link to old + in-system libperl.so. +- Normalize spec file indentation + +* Mon Jul 26 2010 Marcela Mašláňová - 4:5.12.1-129 +- 617956 move perlxs* docs files into perl-devel + +* Thu Jul 15 2010 Marcela Mašláňová - 4:5.12.1-128 +- 614662 wrong perl-suidperl version in obsolete + +* Sun Jul 11 2010 Dan Horák - 4:5.12.1-127 +- add temporary compat provides needed on s390(x) + +* Fri Jul 09 2010 Petr Pisar - 4:5.12.1-126 +- Add Digest::SHA requirement to perl-CPAN and perl-CPANPLUS (bug #612563) + +* Thu Jul 8 2010 Marcela Mašláňová - 4:5.12.1-125 +- 607505 add another dir into Module::Build (thanks to Paul Howarth) + +* Mon Jun 28 2010 Ralf Corsépius - 4:5.12.1-124 +- Address perl-Compress-Raw directory ownership (BZ 607881). + +* Thu Jun 10 2010 Marcela Mašláňová - 4:5.12.1-123 +- remove patch with debugging symbols, which should be now ok without it +- update to 5.12.1 +- MODULE_COMPAT + +* Tue Apr 27 2010 Marcela Mašláňová - 4:5.12.0-122 +- packages in buildroot needs MODULE_COMPAT 5.10.1, add it back for rebuild + +* Sun Apr 25 2010 Marcela Mašláňová - 4:5.12.0-121 +- rebuild with tests in test buildroot + +* Fri Apr 23 2010 Marcela Mašláňová - 4:5.12.0-120-test +- MODULE_COMPAT 5.12.0 +- remove BR man +- clean configure +- fix provides/requires in IO-Compress + +* Wed Apr 14 2010 Marcela Mašláňová - 4:5.12.0-119.1 +- rebuild 5.12.0 without MODULE_COMPAT + +* Wed Apr 14 2010 Marcela Mašláňová - 4:5.12.0-119 +- initial 5.12.0 build + +* Tue Apr 6 2010 Marcela Mašláňová - 4:5.10.1-118 +- 463773 remove useless txt files from installation +- 575842 remove PERL_USE_SAFE_PUTENV, use perl putenv + +* Tue Mar 16 2010 Chris Weyl - 4:5.10.1-117 +- package tests in their own subpackage + +* Mon Mar 15 2010 Marcela Mašláňová - 4:5.10.1-116 +- add noarch into correct sub-packages +- move Provides/Obsoletes into correct modules from main perl + +* Thu Mar 11 2010 Paul Howarth - 4:5.10.1-115 +- restore missing version macros for Compress::Raw::Zlib, IO::Compress::Base + and IO::Compress::Zlib + +* Thu Mar 11 2010 Marcela Mašláňová - 4:5.10.1-114 +- clean spec a little more +- rebuild with new gdbm + +* Fri Mar 5 2010 Marcela Mašláňová - 4:5.10.1-112 +- fix license according to advice from legal +- clean unused patches + +* Wed Feb 24 2010 Chris Weyl - 4:5.10.1-111 +- update subpackage tests macros to handle packages with an epoch properly + +* Fri Feb 05 2010 Chris Weyl - 4:5.10.1-110 +- add initial EXPERIMENTAL tests subpackage rpm macros to macros.perl + +* Tue Dec 22 2009 Marcela Mašláňová - 4:5.10.1-109 +- 547656 CVE-2009-3626 perl: regexp matcher crash on invalid UTF-8 characters +- 549306 version::Internals should be packaged in perl-version subpackage +- Parse-CPAN-Meta updated and separate package is dead + +* Mon Dec 21 2009 Chris Weyl - 4:5.10.1-107 +- subpackage parent and Parse-CPAN-Meta; add them to core's dep list + +* Fri Dec 18 2009 Ralf Corsépius - 4:5.10.1-106 +- exclude "parent". + +* Fri Dec 18 2009 Ralf Corsépius - 4:5.10.1-105 +- exclude Parse-CPAN-Meta. + +* Mon Dec 7 2009 Stepan Kasal - 4:5.10.1-104 +- do not pack Bzip2 manpages either (#544582) + +* Mon Dec 7 2009 Stepan Kasal - 4:5.10.1-103 +- do not pack Bzip2 modules (#544582) +- hack: cheat about Compress::Raw::Zlib version (#544582) + +* Thu Dec 3 2009 Stepan Kasal - 4:5.10.1-102 +- switch off check for ppc64 and s390x +- remove the hack for "make test," it is no longer needed + +* Thu Dec 3 2009 Stepan Kasal - 4:5.10.1-101 +- be more careful with the libperl.so compatibility symlink (#543936) + +* Wed Dec 2 2009 Stepan Kasal - 4:5.10.1-100 +- new upstream version +- release number must be high, because of stale version numbers of some + of the subpackages +- drop upstreamed patches +- update the versions of bundled modules +- shorten the paths in @INC +- build without DEBUGGING +- implement compatibility measures for the above two changes, for a short + transition period +- provide perl(:MODULE_COMPAT_5.10.0), for that transition period only + +* Tue Dec 1 2009 Stepan Kasal - 4:5.10.0-87 +- fix patch-update-Compress-Raw-Zlib.patch (did not patch Zlib.pm) +- update Compress::Raw::Zlib to 2.023 +- update IO::Compress::Base, and IO::Compress::Zlib to 2.015 (#542645) + +* Mon Nov 30 2009 Marcela Mašláňová - 4:5.10.0-86 +- 542645 update IO-Compress-Base + +* Tue Nov 24 2009 Stepan Kasal - 4:5.10.0-85 +- back out perl-5.10.0-spamassassin.patch (#528572) + +* Thu Oct 01 2009 Chris Weyl - 4:5.10.0-84 +- add /perl(UNIVERSAL)/d; /perl(DB)/d to perl_default_filter auto-provides + filtering + +* Thu Oct 1 2009 Stepan Kasal - 4:5.10.0-83 +- update Storable to 2.21 + +* Mon Aug 31 2009 Chris Weyl - 4:5.10.0-82 +- update our Test-Simple update to 0.92 (patch by Iain Arnell), #519417 +- update Module-Pluggable to 3.9 + +* Thu Aug 27 2009 Chris Weyl - 4:5.10.0-81 +- fix macros.perl *sigh* + +* Mon Aug 24 2009 Stepan Kasal - 4:5.10.0-80 +- Remove -DDEBUGGING=-g, we are not ready yet. + +* Fri Aug 21 2009 Chris Weyl - 4:5.10.0-79 +- add helper filtering macros to -devel, for perl-* package invocation + (#502402) + +* Fri Jul 31 2009 Stepan Kasal - 4:5.10.0-78 +- Add configure option -DDEBUGGING=-g (#156113) + +* Tue Jul 28 2009 arcela Mašláňová - 4:5.10.0-77 +- 510127 spam assassin suffer from tainted bug + +* Mon Jul 27 2009 Marcela Mašláňová - 4:5.10.0-76 +- 494773 much better swap logic to support reentrancy and fix assert failure (rt #60508) + +* Sat Jul 25 2009 Fedora Release Engineering - 4:5.10.0-75 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Fri Jul 10 2009 Stepan Kasal - 4:5.10.0-74 +- fix generated .ph files so that they no longer cause warnings (#509676) +- remove PREREQ_FATAL from Makefile.PL's processed by miniperl +- update to latest Scalar-List-Utils (#507378) +- perl-skip-prereq.patch: skip more prereq declarations in Makefile.PL files + +* Tue Jul 7 2009 Stepan Kasal - 4:5.10.0-73 +- re-enable tests + +* Tue Jul 7 2009 Stepan Kasal - 4:5.10.0-72 +- move -DPERL_USE_SAFE_PUTENV to ccflags (#508496) + +* Mon Jun 8 2009 Marcela Mašláňová - 4:5.10.0-71 +- #504386 update of Compress::Raw::Zlib 2.020 + +* Thu Jun 4 2009 Marcela Mašláňová - 4:5.10.0-70 +- update File::Spec (PathTools) to 3.30 + +* Wed Jun 3 2009 Stepan Kasal - 4:5.10.0-69 +- fix #221113, $! wrongly set when EOF is reached + +* Fri Apr 10 2009 Marcela Mašláňová - 4:5.10.0-68 +- do not use quotes in patchlevel.h; it breaks installation from cpan (#495183) + +* Tue Apr 7 2009 Stepan Kasal - 4:5.10.0-67 +- update CGI to 3.43, dropping upstreamed perl-CGI-escape.patch + +* Tue Apr 7 2009 Stepan Kasal - 4:5.10.0-66 +- fix CGI::escape for all strings (#472571) +- perl-CGI-t-util-58.patch: Do not distort lib/CGI/t/util-58.t + http://rt.perl.org/rt3/Ticket/Display.html?id=64502 + +* Fri Mar 27 2009 Stepan Kasal - 4:5.10.0-65 +- Move the gargantuan Changes* collection to -devel (#492605) + +* Tue Mar 24 2009 Stepan Kasal - 4:5.10.0-64 +- update module autodie + +* Mon Mar 23 2009 Stepan Kasal - 4:5.10.0-63 +- update Digest::SHA (fixes 489221) + +* Wed Mar 11 2009 Tom "spot" Callaway - 4:5.10.0-62 +- drop 26_fix_pod2man_upgrade (don't need it) +- fix typo in %%define ExtUtils_CBuilder_version + +* Wed Mar 11 2009 Tom "spot" Callaway - 4:5.10.0-61 +- apply Change 34507: Fix memory leak in single-char character class optimization +- Reorder @INC, based on b9ba2fadb18b54e35e5de54f945111a56cbcb249 +- fix Archive::Extract to fix test failure caused by tar >= 1.21 +- Merge useful Debian patches + +* Tue Mar 10 2009 Stepan Kasal - 4:5.10.0-60 +- remove compatibility obsolete sitelib directories +- use a better BuildRoot +- drop a redundant mkdir in %%install +- call patchlevel.h only once; rm patchlevel.bak +- update modules Sys::Syslog, Module::Load::Conditional, Module::CoreList, + Test::Harness, Test::Simple, CGI.pm (dropping the upstreamed patch), + File::Path (that includes our perl-5.10.0-CVE-2008-2827.patch), + constant, Pod::Simple, Archive::Tar, Archive::Extract, File::Fetch, + File::Temp, IPC::Cmd, Time::HiRes, Module::Build, ExtUtils::CBuilder +- standardize the patches for updating embedded modules +- work around a bug in Module::Build tests bu setting TMPDIR to a directory + inside the source tree + +* Sun Mar 08 2009 Robert Scheck - 4:5.10.0-59 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Mon Feb 16 2009 Tom "spot" Callaway - 4:5.10.0-58 +- add /usr/lib/perl5/site_perl to otherlibs (bz 484053) + +* Mon Feb 16 2009 Dennis Gilmore - 4:5.10.0-57 +- build sparc64 without _smp_mflags + +* Sat Feb 07 2009 Dennis Gilmore - 4:5.10.0-56 +- limit sparc builds to -j12 + +* Tue Feb 3 2009 Marcela Mašláňová - 4:5.10.0-55 +- update IPC::Cmd to v 0.42 + +* Mon Jan 19 2009 Marcela Mašláňová - 4:5.10.0-54 +- 455410 http://rt.perl.org/rt3/Public/Bug/Display.html?id=54934 + Attempt to free unreferenced scalar fiddling with the symbol table + Keep the refcount of the globs generated by PerlIO::via balanced. + +* Mon Dec 22 2008 Marcela Mašláňová - 4:5.10.0-53 +- add missing XHTML.pm into Pod::Simple + +* Fri Dec 12 2008 Marcela Mašláňová - 4:5.10.0-52 +- 295021 CVE-2007-4829 perl-Archive-Tar directory traversal flaws +- add another source for binary files, which test untaring links + +* Fri Nov 28 2008 Tom "spot" Callaway - 4:5.10.0-51 +- to fix Fedora bz 473223, which is really perl bug #54186 (http://rt.perl.org/rt3//Public/Bug/Display.html?id=54186) + we apply Changes 33640, 33881, 33896, 33897 + +* Mon Nov 24 2008 Marcela Mašláňová - 4:5.10.0-50 +- change summary according to RFC fix summary discussion at fedora-devel :) + +* Thu Oct 23 2008 Tom "spot" Callaway - 4:5.10.0-49 +- update File::Temp to 0.20 + +* Sun Oct 12 2008 Lubomir Rintel - 4:5.10.0-48 +- Include fix for rt#52740 to fix a crash when using Devel::Symdump and + Compress::Zlib together + +* Tue Oct 07 2008 Marcela Mašláňová 4:5.10.0-47.fc10 +- rt#33242, rhbz#459918. Segfault after reblessing objects in Storable. +- rhbz#465728 upgrade Simple::Pod to 3.07 + +* Wed Oct 1 2008 Stepan Kasal - 4:5.10.0-46 +- also preserve the timestamp of AUTHORS; move the fix to the recode + function, which is where the stamps go wrong + +* Wed Oct 1 2008 Tom "spot" Callaway 4:5.10.0-45 +- give Changes*.gz the same datetime to avoid multilib conflict + +* Wed Sep 17 2008 Marcela Maslanova 4:5.10.0-44.fc10 +- remove Tar.pm from Archive-Extract +- fix version of Test::Simple in spec +- update Test::Simple +- update Archive::Tar to 1.38 + +* Tue Sep 16 2008 Marcela Maslanova 4:5.10.0-43.fc10 +- 462444 update Test::Simple to 0.80 + +* Thu Aug 14 2008 Stepan Kasal - 4:5.10.0-42.fc10 +- move libnet to the right directory, along Net/Config.pm + +* Wed Aug 13 2008 Stepan Kasal - 4:5.10.0-41.fc10 +- do not create directory .../%%{version}/auto + +* Tue Aug 5 2008 Marcela Maslanova 4:5.10.0-40.fc10 +- 457867 remove required IPC::Run from CPANPLUS - needed only by win32 +- 457771 add path + +* Fri Aug 1 2008 Stepan Kasal 4:5.10.0-39.fc10 +- CGI.pm bug in exists() on tied param hash (#457085) +- move the enc2xs templates (../Encode/*.e2x) to -devel, (#456534) + +* Mon Jul 21 2008 Marcela Maslanova 4:5.10.0-38 +- 455933 update to CGI-3.38 +- fix fuzz problems (patch6) +- 217833 pos() function handle unicode characters correct + +* Thu Jul 10 2008 Tom "spot" Callaway 4:5.10.0-36 +- rebuild for new db4 4.7 + +* Wed Jul 9 2008 Stepan Kasal 4:5.10.0-35 +- remove db4 require, it is handled automatically + +* Thu Jul 3 2008 Stepan Kasal 4:5.10.0-34 +- 453646 use -DPERL_USE_SAFE_PUTENV. Without fail some modules f.e. readline. + +* Tue Jul 1 2008 Marcela Maslanova 4:5.10.0-33 +- 451078 update Test::Harness to 3.12 for more testing. Removed verbose +test, new Test::Harness has possibly verbose output, but updated package +has a lot of features f.e. TAP::Harness. Carefully watched all new bugs +related to tests! + +* Fri Jun 27 2008 Stepan Kasal 4:5.10.0-32 +- bump the release number, so that it is not smaller than in F-9 + +* Tue Jun 24 2008 Marcela Maslanova 4:5.10.0-28 +- CVE-2008-2827 perl: insecure use of chmod in rmtree + +* Wed Jun 11 2008 Marcela Maslanova 4:5.10.0-27 +- 447371 wrong access permission rt49003 + +* Tue Jun 10 2008 Stepan Kasal 4:5.10.0-26 +- make config parameter list consistent for 32bit and 64bit platforms, + add config option -Dinc_version_list=none (#448735) +- use perl_archname consistently +- cleanup of usage of *_lib macros in %%install + +* Fri Jun 6 2008 Marcela Maslanova 4:5.10.0-25 +- 449577 rebuild for FTBFS + +* Mon May 26 2008 Marcela Maslanova 4:5.10.0-24 +- 448392 upstream fix for assertion + +* Thu May 22 2008 Tom "spot" Callaway 4:5.10.0-23 +- sparc64 breaks with the rpath hack patch applied + +* Mon May 19 2008 Marcela Maslanova +- 447142 upgrade CGI to 3.37 (this actually happened in -21 in rawhide.) + +* Sat May 17 2008 Tom "spot" Callaway 4:5.10.0-21 +- sparc64 fails two tests under mysterious circumstances. we need to get the + rest of the tree moving, so we temporarily disable the tests on that arch. + +* Tue Mar 18 2008 Tom "spot" Callaway 4:5.10.0-20 +- create the vendor_perl/%%{perl_version}/%%{perl_archname}/auto directory + in %%{_libdir} so we own it properly + +* Tue Mar 18 2008 Tom "spot" Callaway 4:5.10.0-19 +- fix CPANPLUS-Dist-Build Provides/Obsoletes (bz 437615) +- bump version on Module-CoreList subpackage + +* Tue Mar 18 2008 Tom "spot" Callaway 4:5.10.0-18 +- forgot to create the auto directory for multilib vendor_perl dirs + +* Tue Mar 18 2008 Tom "spot" Callaway 4:5.10.0-17 +- own multilib vendor_perl directories +- mark Module::CoreList patch in patchlevel.h + +* Tue Mar 18 2008 Marcela Maslanova 4:5.10.0-16 +- 437817: RFE: Upgrade Module::CoreList to 2.14 + +* Wed Mar 12 2008 Marcela Maslanova 4:5.10.0-15 +- xsubpp now lives in perl-devel instead of perl. + +* Sat Mar 8 2008 Tom "spot" Callaway 4:5.10.0-14 +- back out Archive::Extract patch, causing odd test failure + +* Sat Mar 8 2008 Tom "spot" Callaway 4:5.10.0-13 +- add missing lzma test file + +* Fri Mar 7 2008 Tom "spot" Callaway 4:5.10.0-12 +- conditionalize multilib patch report in patchlevel.h +- Update Archive::Extract to 0.26 +- Update Module::Load::Conditional to 0.24 + +* Fri Mar 7 2008 Tom "spot" Callaway 4:5.10.0-11 +- only do it once, and do it for all our patches + +* Fri Mar 7 2008 Tom "spot" Callaway 4:5.10.0-10 +- note 32891 in patchlevel.h + +* Fri Mar 7 2008 Tom "spot" Callaway 4:5.10.0-9 +- get rid of bad conflicts on perl-File-Temp + +* Fri Mar 7 2008 Tom "spot" Callaway 4:5.10.0-8 +- use /usr/local for sitelib/sitearch dirs +- patch 32891 for significant performance improvement + +* Fri Feb 22 2008 Stepan Kasal - 4:5.10.0-7 +- Add perl-File-Temp provides/obsoletes/conflicts (#433836), + reported by Bill McGonigle +- escape the macros in Jan 30 entry + +* Tue Feb 19 2008 Fedora Release Engineering - 4:5.10.0-6 +- Autorebuild for GCC 4.3 + +* Wed Jan 30 2008 Tom "spot" Callaway - 4:5.10.0-5 +- disable some futime tests in t/io/fs.t because they started failing on x86_64 + in the Fedora builders, and no one can figure out why. :/ + +* Wed Jan 30 2008 Tom "spot" Callaway - 4:5.10.0-4 +- create %%{_prefix}/lib/perl5/vendor_perl/%%{perl_version}/auto and own it + in base perl (resolves bugzilla 214580) + +* Thu Jan 10 2008 Tom "spot" Callaway - 4:5.10.0-3 +- Update Sys::Syslog to 0.24, to fix test failures + +* Wed Jan 9 2008 Tom "spot" Callaway - 4:5.10.0-2 +- add some BR for tests + +* Tue Jan 8 2008 Tom "spot" Callaway - 4:5.10.0-1 +- 5.10.0 final +- clear out all the unnecessary patches (down to 8 patches!) +- get rid of super perl debugging mode +- add new subpackages + +* Thu Nov 29 2007 Robin Norwood - 4:5.10.0_RC2-0.1 +- first attempt at building 5.10.0 + +