From b90fec37f9b71fe650e007e5a87ad6219e64b32a Mon Sep 17 00:00:00 2001 From: MSVSphere Packaging Team Date: Fri, 25 Oct 2024 18:04:05 +0300 Subject: [PATCH] import perl-Storable-3.32-510.el10 --- .gitignore | 1 + .perl-Storable.metadata | 1 + SOURCES/Storable-3.25-Upgrade-to-3.32.patch | 538 ++++++++++++++++++++ SPECS/perl-Storable.spec | 320 ++++++++++++ 4 files changed, 860 insertions(+) create mode 100644 .gitignore create mode 100644 .perl-Storable.metadata create mode 100644 SOURCES/Storable-3.25-Upgrade-to-3.32.patch create mode 100644 SPECS/perl-Storable.spec diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f00bdb9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/Storable-3.25.tar.gz diff --git a/.perl-Storable.metadata b/.perl-Storable.metadata new file mode 100644 index 0000000..9b0fc88 --- /dev/null +++ b/.perl-Storable.metadata @@ -0,0 +1 @@ +bf9a9fce480251283d1fb5a49c342e4a2e78662f SOURCES/Storable-3.25.tar.gz diff --git a/SOURCES/Storable-3.25-Upgrade-to-3.32.patch b/SOURCES/Storable-3.25-Upgrade-to-3.32.patch new file mode 100644 index 0000000..e67bc46 --- /dev/null +++ b/SOURCES/Storable-3.25-Upgrade-to-3.32.patch @@ -0,0 +1,538 @@ +From 93b4cf22054a0e3f9f5d4ae8eaec85e8ca28944c Mon Sep 17 00:00:00 2001 +From: Jitka Plesnikova +Date: Mon, 12 Jun 2023 16:00:23 +0200 +Subject: [PATCH] Upgrade to 3.32 + +--- + ChangeLog | 29 ++++++++++++++ + Makefile.PL | 2 +- + Storable.pm | 30 ++++++++------ + Storable.xs | 111 ++++++++++++++++++++++++++++++++++++++++++---------- + t/blessed.t | 53 ++++++++++++++++++++++++- + t/boolean.t | 84 +++++++++++++++++++++++++++++++++++++++ + t/malice.t | 6 +-- + 7 files changed, 278 insertions(+), 37 deletions(-) + create mode 100644 t/boolean.t + +diff --git a/ChangeLog b/ChangeLog +index b1f4790..6619543 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,32 @@ ++2023-05-26 21:36:00 demerphq ++ version 3.32 ++ * Update security advisory to be more clear ++ ++2023-02-26 00:31:32 demerphq ++ version 3.31 ++ * Fixup for ppport fix in 3.30 ++ ++2023-02-22 09:56:27 leont ++ version 3.30 ++ * Use ppport for all modules in dist. ++ ++2023-01-04 17:33:24 iabyn ++ version 3.29 ++ * Store code fixes identified from refcounted stack patch ++ ++2022-11-08 10:12:46 tony ++ version 3.28 ++ * Store hook error reporting improvements ++ * Store hook handles regex objects properly. ++ ++2022-06-20 20:32:29 toddr ++ version 3.27 ++ * Use cBOOL instead of !! in xs code ++ ++2022-04-18 17:36:00 toddr ++ version 3.26 ++ * Conform to ppport.h 3.68 recommendations ++ + 2021-08-30 07:46:52 nwclark + version 3.25 + * No changes from previous version +diff --git a/Makefile.PL b/Makefile.PL +index e03e141..b705654 100644 +--- a/Makefile.PL ++++ b/Makefile.PL +@@ -29,7 +29,7 @@ WriteMakefile( + 'ExtUtils::MakeMaker' => '6.31', + }, + TEST_REQUIRES => { +- 'Test::More' => '0.41', ++ 'Test::More' => '0.82', + }, + ) + : () ), +diff --git a/Storable.pm b/Storable.pm +index 8e6ab25..d531f2b 100644 +--- a/Storable.pm ++++ b/Storable.pm +@@ -28,7 +28,7 @@ our @EXPORT_OK = qw( + our ($canonical, $forgive_me); + + BEGIN { +- our $VERSION = '3.25'; ++ our $VERSION = '3.32'; + } + + our $recursion_limit; +@@ -1197,11 +1197,16 @@ compartment: + + =head1 SECURITY WARNING + +-B ++B There is ++B way to configure Storable so that it can be used safely to process ++untrusted data. While there I various options that can be used to ++mitigate specific security issues these options do I comprise a ++complete safety net for the user, and processing untrusted data may ++result in segmentation faults, remote code execution, or privilege ++escalation. The following lists some known features which represent ++security issues that should be considered by users of this module. + +-Some features of Storable can lead to security vulnerabilities if you +-accept Storable documents from untrusted sources with the default +-flags. Most obviously, the optional (off by default) CODE reference ++Most obviously, the optional (off by default) CODE reference + serialization feature allows transfer of code to the deserializing + process. Furthermore, any serialized object will cause Storable to + helpfully load the module corresponding to the class of the object in +@@ -1224,12 +1229,15 @@ With the default setting of C<$Storable::flags> = 6, creating or destroying + random objects, even renamed objects can be controlled by an attacker. + See CVE-2015-1592 and its metasploit module. + +-If your application requires accepting data from untrusted sources, +-you are best off with a less powerful and more-likely safe +-serialization format and implementation. If your data is sufficiently +-simple, L, L or L are the best +-choices and offer maximum interoperability, but note that Sereal is +-L. ++If your application requires accepting data from untrusted sources, you ++are best off with a less powerful and more-likely safe serialization ++format and implementation. If your data is sufficiently simple, ++L or L are fine alternatives. For ++more complex data structures containing various Perl specific data types ++like regular expressions or aliased data L is the best ++alternative and offers maximum interoperability. Note that Sereal is ++L, but you can configure ++the encoder and decoder to mitigate any security issues. + + =head1 WARNING + +diff --git a/Storable.xs b/Storable.xs +index 6944b76..a558dd7 100644 +--- a/Storable.xs ++++ b/Storable.xs +@@ -16,18 +16,13 @@ + #include + #include + +-#ifndef PERL_VERSION_LT +-# if !defined(PERL_VERSION) || !defined(PERL_REVISION) || ( PERL_REVISION == 5 && ( PERL_VERSION < 10 || (PERL_VERSION == 10 && PERL_SUBVERSION < 1) ) ) +-# define NEED_PL_parser +-# define NEED_sv_2pv_flags +-# define NEED_load_module +-# define NEED_vload_module +-# define NEED_newCONSTSUB +-# define NEED_newSVpvn_flags +-# define NEED_newRV_noinc +-# endif ++#define NEED_sv_2pv_flags ++#define NEED_load_module ++#define NEED_vload_module ++#define NEED_newCONSTSUB ++#define NEED_newSVpvn_flags ++#define NEED_newRV_noinc + #include "ppport.h" /* handle old perls */ +-#endif + + #ifdef DEBUGGING + #define DEBUGME /* Debug mode, turns assertions on as well */ +@@ -176,7 +171,9 @@ + #define SX_SVUNDEF_ELEM C(31) /* array element set to &PL_sv_undef */ + #define SX_REGEXP C(32) /* Regexp */ + #define SX_LOBJECT C(33) /* Large object: string, array or hash (size >2G) */ +-#define SX_LAST C(34) /* invalid. marker only */ ++#define SX_BOOLEAN_TRUE C(34) /* Boolean true */ ++#define SX_BOOLEAN_FALSE C(35) /* Boolean false */ ++#define SX_LAST C(36) /* invalid. marker only */ + + /* + * Those are only used to retrieve "old" pre-0.6 binary images. +@@ -975,7 +972,7 @@ static const char byteorderstr_56[] = {BYTEORDER_BYTES_56, 0}; + #endif + + #define STORABLE_BIN_MAJOR 2 /* Binary major "version" */ +-#define STORABLE_BIN_MINOR 11 /* Binary minor "version" */ ++#define STORABLE_BIN_MINOR 12 /* Binary minor "version" */ + + #if !defined (SvVOK) + /* +@@ -1454,6 +1451,8 @@ static const sv_retrieve_t sv_old_retrieve[] = { + (sv_retrieve_t)retrieve_other, /* SX_SVUNDEF_ELEM not supported */ + (sv_retrieve_t)retrieve_other, /* SX_REGEXP */ + (sv_retrieve_t)retrieve_other, /* SX_LOBJECT not supported */ ++ (sv_retrieve_t)retrieve_other, /* SX_BOOLEAN_TRUE not supported */ ++ (sv_retrieve_t)retrieve_other, /* SX_BOOLEAN_FALSE not supported */ + (sv_retrieve_t)retrieve_other, /* SX_LAST */ + }; + +@@ -1477,6 +1476,8 @@ static SV *retrieve_weakoverloaded(pTHX_ stcxt_t *cxt, const char *cname); + static SV *retrieve_vstring(pTHX_ stcxt_t *cxt, const char *cname); + static SV *retrieve_lvstring(pTHX_ stcxt_t *cxt, const char *cname); + static SV *retrieve_svundef_elem(pTHX_ stcxt_t *cxt, const char *cname); ++static SV *retrieve_boolean_true(pTHX_ stcxt_t *cxt, const char *cname); ++static SV *retrieve_boolean_false(pTHX_ stcxt_t *cxt, const char *cname); + + static const sv_retrieve_t sv_retrieve[] = { + 0, /* SX_OBJECT -- entry unused dynamically */ +@@ -1513,6 +1514,8 @@ static const sv_retrieve_t sv_retrieve[] = { + (sv_retrieve_t)retrieve_svundef_elem,/* SX_SVUNDEF_ELEM */ + (sv_retrieve_t)retrieve_regexp, /* SX_REGEXP */ + (sv_retrieve_t)retrieve_lobject, /* SX_LOBJECT */ ++ (sv_retrieve_t)retrieve_boolean_true, /* SX_BOOLEAN_TRUE */ ++ (sv_retrieve_t)retrieve_boolean_false, /* SX_BOOLEAN_FALSE */ + (sv_retrieve_t)retrieve_other, /* SX_LAST */ + }; + +@@ -2187,7 +2190,7 @@ static AV *array_call(pTHX_ + XPUSHs(sv_2mortal(newSViv(cloning))); /* Cloning flag */ + PUTBACK; + +- count = call_sv(hook, G_ARRAY); /* Go back to Perl code */ ++ count = call_sv(hook, G_LIST); /* Go back to Perl code */ + + SPAGAIN; + +@@ -2454,6 +2457,16 @@ static int store_scalar(pTHX_ stcxt_t *cxt, SV *sv) + pv = SvPV(sv, len); /* We know it's SvPOK */ + goto string; /* Share code below */ + } ++#ifdef SvIsBOOL ++ } else if (SvIsBOOL(sv)) { ++ TRACEME(("mortal boolean")); ++ if (SvTRUE_nomg_NN(sv)) { ++ PUTMARK(SX_BOOLEAN_TRUE); ++ } ++ else { ++ PUTMARK(SX_BOOLEAN_FALSE); ++ } ++#endif + } else if (flags & SVf_POK) { + /* public string - go direct to string read. */ + goto string_readlen; +@@ -3250,6 +3263,7 @@ static int store_code(pTHX_ stcxt_t *cxt, CV *cv) + CROAK(("Unexpected return value from B::Deparse::coderef2text\n")); + + text = POPs; ++ PUTBACK; + len = SvCUR(text); + reallen = strlen(SvPV_nolen(text)); + +@@ -3318,7 +3332,7 @@ static int get_regexp(pTHX_ stcxt_t *cxt, SV* sv, SV **re, SV **flags) { + XPUSHs(rv); + PUTBACK; + /* optimize to call the XS directly later */ +- count = call_sv((SV*)cv, G_ARRAY); ++ count = call_sv((SV*)cv, G_LIST); + SPAGAIN; + if (count < 2) + CROAK(("re::regexp_pattern returned only %d results", (int)count)); +@@ -3567,7 +3581,10 @@ static int store_hook( + int need_large_oids = 0; + #endif + +- TRACEME(("store_hook, classname \"%s\", tagged #%d", HvNAME_get(pkg), (int)cxt->tagnum)); ++ classname = HvNAME_get(pkg); ++ len = strlen(classname); ++ ++ TRACEME(("store_hook, classname \"%s\", tagged #%d", classname, (int)cxt->tagnum)); + + /* + * Determine object type on 2 bits. +@@ -3576,6 +3593,7 @@ static int store_hook( + switch (type) { + case svis_REF: + case svis_SCALAR: ++ case svis_REGEXP: + obj_type = SHT_SCALAR; + break; + case svis_ARRAY: +@@ -3615,13 +3633,20 @@ static int store_hook( + } + break; + default: +- CROAK(("Unexpected object type (%d) in store_hook()", type)); ++ { ++ /* pkg_can() always returns a ref to a CV on success */ ++ CV *cv = (CV*)SvRV(hook); ++ const GV * const gv = CvGV(cv); ++ const char *gvname = GvNAME(gv); ++ const HV * const stash = GvSTASH(gv); ++ const char *hvname = stash ? HvNAME(stash) : NULL; ++ ++ CROAK(("Unexpected object type (%s) of class '%s' in store_hook() calling %s::%s", ++ sv_reftype(sv, FALSE), classname, hvname, gvname)); ++ } + } + flags = SHF_NEED_RECURSE | obj_type; + +- classname = HvNAME_get(pkg); +- len = strlen(classname); +- + /* + * To call the hook, we need to fake a call like: + * +@@ -5882,6 +5907,50 @@ static SV *retrieve_integer(pTHX_ stcxt_t *cxt, const char *cname) + return sv; + } + ++/* ++ * retrieve_boolean_true ++ * ++ * Retrieve boolean true copy. ++ */ ++static SV *retrieve_boolean_true(pTHX_ stcxt_t *cxt, const char *cname) ++{ ++ SV *sv; ++ HV *stash; ++ ++ TRACEME(("retrieve_boolean_true (#%d)", (int)cxt->tagnum)); ++ ++ sv = newSVsv(&PL_sv_yes); ++ stash = cname ? gv_stashpv(cname, GV_ADD) : 0; ++ SEEN_NN(sv, stash, 0); /* Associate this new scalar with tag "tagnum" */ ++ ++ TRACEME(("boolean true")); ++ TRACEME(("ok (retrieve_boolean_true at 0x%" UVxf ")", PTR2UV(sv))); ++ ++ return sv; ++} ++ ++/* ++ * retrieve_boolean_false ++ * ++ * Retrieve boolean false copy. ++ */ ++static SV *retrieve_boolean_false(pTHX_ stcxt_t *cxt, const char *cname) ++{ ++ SV *sv; ++ HV *stash; ++ ++ TRACEME(("retrieve_boolean_false (#%d)", (int)cxt->tagnum)); ++ ++ sv = newSVsv(&PL_sv_no); ++ stash = cname ? gv_stashpv(cname, GV_ADD) : 0; ++ SEEN_NN(sv, stash, 0); /* Associate this new scalar with tag "tagnum" */ ++ ++ TRACEME(("boolean false")); ++ TRACEME(("ok (retrieve_boolean_false at 0x%" UVxf ")", PTR2UV(sv))); ++ ++ return sv; ++} ++ + /* + * retrieve_lobject + * +@@ -7774,7 +7843,7 @@ CODE: + assert(cxt); + result = cxt->entry && (cxt->optype & ix) ? TRUE : FALSE; + } else { +- result = !!last_op_in_netorder(aTHX); ++ result = cBOOL(last_op_in_netorder(aTHX)); + } + ST(0) = boolSV(result); + +diff --git a/t/blessed.t b/t/blessed.t +index d9a77b3..dea569b 100644 +--- a/t/blessed.t ++++ b/t/blessed.t +@@ -44,7 +44,7 @@ use Storable qw(freeze thaw store retrieve fd_retrieve); + 'long VSTRING' => \(my $lvstring = eval "v" . 0 x 300), + LVALUE => \(my $substr = substr((my $str = "foo"), 0, 3))); + +-my $test = 13; ++my $test = 18; + my $tests = $test + 41 + (2 * 6 * keys %::immortals) + (3 * keys %::weird_refs); + plan(tests => $tests); + +@@ -414,3 +414,54 @@ is(ref $t, 'STRESS_THE_STACK'); + + unlink("store$$"); + } ++ ++{ ++ # trying to freeze a glob via STORABLE_freeze ++ { ++ package GlobHookedBase; ++ ++ sub STORABLE_freeze { ++ return \1; ++ } ++ ++ package GlobHooked; ++ our @ISA = "GlobHookedBase"; ++ } ++ use Symbol (); ++ my $glob = bless Symbol::gensym(), "GlobHooked"; ++ eval { ++ my $data = freeze($glob); ++ }; ++ my $msg = $@; ++ like($msg, qr/Unexpected object type \(GLOB\) of class 'GlobHooked' in store_hook\(\) calling GlobHookedBase::STORABLE_freeze/, ++ "check we get the verbose message"); ++} ++ ++SKIP: ++{ ++ $] < 5.012 ++ and skip "Can't assign regexps directly before 5.12", 4; ++ my $hook_called; ++ # store regexp via hook ++ { ++ package RegexpHooked; ++ sub STORABLE_freeze { ++ ++$hook_called; ++ "$_[0]"; ++ } ++ sub STORABLE_thaw { ++ my ($obj, $cloning, $serialized) = @_; ++ ++$hook_called; ++ $$obj = ${ qr/$serialized/ }; ++ } ++ } ++ ++ my $obj = bless qr/abc/, "RegexpHooked"; ++ my $data = freeze($obj); ++ ok($data, "froze regexp blessed into hooked class"); ++ ok($hook_called, "and the hook was actually called"); ++ $hook_called = 0; ++ my $obj_thawed = thaw($data); ++ ok($hook_called, "hook called for thaw"); ++ like("abc", $obj_thawed, "check the regexp"); ++} +diff --git a/t/boolean.t b/t/boolean.t +new file mode 100644 +index 0000000..9ba19c0 +--- /dev/null ++++ b/t/boolean.t +@@ -0,0 +1,84 @@ ++use strict; ++use warnings; ++ ++my $true_ref; ++my $false_ref; ++BEGIN { ++ $true_ref = \!!1; ++ $false_ref = \!!0; ++} ++ ++BEGIN { ++ unshift @INC, 't'; ++ unshift @INC, 't/compat' if $] < 5.006002; ++ require Config; ++ if ($ENV{PERL_CORE} and $Config::Config{'extensions'} !~ /\bStorable\b/) { ++ print "1..0 # Skip: Storable was not built\n"; ++ exit 0; ++ } ++} ++ ++use Test::More tests => 12; ++use Storable qw(thaw freeze); ++ ++use constant CORE_BOOLS => defined &builtin::is_bool; ++ ++{ ++ my $x = $true_ref; ++ my $y = ${thaw freeze \$x}; ++ is($y, $x); ++ eval { ++ $$y = 2; ++ }; ++ isnt $@, '', ++ 'immortal true maintained as immortal'; ++} ++ ++{ ++ my $x = $false_ref; ++ my $y = ${thaw freeze \$x}; ++ is($y, $x); ++ eval { ++ $$y = 2; ++ }; ++ isnt $@, '', ++ 'immortal false maintained as immortal'; ++} ++ ++{ ++ my $true = $$true_ref; ++ my $x = \$true; ++ my $y = ${thaw freeze \$x}; ++ is($$y, $$x); ++ is($$y, '1'); ++ SKIP: { ++ skip "perl $] does not support tracking boolean values", 1 ++ unless CORE_BOOLS; ++ BEGIN { CORE_BOOLS and warnings->unimport('experimental::builtin') } ++ ok builtin::is_bool($$y); ++ } ++ eval { ++ $$y = 2; ++ }; ++ is $@, '', ++ 'mortal true maintained as mortal'; ++} ++ ++{ ++ my $false = $$false_ref; ++ my $x = \$false; ++ my $y = ${thaw freeze \$x}; ++ is($$y, $$x); ++ is($$y, ''); ++ SKIP: { ++ skip "perl $] does not support tracking boolean values", 1 ++ unless CORE_BOOLS; ++ BEGIN { CORE_BOOLS and warnings->unimport('experimental::builtin') } ++ ok builtin::is_bool($$y); ++ } ++ eval { ++ $$y = 2; ++ }; ++ is $@, '', ++ 'mortal true maintained as mortal'; ++} +diff --git a/t/malice.t b/t/malice.t +index 8adae95..7b92d3d 100644 +--- a/t/malice.t ++++ b/t/malice.t +@@ -32,7 +32,7 @@ our $file_magic_str = 'pst0'; + our $other_magic = 7 + length $byteorder; + our $network_magic = 2; + our $major = 2; +-our $minor = 11; ++our $minor = 12; + our $minor_write = $] >= 5.019 ? 11 : $] > 5.008 ? 9 : $] > 5.005_50 ? 8 : 4; + + use Test::More; +@@ -206,7 +206,7 @@ sub test_things { + $where = $file_magic + $network_magic; + } + +- # Just the header and a tag 255. As 33 is currently the highest tag, this ++ # Just the header and a tag 255. As 34 is currently the highest tag, this + # is "unexpected" + $copy = substr ($contents, 0, $where) . chr 255; + +@@ -226,7 +226,7 @@ sub test_things { + # local $Storable::DEBUGME = 1; + # This is the delayed croak + test_corrupt ($copy, $sub, +- "/^Storable binary image v$header->{major}.$minor6 contains data of type 255. This Storable is v$header->{major}.$minor and can only handle data types up to 33/", ++ "/^Storable binary image v$header->{major}.$minor6 contains data of type 255. This Storable is v$header->{major}.$minor and can only handle data types up to 35/", + "bogus tag, minor plus 4"); + # And check again that this croak is not delayed: + { +-- +2.40.1 + diff --git a/SPECS/perl-Storable.spec b/SPECS/perl-Storable.spec new file mode 100644 index 0000000..a7227e5 --- /dev/null +++ b/SPECS/perl-Storable.spec @@ -0,0 +1,320 @@ +%global base_version 3.25 +Name: perl-Storable +Epoch: 1 +Version: 3.32 +Release: 510%{?dist} +Summary: Persistence for Perl data structures +# Storable.pm: GPL+ or Artistic +License: GPL-1.0-or-later OR Artistic-1.0-Perl +URL: https://metacpan.org/release/Storable +Source0: https://cpan.metacpan.org/authors/id/N/NW/NWCLARK/Storable-%{base_version}.tar.gz +# Unbundled from perl 5.37.12 +Patch0: Storable-3.25-Upgrade-to-3.32.patch +BuildRequires: coreutils +BuildRequires: gcc +BuildRequires: make +BuildRequires: perl-devel +BuildRequires: perl-generators +BuildRequires: perl-interpreter +BuildRequires: perl(Config) +BuildRequires: perl(Cwd) +BuildRequires: perl(ExtUtils::MakeMaker) >= 6.76 +BuildRequires: perl(File::Copy) +BuildRequires: perl(File::Spec) >= 0.8 +BuildRequires: perl(strict) +BuildRequires: perl(warnings) +# Win32 not used on Linux +# Win32API::File not used on Linux +# Run-time: +BuildRequires: perl(Carp) +BuildRequires: perl(Exporter) +# Fcntl is optional, but locking is good +BuildRequires: perl(Fcntl) +BuildRequires: perl(IO::File) +# Log::Agent is optional +BuildRequires: perl(XSLoader) +# Tests: +BuildRequires: perl(base) +BuildRequires: perl(bytes) +BuildRequires: perl(constant) +BuildRequires: perl(File::Temp) +BuildRequires: perl(integer) +BuildRequires: perl(overload) +BuildRequires: perl(utf8) +BuildRequires: perl(Test::More) +BuildRequires: perl(threads) +BuildRequires: perl(Safe) +BuildRequires: perl(Scalar::Util) +BuildRequires: perl(Symbol) +BuildRequires: perl(Tie::Array) +# Optional tests: +# gzip not used +# Data::Dump not used +# Data::Dumper not used +BuildRequires: perl(B::Deparse) >= 0.61 +BuildRequires: perl(Digest::MD5) +BuildRequires: perl(Hash::Util) +# Test::LeakTrace omitted because it's not a core module requried for building +# core Storable. +BuildRequires: perl(Tie::Hash) +Requires: perl(Config) +# Fcntl is optional, but locking is good +Requires: perl(Fcntl) +Requires: perl(IO::File) + +%{?perl_default_filter} + +# Filter modules bundled for tests +%global __provides_exclude_from %{?__provides_exclude_from:%__provides_exclude_from|}^%{_libexecdir} +%global __requires_exclude %{?__requires_exclude:%__requires_exclude|}^perl\\(HAS_OVERLOAD\\) +%global __requires_exclude %{__requires_exclude}|^perl\\(testlib.pl\\) + +%description +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. + +%package tests +Summary: Tests for %{name} +Requires: %{name} = %{?epoch:%{epoch}:}%{version}-%{release} +Requires: perl-Test-Harness +Requires: perl(B::Deparse) >= 0.61 +Requires: perl(Digest::MD5) + +%description tests +Tests from %{name}. Execute them +with "%{_libexecdir}/%{name}/test". + +%prep +%autosetup -p1 -n Storable-%{base_version} + +# Help generators to recognize Perl scripts +for F in t/*.t t/*.pl; do + perl -i -MConfig -ple 'print $Config{startperl} if $. == 1 && !s{\A#!.*perl\b}{$Config{startperl}}' "$F" + chmod +x "$F" +done + +%build +perl Makefile.PL INSTALLDIRS=vendor NO_PACKLIST=1 NO_PERLLOCAL=1 OPTIMIZE="%{optflags}" +%{make_build} + +%install +%{make_install} +find %{buildroot} -type f -name '*.bs' -size 0 -delete +find %{buildroot} -type f -name '*.3pm' -size 0 -delete +%{_fixperms} %{buildroot}/* + +# Install tests +mkdir -p %{buildroot}/%{_libexecdir}/%{name} +cp -a t %{buildroot}/%{_libexecdir}/%{name} +cat > %{buildroot}/%{_libexecdir}/%{name}/test << 'EOF' +#!/bin/bash +set -e +# Some tests write into temporary files/directories. The easiest solution +# is to copy the tests into a writable directory and execute them from there. +DIR=$(mktemp -d) +pushd "$DIR" +cp -a %{_libexecdir}/%{name}/* ./ +prove -I . -j "$(getconf _NPROCESSORS_ONLN)" +popd +rm -rf "$DIR" +EOF +chmod +x %{buildroot}/%{_libexecdir}/%{name}/test + +%check +export HARNESS_OPTIONS=j$(perl -e 'if ($ARGV[0] =~ /.*-j([0-9][0-9]*).*/) {print $1} else {print 1}' -- '%{?_smp_mflags}') +unset PERL_CORE PERL_TEST_MEMORY PERL_RUN_SLOW_TESTS +make test + +%files +%doc ChangeLog README +%{perl_vendorarch}/auto/* +%{perl_vendorarch}/Storable* +%{_mandir}/man3/Storable* + +%files tests +%{_libexecdir}/%{name} + +%changelog +* Thu Jul 18 2024 Jitka Plesnikova - 1:3.32-510 +- Increase release to favour standalone package + +* Mon Jun 24 2024 Troy Dawson - 1:3.32-503 +- Bump release for June 2024 mass rebuild + +* Thu Jan 25 2024 Fedora Release Engineering - 1:3.32-502 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Sun Jan 21 2024 Fedora Release Engineering - 1:3.32-501 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Fri Jul 21 2023 Fedora Release Engineering - 1:3.32-500 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Tue Jul 11 2023 Jitka Plesnikova - 1:3.32-499 +- Increase release to favour standalone package + +* Mon Jun 12 2023 Jitka Plesnikova - 1:3.32-1 +- Upgrade to 3.32 as provided in perl-5.37.12 + +* Thu May 18 2023 Jitka Plesnikova - 1:3.31-1 +- Upgrade to 3.31 as provided in perl-5.37.11 + +* Fri Jan 20 2023 Fedora Release Engineering - 1:3.26-490 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Fri Jul 22 2022 Fedora Release Engineering - 1:3.26-489 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Mon May 30 2022 Jitka Plesnikova - 1:3.26-488 +- Upgrade to 3.26 as provided in perl-5.35.11 + +* Fri Jan 21 2022 Fedora Release Engineering - 1:3.25-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Mon Aug 30 2021 Jitka Plesnikova - 1:3.25-1 +- 3.25 bump +- Package tests + +* Thu Jul 22 2021 Fedora Release Engineering - 1:3.23-478 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Fri May 21 2021 Jitka Plesnikova - 1:3.23-477 +- Upgrade to 3.23 as provided in perl-5.34.0 + +* Wed Jan 27 2021 Fedora Release Engineering - 1:3.21-458 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Tue Jul 28 2020 Fedora Release Engineering - 1:3.21-457 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Mon Jun 22 2020 Jitka Plesnikova - 1:3.21-456 +- Upgrade to 3.21 as provided in perl-5.32.0 + +* Thu Jan 30 2020 Fedora Release Engineering - 1:3.15-443 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Mon Nov 25 2019 Petr Pisar - 1:3.15-442 +- Fix a buffer overflow when processing a vstring longer than 2^31-1 + (Perl GH#17306) + +* Thu Aug 08 2019 Petr Pisar - 1:3.15-441 +- Fix array length check in a store hook + +* Fri Jul 26 2019 Fedora Release Engineering - 1:3.15-440 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Tue Jun 11 2019 Petr Pisar - 1:3.15-439 +- Fix deep cloning regular expression objects (RT#134179) + +* Thu May 30 2019 Jitka Plesnikova - 1:3.15-438 +- Increase release to favour standalone package + +* Wed Apr 24 2019 Petr Pisar - 1:3.15-1 +- 3.15 bump + +* Sat Feb 02 2019 Fedora Release Engineering - 1:3.11-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Mon Jan 07 2019 Petr Pisar - 1:3.11-6 +- Storable-3.11 source archive repackaged without a t/CVE-2015-1592.inc file + (RT#133706) + +* Mon Aug 27 2018 Petr Pisar - 1:3.11-5 +- Fix recursion check (RT#133326) + +* Fri Jul 13 2018 Fedora Release Engineering - 1:3.11-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Tue Jun 26 2018 Jitka Plesnikova - 1:3.11-3 +- Perl 5.28 rebuild + +* Tue Jun 05 2018 Petr Pisar - 1:3.11-2 +- Do not package empty Storable::Limit(3pm) manual page + +* Mon Apr 30 2018 Petr Pisar - 1:3.11-1 +- 3.11 bump + +* Mon Apr 23 2018 Petr Pisar - 1:3.09-1 +- 3.09 bump + +* Thu Apr 19 2018 Petr Pisar - 1:3.06-1 +- 3.06 bump + +* Fri Feb 09 2018 Fedora Release Engineering - 1:2.62-396 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Thu Aug 03 2017 Fedora Release Engineering - 1:2.62-395 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Thu Jul 27 2017 Fedora Release Engineering - 1:2.62-394 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Sat Jun 03 2017 Jitka Plesnikova - 1:2.62-393 +- Perl 5.26 rebuild + +* Thu May 11 2017 Petr Pisar - 1:2.62-1 +- Upgrade to 2.62 as provided in perl-5.25.12 + +* Mon Feb 06 2017 Petr Pisar - 1:2.56-368 +- Fix a stack buffer overflow in deserialization of hooks (RT#130635) +- Fix a memory leak of a class name from retrieve_hook() on an exception + (RT#130635) + +* Tue Dec 20 2016 Petr Pisar - 1:2.56-367 +- Fix crash in Storable when deserializing malformed code reference + (RT#68348, RT#130098) + +* Wed Aug 03 2016 Jitka Plesnikova - 1:2.56-366 +- Avoid loading optional modules from default . (CVE-2016-1238) + +* Sat May 14 2016 Jitka Plesnikova - 1:2.56-365 +- Increase release to favour standalone package + +* Wed May 11 2016 Jitka Plesnikova - 2.56-1 +- 2.56 bump in order to dual-live with perl 5.24 + +* Thu Feb 04 2016 Fedora Release Engineering - 1:2.53-347 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Thu Jun 18 2015 Fedora Release Engineering - 1:2.53-346 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Thu Jun 04 2015 Jitka Plesnikova - 1:2.53-345 +- Increase release to favour standalone package + +* Wed Jun 03 2015 Jitka Plesnikova - 1:2.53-2 +- Perl 5.22 rebuild + +* Wed May 06 2015 Petr Pisar - 1:2.53-1 +- 2.53 bump in order to dual-live with perl 5.22 + +* Wed Sep 03 2014 Jitka Plesnikova - 1:2.51-4 +- Increase Epoch to favour standalone package + +* Tue Aug 26 2014 Jitka Plesnikova - 2.51-3 +- Perl 5.20 rebuild + +* Sun Aug 17 2014 Fedora Release Engineering - 2.51-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Mon Jul 07 2014 Petr Pisar - 2.51-1 +- 2.51 bump + +* Sat Jun 07 2014 Fedora Release Engineering - 2.45-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Sun Aug 04 2013 Fedora Release Engineering - 2.45-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Mon Jul 15 2013 Petr Pisar - 2.45-1 +- 2.45 bump + +* Fri Jul 12 2013 Petr Pisar - 2.39-3 +- Link minimal build-root packages against libperl.so explicitly + +* Tue Jun 11 2013 Petr Pisar - 2.39-2 +- Do not export private libraries + +* Fri May 24 2013 Petr Pisar 2.39-1 +- Specfile autogenerated by cpanspec 1.78.