In perl.git, the branch maint-5.14 has been updated <http://perl5.git.perl.org/perl.git/commitdiff/30ec7de223b6ce7fa555cc898b5f2a8c8e031710?hp=aa489f198c5a1d90ce4dde17566ccbb61c7eb942>
- Log ----------------------------------------------------------------- commit 30ec7de223b6ce7fa555cc898b5f2a8c8e031710 Author: David Mitchell <[email protected]> Date: Sun Mar 3 23:22:28 2013 +0000 Bump copyright year, as it's now 2013 M perl.c commit ed7e6e926ce0c083f44288ba98f38ec46885b9cc Author: David Mitchell <[email protected]> Date: Sun Mar 3 23:07:12 2013 +0000 bump version to RC1 M patchlevel.h commit 7e7fe48100365896684e9c5dd0df46e595bb772d Author: David Mitchell <[email protected]> Date: Sun Mar 3 23:05:16 2013 +0000 Update Module::CoreList for 5.14.4 M dist/Module-CoreList/Changes M dist/Module-CoreList/lib/Module/CoreList.pm M pod/perldelta.pod commit 448da59b241c5821b7de5275096d903cfe13dff2 Author: David Mitchell <[email protected]> Date: Sun Mar 3 20:59:00 2013 +0000 final tidy of perldelta M pod/perldelta.pod commit ccc1261f04a369b34ff7c08841c19f7db9d7166e Author: David Mitchell <[email protected]> Date: Sun Mar 3 20:28:01 2013 +0000 update perldelta with previous two cherrypicks M pod/perldelta.pod commit 78c29bba6adca113363434fac1ad2dc15f32aa8b Author: Andy Dougherty <[email protected]> Date: Wed Jan 16 12:30:43 2013 -0500 Avoid wraparound when casting unsigned size_t to signed ssize_t. Practically, this only affects a perl compiled with 64-bit IVs on a 32-bit system. In that instance a value of count >= 2**31 would turn negative when cast to (ssize_t). (cherry picked from commit 94e529cc4d56863d7272c254a29eda2b002a4335) M perlio.c commit d59e31fc729d8a39a774f03bc6bc457029a7aef2 Author: Yves Orton <[email protected]> Date: Tue Feb 12 10:53:05 2013 +0100 Prevent premature hsplit() calls, and only trigger REHASH after hsplit() Triggering a hsplit due to long chain length allows an attacker to create a carefully chosen set of keys which can cause the hash to use 2 * (2**32) * sizeof(void *) bytes ram. AKA a DOS via memory exhaustion. Doing so also takes non trivial time. Eliminating this check, and only inspecting chain length after a normal hsplit() (triggered when keys>buckets) prevents the attack entirely, and makes such attacks relatively benign. (cherry picked from commit f1220d61455253b170e81427c9d0357831ca0fac) M ext/Hash-Util-FieldHash/t/10_hash.t M hv.c M t/op/hash.t ----------------------------------------------------------------------- Summary of changes: dist/Module-CoreList/Changes | 3 + dist/Module-CoreList/lib/Module/CoreList.pm | 662 ++++++++++++++++++++++++++- ext/Hash-Util-FieldHash/t/10_hash.t | 18 +- hv.c | 35 +-- patchlevel.h | 1 + perl.c | 5 +- perlio.c | 8 +- pod/perldelta.pod | 63 ++- t/op/hash.t | 20 +- 9 files changed, 759 insertions(+), 56 deletions(-) diff --git a/dist/Module-CoreList/Changes b/dist/Module-CoreList/Changes index a2fbd0b..72eeedb 100644 --- a/dist/Module-CoreList/Changes +++ b/dist/Module-CoreList/Changes @@ -1,3 +1,6 @@ +2.49_05 + - Updated for v5.14.4 + 2.49 - Updated for v5.14.0 diff --git a/dist/Module-CoreList/lib/Module/CoreList.pm b/dist/Module-CoreList/lib/Module/CoreList.pm index 9654005..e32907c 100644 --- a/dist/Module-CoreList/lib/Module/CoreList.pm +++ b/dist/Module-CoreList/lib/Module/CoreList.pm @@ -2,7 +2,7 @@ package Module::CoreList; use strict; use vars qw/$VERSION %released %version %families %upstream %bug_tracker %deprecated/; -$VERSION = '2.49_04'; +$VERSION = '2.49_05'; =head1 NAME @@ -171,7 +171,7 @@ Module::CoreList currently covers the 5.000, 5.001, 5.002, 5.003_07, 5.9.0, 5.9.1, 5.9.2, 5.9.3, 5.9.4, 5.9.5, 5.10.0, 5.10.1, 5.11.0, 5.11.1, 5.11.2, 5.11.3, 5.11.4, 5.11.5, 5.12.0, 5.12.1, 5.12.2, 5.12.3, 5.13.0, 5.13.1, 5.13.2, 5.13.3, 5.13.4, 5.13.5, 5.13.6, 5.13.7, 5.13.8, 5.13.9, -5.13.10, 5.13.11, 5.14.0, 5.14.1, 5.14.2 and 5.14.3 releases of perl. +5.13.10, 5.13.11, 5.14.0, 5.14.1, 5.14.2, 5.14.3 and 5.14.4 releases of perl. =head1 HISTORY @@ -351,6 +351,7 @@ sub removed_raw { 5.014001 => '2011-06-16', 5.014002 => '2011-09-26', 5.014003 => '2012-10-12', + 5.014004 => '????-??-??', ); for my $version ( sort { $a <=> $b } keys %released ) { @@ -26327,6 +26328,660 @@ for my $version ( sort { $a <=> $b } keys %released ) { 'warnings' => '1.12', 'warnings::register' => '1.02', }, + 5.014004 => { + 'AnyDBM_File' => '1.00', + 'App::Cpan' => '1.5701', + 'App::Prove' => '3.23', + 'App::Prove::State' => '3.23', + 'App::Prove::State::Result'=> '3.23', + 'App::Prove::State::Result::Test'=> '3.23', + 'Archive::Extract' => '0.48', + 'Archive::Tar' => '1.76', + 'Archive::Tar::Constant'=> '1.76', + 'Archive::Tar::File' => '1.76', + 'Attribute::Handlers' => '0.89', + 'AutoLoader' => '5.71', + 'AutoSplit' => '1.06', + 'B' => '1.29', + 'B::Concise' => '0.83', + 'B::Debug' => '1.16', + 'B::Deparse' => '1.04', + 'B::Lint' => '1.13', + 'B::Lint::Debug' => '1.12', + 'B::Showlex' => '1.03', + 'B::Terse' => '1.05', + 'B::Xref' => '1.02', + 'Benchmark' => '1.12', + 'CGI' => '3.52', + 'CGI::Apache' => '1.01', + 'CGI::Carp' => '3.51', + 'CGI::Cookie' => '1.30', + 'CGI::Fast' => '1.08', + 'CGI::Pretty' => '3.46', + 'CGI::Push' => '1.05', + 'CGI::Switch' => '1.01', + 'CGI::Util' => '3.51', + 'CPAN' => '1.9600_01', + 'CPAN::Author' => '5.5001', + 'CPAN::Bundle' => '5.5', + 'CPAN::CacheMgr' => '5.5001', + 'CPAN::Complete' => '5.5', + 'CPAN::Debug' => '5.5001', + 'CPAN::DeferredCode' => '5.50', + 'CPAN::Distribution' => '1.9602_01', + 'CPAN::Distroprefs' => '6', + 'CPAN::Distrostatus' => '5.5', + 'CPAN::Exception::RecursiveDependency'=> '5.5', + 'CPAN::Exception::blocked_urllist'=> '1.001', + 'CPAN::Exception::yaml_not_installed'=> '5.5', + 'CPAN::FTP' => '5.5005', + 'CPAN::FTP::netrc' => '1.01', + 'CPAN::FirstTime' => '5.5303', + 'CPAN::HTTP::Client' => '1.9600', + 'CPAN::HTTP::Credentials'=> '1.9600', + 'CPAN::HandleConfig' => '5.5003', + 'CPAN::Index' => '1.9600', + 'CPAN::InfoObj' => '5.5', + 'CPAN::Kwalify' => '5.50', + 'CPAN::LWP::UserAgent' => '1.9600', + 'CPAN::Meta' => '2.110440', + 'CPAN::Meta::Converter' => '2.110440', + 'CPAN::Meta::Feature' => '2.110440', + 'CPAN::Meta::History' => '2.110440', + 'CPAN::Meta::Prereqs' => '2.110440', + 'CPAN::Meta::Spec' => '2.110440', + 'CPAN::Meta::Validator' => '2.110440', + 'CPAN::Meta::YAML' => '0.003', + 'CPAN::Mirrors' => '1.9600', + 'CPAN::Module' => '5.5001', + 'CPAN::Nox' => '5.50', + 'CPAN::Prompt' => '5.5', + 'CPAN::Queue' => '5.5001', + 'CPAN::Shell' => '5.5002', + 'CPAN::Tarzip' => '5.5011', + 'CPAN::URL' => '5.5', + 'CPAN::Version' => '5.5001', + 'CPANPLUS' => '0.9103', + 'CPANPLUS::Backend' => undef, + 'CPANPLUS::Backend::RV' => undef, + 'CPANPLUS::Config' => undef, + 'CPANPLUS::Configure' => undef, + 'CPANPLUS::Configure::Setup'=> undef, + 'CPANPLUS::Dist' => undef, + 'CPANPLUS::Dist::Autobundle'=> undef, + 'CPANPLUS::Dist::Base' => undef, + 'CPANPLUS::Dist::Build' => '0.54', + 'CPANPLUS::Dist::Build::Constants'=> '0.54', + 'CPANPLUS::Dist::MM' => undef, + 'CPANPLUS::Dist::Sample'=> undef, + 'CPANPLUS::Error' => undef, + 'CPANPLUS::Internals' => '0.9103', + 'CPANPLUS::Internals::Constants'=> undef, + 'CPANPLUS::Internals::Constants::Report'=> undef, + 'CPANPLUS::Internals::Extract'=> undef, + 'CPANPLUS::Internals::Fetch'=> undef, + 'CPANPLUS::Internals::Report'=> undef, + 'CPANPLUS::Internals::Search'=> undef, + 'CPANPLUS::Internals::Source'=> undef, + 'CPANPLUS::Internals::Source::Memory'=> undef, + 'CPANPLUS::Internals::Source::SQLite'=> undef, + 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef, + 'CPANPLUS::Internals::Utils'=> undef, + 'CPANPLUS::Internals::Utils::Autoflush'=> undef, + 'CPANPLUS::Module' => undef, + 'CPANPLUS::Module::Author'=> undef, + 'CPANPLUS::Module::Author::Fake'=> undef, + 'CPANPLUS::Module::Checksums'=> undef, + 'CPANPLUS::Module::Fake'=> undef, + 'CPANPLUS::Module::Signature'=> undef, + 'CPANPLUS::Selfupdate' => undef, + 'CPANPLUS::Shell' => undef, + 'CPANPLUS::Shell::Classic'=> '0.0562', + 'CPANPLUS::Shell::Default'=> '0.9103', + 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef, + 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef, + 'CPANPLUS::Shell::Default::Plugins::Source'=> undef, + 'Carp' => '1.20', + 'Carp::Heavy' => '1.20', + 'Class::Struct' => '0.63', + 'Compress::Raw::Bzip2' => '2.033', + 'Compress::Raw::Zlib' => '2.033', + 'Compress::Zlib' => '2.033', + 'Config' => undef, + 'Config::Extensions' => '0.01', + 'Cwd' => '3.36', + 'DB' => '1.03', + 'DBM_Filter' => '0.04', + 'DBM_Filter::compress' => '0.02', + 'DBM_Filter::encode' => '0.02', + 'DBM_Filter::int32' => '0.02', + 'DBM_Filter::null' => '0.02', + 'DBM_Filter::utf8' => '0.02', + 'DB_File' => '1.821', + 'Data::Dumper' => '2.130_02', + 'Devel::DProf' => '20110228.00', + 'Devel::DProf::dprof::V'=> undef, + 'Devel::InnerPackage' => '0.3', + 'Devel::PPPort' => '3.19', + 'Devel::Peek' => '1.07', + 'Devel::SelfStubber' => '1.05', + 'Digest' => '1.16_01', + 'Digest::MD5' => '2.51', + 'Digest::SHA' => '5.61', + 'Digest::base' => '1.16', + 'Digest::file' => '1.16', + 'DirHandle' => '1.04', + 'Dumpvalue' => '1.16', + 'DynaLoader' => '1.13', + 'Encode' => '2.42_01', + 'Encode::Alias' => '2.13', + 'Encode::Byte' => '2.04', + 'Encode::CJKConstants' => '2.02', + 'Encode::CN' => '2.03', + 'Encode::CN::HZ' => '2.05', + 'Encode::Config' => '2.05', + 'Encode::EBCDIC' => '2.02', + 'Encode::Encoder' => '2.01', + 'Encode::Encoding' => '2.05', + 'Encode::GSM0338' => '2.01', + 'Encode::Guess' => '2.04', + 'Encode::JP' => '2.04', + 'Encode::JP::H2Z' => '2.02', + 'Encode::JP::JIS7' => '2.04', + 'Encode::KR' => '2.03', + 'Encode::KR::2022_KR' => '2.02', + 'Encode::MIME::Header' => '2.13', + 'Encode::MIME::Header::ISO_2022_JP'=> '1.03', + 'Encode::MIME::Name' => '1.01', + 'Encode::Symbol' => '2.02', + 'Encode::TW' => '2.03', + 'Encode::Unicode' => '2.07', + 'Encode::Unicode::UTF7' => '2.05', + 'English' => '1.04', + 'Env' => '1.02', + 'Errno' => '1.13', + 'Exporter' => '5.64_03', + 'Exporter::Heavy' => '5.64_03', + 'ExtUtils::CBuilder' => '0.280203', + 'ExtUtils::CBuilder::Base'=> '0.280203', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280203', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280203', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280203', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280203', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280203', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280203', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280203', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280203', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280203', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280203', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280203', + 'ExtUtils::Command' => '1.17', + 'ExtUtils::Command::MM' => '6.57_05', + 'ExtUtils::Constant' => '0.23', + 'ExtUtils::Constant::Base'=> '0.05', + 'ExtUtils::Constant::ProxySubs'=> '0.08', + 'ExtUtils::Constant::Utils'=> '0.03', + 'ExtUtils::Constant::XS'=> '0.03', + 'ExtUtils::Embed' => '1.30', + 'ExtUtils::Install' => '1.56', + 'ExtUtils::Installed' => '1.999_001', + 'ExtUtils::Liblist' => '6.57_05', + 'ExtUtils::Liblist::Kid'=> '6.5705', + 'ExtUtils::MM' => '6.57_05', + 'ExtUtils::MM_AIX' => '6.57_05', + 'ExtUtils::MM_Any' => '6.57_05', + 'ExtUtils::MM_BeOS' => '6.57_05', + 'ExtUtils::MM_Cygwin' => '6.57_05', + 'ExtUtils::MM_DOS' => '6.5705', + 'ExtUtils::MM_Darwin' => '6.57_05', + 'ExtUtils::MM_MacOS' => '6.5705', + 'ExtUtils::MM_NW5' => '6.57_05', + 'ExtUtils::MM_OS2' => '6.57_05', + 'ExtUtils::MM_QNX' => '6.57_05', + 'ExtUtils::MM_UWIN' => '6.5705', + 'ExtUtils::MM_Unix' => '6.57_05', + 'ExtUtils::MM_VMS' => '6.57_05', + 'ExtUtils::MM_VOS' => '6.57_05', + 'ExtUtils::MM_Win32' => '6.57_05', + 'ExtUtils::MM_Win95' => '6.57_05', + 'ExtUtils::MY' => '6.5705', + 'ExtUtils::MakeMaker' => '6.57_05', + 'ExtUtils::MakeMaker::Config'=> '6.57_05', + 'ExtUtils::MakeMaker::YAML'=> '1.44', + 'ExtUtils::Manifest' => '1.58', + 'ExtUtils::Miniperl' => undef, + 'ExtUtils::Mkbootstrap' => '6.57_05', + 'ExtUtils::Mksymlists' => '6.57_05', + 'ExtUtils::Packlist' => '1.44', + 'ExtUtils::ParseXS' => '2.2210', + 'ExtUtils::XSSymSet' => '1.2', + 'ExtUtils::testlib' => '6.5705', + 'Fatal' => '2.1001', + 'Fcntl' => '1.11', + 'File::Basename' => '2.82', + 'File::CheckTree' => '4.41', + 'File::Compare' => '1.1006', + 'File::Copy' => '2.21', + 'File::DosGlob' => '1.04', + 'File::Fetch' => '0.32', + 'File::Find' => '1.19', + 'File::Glob' => '1.13', + 'File::GlobMapper' => '1.000', + 'File::Path' => '2.08_01', + 'File::Spec' => '3.33', + 'File::Spec::Cygwin' => '3.33', + 'File::Spec::Epoc' => '3.33', + 'File::Spec::Functions' => '3.33', + 'File::Spec::Mac' => '3.34', + 'File::Spec::OS2' => '3.33', + 'File::Spec::Unix' => '3.33', + 'File::Spec::VMS' => '3.34', + 'File::Spec::Win32' => '3.33', + 'File::Temp' => '0.22', + 'File::stat' => '1.05', + 'FileCache' => '1.08', + 'FileHandle' => '2.02', + 'Filter::Simple' => '0.86', + 'Filter::Util::Call' => '1.08', + 'FindBin' => '1.50', + 'GDBM_File' => '1.14', + 'Getopt::Long' => '2.38', + 'Getopt::Std' => '1.06', + 'HTTP::Tiny' => '0.012', + 'Hash::Util' => '0.11', + 'Hash::Util::FieldHash' => '1.09', + 'I18N::Collate' => '1.02', + 'I18N::LangTags' => '0.35_01', + 'I18N::LangTags::Detect'=> '1.05', + 'I18N::LangTags::List' => '0.35_01', + 'I18N::Langinfo' => '0.08', + 'IO' => '1.25_04', + 'IO::Compress::Adapter::Bzip2'=> '2.033', + 'IO::Compress::Adapter::Deflate'=> '2.033', + 'IO::Compress::Adapter::Identity'=> '2.033', + 'IO::Compress::Base' => '2.033', + 'IO::Compress::Base::Common'=> '2.033', + 'IO::Compress::Bzip2' => '2.033', + 'IO::Compress::Deflate' => '2.033', + 'IO::Compress::Gzip' => '2.033', + 'IO::Compress::Gzip::Constants'=> '2.033', + 'IO::Compress::RawDeflate'=> '2.033', + 'IO::Compress::Zip' => '2.033', + 'IO::Compress::Zip::Constants'=> '2.033', + 'IO::Compress::Zlib::Constants'=> '2.033', + 'IO::Compress::Zlib::Extra'=> '2.033', + 'IO::Dir' => '1.08', + 'IO::File' => '1.15', + 'IO::Handle' => '1.31', + 'IO::Pipe' => '1.14', + 'IO::Poll' => '0.08', + 'IO::Seekable' => '1.10', + 'IO::Select' => '1.20', + 'IO::Socket' => '1.32', + 'IO::Socket::INET' => '1.31', + 'IO::Socket::UNIX' => '1.23', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.033', + 'IO::Uncompress::Adapter::Identity'=> '2.033', + 'IO::Uncompress::Adapter::Inflate'=> '2.033', + 'IO::Uncompress::AnyInflate'=> '2.033', + 'IO::Uncompress::AnyUncompress'=> '2.033', + 'IO::Uncompress::Base' => '2.033', + 'IO::Uncompress::Bunzip2'=> '2.033', + 'IO::Uncompress::Gunzip'=> '2.033', + 'IO::Uncompress::Inflate'=> '2.033', + 'IO::Uncompress::RawInflate'=> '2.033', + 'IO::Uncompress::Unzip' => '2.033', + 'IO::Zlib' => '1.10', + 'IPC::Cmd' => '0.70', + 'IPC::Msg' => '2.03', + 'IPC::Open2' => '1.03', + 'IPC::Open3' => '1.0901', + 'IPC::Semaphore' => '2.03', + 'IPC::SharedMem' => '2.03', + 'IPC::SysV' => '2.03', + 'JSON::PP' => '2.27105', + 'JSON::PP::Boolean' => undef, + 'List::Util' => '1.23', + 'List::Util::PP' => '1.23', + 'List::Util::XS' => '1.23', + 'Locale::Codes' => '3.16', + 'Locale::Codes::Country'=> '3.16', + 'Locale::Codes::Currency'=> '3.16', + 'Locale::Codes::Language'=> '3.16', + 'Locale::Codes::Script' => '3.16', + 'Locale::Constants' => '3.16', + 'Locale::Country' => '3.16', + 'Locale::Currency' => '3.16', + 'Locale::Language' => '3.16', + 'Locale::Maketext' => '1.19', + 'Locale::Maketext::Guts'=> '1.17', + 'Locale::Maketext::GutsLoader'=> '1.17', + 'Locale::Maketext::Simple'=> '0.21', + 'Locale::Script' => '3.16', + 'Log::Message' => '0.04', + 'Log::Message::Config' => '0.04', + 'Log::Message::Handlers'=> '0.04', + 'Log::Message::Item' => '0.04', + 'Log::Message::Simple' => '0.08', + 'MIME::Base64' => '3.13', + 'MIME::QuotedPrint' => '3.13', + 'Math::BigFloat' => '1.993', + 'Math::BigFloat::Trace' => '0.01', + 'Math::BigInt' => '1.994', + 'Math::BigInt::Calc' => '1.993', + 'Math::BigInt::CalcEmu' => '1.993', + 'Math::BigInt::FastCalc'=> '0.28', + 'Math::BigInt::Trace' => '0.01', + 'Math::BigRat' => '0.26_02', + 'Math::Complex' => '1.56', + 'Math::Trig' => '1.2', + 'Memoize' => '1.02', + 'Memoize::AnyDBM_File' => '1.02', + 'Memoize::Expire' => '1.02', + 'Memoize::ExpireFile' => '1.02', + 'Memoize::ExpireTest' => '1.02', + 'Memoize::NDBM_File' => '1.02', + 'Memoize::SDBM_File' => '1.02', + 'Memoize::Storable' => '1.02', + 'Module::Build' => '0.3800', + 'Module::Build::Base' => '0.3800', + 'Module::Build::Compat' => '0.3800', + 'Module::Build::Config' => '0.3800', + 'Module::Build::ConfigData'=> undef, + 'Module::Build::Cookbook'=> '0.3800', + 'Module::Build::Dumper' => '0.3800', + 'Module::Build::ModuleInfo'=> '0.3800', + 'Module::Build::Notes' => '0.3800', + 'Module::Build::PPMMaker'=> '0.3800', + 'Module::Build::Platform::Amiga'=> '0.3800', + 'Module::Build::Platform::Default'=> '0.3800', + 'Module::Build::Platform::EBCDIC'=> '0.3800', + 'Module::Build::Platform::MPEiX'=> '0.3800', + 'Module::Build::Platform::MacOS'=> '0.3800', + 'Module::Build::Platform::RiscOS'=> '0.3800', + 'Module::Build::Platform::Unix'=> '0.3800', + 'Module::Build::Platform::VMS'=> '0.3800', + 'Module::Build::Platform::VOS'=> '0.3800', + 'Module::Build::Platform::Windows'=> '0.3800', + 'Module::Build::Platform::aix'=> '0.3800', + 'Module::Build::Platform::cygwin'=> '0.3800', + 'Module::Build::Platform::darwin'=> '0.3800', + 'Module::Build::Platform::os2'=> '0.3800', + 'Module::Build::PodParser'=> '0.3800', + 'Module::Build::Version'=> '0.87', + 'Module::Build::YAML' => '1.41', + 'Module::CoreList' => '2.49_05', + 'Module::Load' => '0.18', + 'Module::Load::Conditional'=> '0.44', + 'Module::Loaded' => '0.06', + 'Module::Metadata' => '1.000004', + 'Module::Pluggable' => '3.9', + 'Module::Pluggable::Object'=> '3.9', + 'Moped::Msg' => '0.01', + 'NDBM_File' => '1.12', + 'NEXT' => '0.65', + 'Net::Cmd' => '2.29', + 'Net::Config' => '1.11', + 'Net::Domain' => '2.20', + 'Net::FTP' => '2.77', + 'Net::FTP::A' => '1.18', + 'Net::FTP::E' => '0.01', + 'Net::FTP::I' => '1.12', + 'Net::FTP::L' => '0.01', + 'Net::FTP::dataconn' => '0.11', + 'Net::NNTP' => '2.24', + 'Net::Netrc' => '2.12', + 'Net::POP3' => '2.29', + 'Net::Ping' => '2.38', + 'Net::SMTP' => '2.31', + 'Net::Time' => '2.10', + 'Net::hostent' => '1.01', + 'Net::netent' => '1.00', + 'Net::protoent' => '1.00', + 'Net::servent' => '1.01', + 'O' => '1.01', + 'ODBM_File' => '1.10', + 'Object::Accessor' => '0.38', + 'Opcode' => '1.18', + 'POSIX' => '1.24', + 'Package::Constants' => '0.02', + 'Params::Check' => '0.28', + 'Parse::CPAN::Meta' => '1.4401', + 'Perl::OSType' => '1.002', + 'PerlIO' => '1.07', + 'PerlIO::encoding' => '0.14', + 'PerlIO::scalar' => '0.11_01', + 'PerlIO::via' => '0.11', + 'PerlIO::via::QuotedPrint'=> '0.06', + 'Pod::Checker' => '1.45', + 'Pod::Escapes' => '1.04', + 'Pod::Find' => '1.35', + 'Pod::Functions' => '1.04', + 'Pod::Html' => '1.11', + 'Pod::InputObjects' => '1.31', + 'Pod::LaTeX' => '0.59', + 'Pod::Man' => '2.25', + 'Pod::ParseLink' => '1.10', + 'Pod::ParseUtils' => '1.36', + 'Pod::Parser' => '1.37', + 'Pod::Perldoc' => '3.15_04', + 'Pod::Perldoc::BaseTo' => undef, + 'Pod::Perldoc::GetOptsOO'=> undef, + 'Pod::Perldoc::ToChecker'=> undef, + 'Pod::Perldoc::ToMan' => undef, + 'Pod::Perldoc::ToNroff' => undef, + 'Pod::Perldoc::ToPod' => undef, + 'Pod::Perldoc::ToRtf' => undef, + 'Pod::Perldoc::ToText' => undef, + 'Pod::Perldoc::ToTk' => undef, + 'Pod::Perldoc::ToXml' => undef, + 'Pod::PlainText' => '2.04', + 'Pod::Select' => '1.36', + 'Pod::Simple' => '3.16', + 'Pod::Simple::BlackBox' => '3.16', + 'Pod::Simple::Checker' => '3.16', + 'Pod::Simple::Debug' => '3.16', + 'Pod::Simple::DumpAsText'=> '3.16', + 'Pod::Simple::DumpAsXML'=> '3.16', + 'Pod::Simple::HTML' => '3.16', + 'Pod::Simple::HTMLBatch'=> '3.16', + 'Pod::Simple::HTMLLegacy'=> '5.01', + 'Pod::Simple::LinkSection'=> '3.16', + 'Pod::Simple::Methody' => '3.16', + 'Pod::Simple::Progress' => '3.16', + 'Pod::Simple::PullParser'=> '3.16', + 'Pod::Simple::PullParserEndToken'=> '3.16', + 'Pod::Simple::PullParserStartToken'=> '3.16', + 'Pod::Simple::PullParserTextToken'=> '3.16', + 'Pod::Simple::PullParserToken'=> '3.16', + 'Pod::Simple::RTF' => '3.16', + 'Pod::Simple::Search' => '3.16', + 'Pod::Simple::SimpleTree'=> '3.16', + 'Pod::Simple::Text' => '3.16', + 'Pod::Simple::TextContent'=> '3.16', + 'Pod::Simple::TiedOutFH'=> '3.16', + 'Pod::Simple::Transcode'=> '3.16', + 'Pod::Simple::TranscodeDumb'=> '3.16', + 'Pod::Simple::TranscodeSmart'=> '3.16', + 'Pod::Simple::XHTML' => '3.16', + 'Pod::Simple::XMLOutStream'=> '3.16', + 'Pod::Text' => '3.15', + 'Pod::Text::Color' => '2.06', + 'Pod::Text::Overstrike' => '2.04', + 'Pod::Text::Termcap' => '2.06', + 'Pod::Usage' => '1.36', + 'SDBM_File' => '1.09', + 'Safe' => '2.29', + 'Scalar::Util' => '1.23', + 'Scalar::Util::PP' => '1.23', + 'Search::Dict' => '1.03', + 'SelectSaver' => '1.02', + 'SelfLoader' => '1.18', + 'Shell' => '0.72_01', + 'Socket' => '1.94', + 'Storable' => '2.27', + 'Symbol' => '1.07', + 'Sys::Hostname' => '1.16', + 'Sys::Syslog' => '0.27', + 'Sys::Syslog::win32::Win32'=> undef, + 'TAP::Base' => '3.23', + 'TAP::Formatter::Base' => '3.23', + 'TAP::Formatter::Color' => '3.23', + 'TAP::Formatter::Console'=> '3.23', + 'TAP::Formatter::Console::ParallelSession'=> '3.23', + 'TAP::Formatter::Console::Session'=> '3.23', + 'TAP::Formatter::File' => '3.23', + 'TAP::Formatter::File::Session'=> '3.23', + 'TAP::Formatter::Session'=> '3.23', + 'TAP::Harness' => '3.23', + 'TAP::Object' => '3.23', + 'TAP::Parser' => '3.23', + 'TAP::Parser::Aggregator'=> '3.23', + 'TAP::Parser::Grammar' => '3.23', + 'TAP::Parser::Iterator' => '3.23', + 'TAP::Parser::Iterator::Array'=> '3.23', + 'TAP::Parser::Iterator::Process'=> '3.23', + 'TAP::Parser::Iterator::Stream'=> '3.23', + 'TAP::Parser::IteratorFactory'=> '3.23', + 'TAP::Parser::Multiplexer'=> '3.23', + 'TAP::Parser::Result' => '3.23', + 'TAP::Parser::Result::Bailout'=> '3.23', + 'TAP::Parser::Result::Comment'=> '3.23', + 'TAP::Parser::Result::Plan'=> '3.23', + 'TAP::Parser::Result::Pragma'=> '3.23', + 'TAP::Parser::Result::Test'=> '3.23', + 'TAP::Parser::Result::Unknown'=> '3.23', + 'TAP::Parser::Result::Version'=> '3.23', + 'TAP::Parser::Result::YAML'=> '3.23', + 'TAP::Parser::ResultFactory'=> '3.23', + 'TAP::Parser::Scheduler'=> '3.23', + 'TAP::Parser::Scheduler::Job'=> '3.23', + 'TAP::Parser::Scheduler::Spinner'=> '3.23', + 'TAP::Parser::Source' => '3.23', + 'TAP::Parser::SourceHandler'=> '3.23', + 'TAP::Parser::SourceHandler::Executable'=> '3.23', + 'TAP::Parser::SourceHandler::File'=> '3.23', + 'TAP::Parser::SourceHandler::Handle'=> '3.23', + 'TAP::Parser::SourceHandler::Perl'=> '3.23', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.23', + 'TAP::Parser::Utils' => '3.23', + 'TAP::Parser::YAMLish::Reader'=> '3.23', + 'TAP::Parser::YAMLish::Writer'=> '3.23', + 'Term::ANSIColor' => '3.00', + 'Term::Cap' => '1.12', + 'Term::Complete' => '1.402', + 'Term::ReadLine' => '1.07', + 'Term::UI' => '0.26', + 'Term::UI::History' => undef, + 'Test' => '1.25_02', + 'Test::Builder' => '0.98', + 'Test::Builder::Module' => '0.98', + 'Test::Builder::Tester' => '1.22', + 'Test::Builder::Tester::Color'=> '1.22', + 'Test::Harness' => '3.23', + 'Test::More' => '0.98', + 'Test::Simple' => '0.98', + 'Text::Abbrev' => '1.01', + 'Text::Balanced' => '2.02', + 'Text::ParseWords' => '3.27', + 'Text::Soundex' => '3.03_01', + 'Text::Tabs' => '2009.0305', + 'Text::Wrap' => '2009.0305', + 'Thread' => '3.02', + 'Thread::Queue' => '2.12', + 'Thread::Semaphore' => '2.12', + 'Tie::Array' => '1.04', + 'Tie::File' => '0.97_02', + 'Tie::Handle' => '4.2', + 'Tie::Hash' => '1.04', + 'Tie::Hash::NamedCapture'=> '0.08', + 'Tie::Memoize' => '1.1', + 'Tie::RefHash' => '1.39', + 'Tie::Scalar' => '1.02', + 'Tie::StdHandle' => '4.2', + 'Tie::SubstrHash' => '1.00', + 'Time::HiRes' => '1.9721_01', + 'Time::Local' => '1.2000', + 'Time::Piece' => '1.20_01', + 'Time::Piece::Seconds' => undef, + 'Time::Seconds' => undef, + 'Time::gmtime' => '1.03', + 'Time::localtime' => '1.02', + 'Time::tm' => '1.00', + 'UNIVERSAL' => '1.08', + 'Unicode' => '6.0.0', + 'Unicode::Collate' => '0.73', + 'Unicode::Collate::CJK::Big5'=> '0.65', + 'Unicode::Collate::CJK::GB2312'=> '0.65', + 'Unicode::Collate::CJK::JISX0208'=> '0.64', + 'Unicode::Collate::CJK::Korean'=> '0.66', + 'Unicode::Collate::CJK::Pinyin'=> '0.65', + 'Unicode::Collate::CJK::Stroke'=> '0.65', + 'Unicode::Collate::Locale'=> '0.73', + 'Unicode::Normalize' => '1.10', + 'Unicode::UCD' => '0.32', + 'User::grent' => '1.01', + 'User::pwent' => '1.00', + 'VMS::DCLsym' => '1.05', + 'VMS::Filespec' => '1.12', + 'VMS::Stdio' => '2.4', + 'Version::Requirements' => '0.101020', + 'Win32' => '0.44', + 'Win32API::File' => '0.1101', + 'Win32API::File::ExtUtils::Myconst2perl'=> '1', + 'Win32CORE' => '0.02', + 'XS::APItest' => '0.28', + 'XS::Typemap' => '0.05', + 'XSLoader' => '0.13', + 'XSLoader::XSLoader' => '0.13', + 'attributes' => '0.14', + 'autodie' => '2.1001', + 'autodie::exception' => '2.1001', + 'autodie::exception::system'=> '2.1001', + 'autodie::hints' => '2.1001', + 'autouse' => '1.06', + 'base' => '2.16', + 'bigint' => '0.27', + 'bignum' => '0.27', + 'bigrat' => '0.28', + 'blib' => '1.06', + 'bytes' => '1.04', + 'charnames' => '1.18', + 'constant' => '1.21', + 'deprecate' => '0.02', + 'diagnostics' => '1.22', + 'encoding' => '2.6_01', + 'encoding::warnings' => '0.11', + 'feature' => '1.20', + 'fields' => '2.15', + 'filetest' => '1.02', + 'if' => '0.0601', + 'inc::latest' => '0.3800', + 'integer' => '1.00', + 'less' => '0.03', + 'lib' => '0.63', + 'locale' => '1.00', + 'mro' => '1.07', + 'open' => '1.08', + 'ops' => '1.02', + 'overload' => '1.13', + 'overload::numbers' => undef, + 'overloading' => '0.01', + 'parent' => '0.225', + 're' => '0.18', + 'sigtrap' => '1.05', + 'sort' => '2.01', + 'strict' => '1.04', + 'subs' => '1.00', + 'threads' => '1.83', + 'threads::shared' => '1.37', + 'utf8' => '1.09', + 'vars' => '1.02', + 'version' => '0.88', + 'vmsish' => '1.02', + 'warnings' => '1.12', + 'warnings::register' => '1.02', + }, ); %deprecated = ( @@ -26441,6 +27096,9 @@ for my $version ( sort { $a <=> $b } keys %released ) { 5.014003 => { 'Shell' => '1', }, + 5.014004 => { + 'Shell' => '1', + }, ); %upstream = ( diff --git a/ext/Hash-Util-FieldHash/t/10_hash.t b/ext/Hash-Util-FieldHash/t/10_hash.t index 2cfb4e8..d58f053 100644 --- a/ext/Hash-Util-FieldHash/t/10_hash.t +++ b/ext/Hash-Util-FieldHash/t/10_hash.t @@ -38,15 +38,29 @@ use constant START => "a"; # some initial hash data fieldhash my %h2; -%h2 = map {$_ => 1} 'a'..'cc'; +my $counter= "a"; +$h2{$counter++}++ while $counter ne 'cd'; ok (!Internals::HvREHASH(%h2), "starting with pre-populated non-pathological hash (rehash flag if off)"); my @keys = get_keys(\%h2); +my $buckets= buckets(\%h2); $h2{$_}++ for @keys; +$h2{$counter++}++ while buckets(\%h2) == $buckets; # force a split ok (Internals::HvREHASH(%h2), - scalar(@keys) . " colliding into the same bucket keys are triggering rehash"); + scalar(@keys) . " colliding into the same bucket keys are triggering rehash after split"); + +# returns the number of buckets in a hash +sub buckets { + my $hr = shift; + my $keys_buckets= scalar(%$hr); + if ($keys_buckets=~m!/([0-9]+)\z!) { + return 0+$1; + } else { + return 8; + } +} sub get_keys { my $hr = shift; diff --git a/hv.c b/hv.c index 2be1feb..abb9d76 100644 --- a/hv.c +++ b/hv.c @@ -35,7 +35,8 @@ holds the key and hash value. #define PERL_HASH_INTERNAL_ACCESS #include "perl.h" -#define HV_MAX_LENGTH_BEFORE_SPLIT 14 +#define HV_MAX_LENGTH_BEFORE_REHASH 14 +#define SHOULD_DO_HSPLIT(xhv) ((xhv)->xhv_keys > (xhv)->xhv_max) /* HvTOTALKEYS(hv) > HvMAX(hv) */ static const char S_strtab_error[] = "Cannot modify shared string table in hv_%s"; @@ -794,29 +795,9 @@ Perl_hv_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, if (masked_flags & HVhek_ENABLEHVKFLAGS) HvHASKFLAGS_on(hv); - { - const HE *counter = HeNEXT(entry); - - xhv->xhv_keys++; /* HvTOTALKEYS(hv)++ */ - if (!counter) { /* initial entry? */ - } else if (xhv->xhv_keys > xhv->xhv_max) { - /* Use only the old HvKEYS(hv) > HvMAX(hv) condition to limit - bucket splits on a rehashed hash, as we're not going to - split it again, and if someone is lucky (evil) enough to - get all the keys in one list they could exhaust our memory - as we repeatedly double the number of buckets on every - entry. Linear search feels a less worse thing to do. */ - hsplit(hv); - } else if(!HvREHASH(hv)) { - U32 n_links = 1; - - while ((counter = HeNEXT(counter))) - n_links++; - - if (n_links > HV_MAX_LENGTH_BEFORE_SPLIT) { - hsplit(hv); - } - } + xhv->xhv_keys++; /* HvTOTALKEYS(hv)++ */ + if ( SHOULD_DO_HSPLIT(xhv) ) { + hsplit(hv); } if (return_svp) { @@ -1192,7 +1173,7 @@ S_hsplit(pTHX_ HV *hv) /* Pick your policy for "hashing isn't working" here: */ - if (longest_chain <= HV_MAX_LENGTH_BEFORE_SPLIT /* split worked? */ + if (longest_chain <= HV_MAX_LENGTH_BEFORE_REHASH /* split worked? */ || HvREHASH(hv)) { return; } @@ -2831,8 +2812,8 @@ S_share_hek_flags(pTHX_ const char *str, I32 len, register U32 hash, int flags) xhv->xhv_keys++; /* HvTOTALKEYS(hv)++ */ if (!next) { /* initial entry? */ - } else if (xhv->xhv_keys > xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */) { - hsplit(PL_strtab); + } else if ( SHOULD_DO_HSPLIT(xhv) ) { + hsplit(PL_strtab); } } diff --git a/patchlevel.h b/patchlevel.h index 4d9cd6d..7d8681d 100644 --- a/patchlevel.h +++ b/patchlevel.h @@ -133,6 +133,7 @@ hunk. # endif static const char * const local_patches[] = { NULL + ,"RC1" #ifdef PERL_GIT_UNCOMMITTED_CHANGES ,"uncommitted-changes" #endif diff --git a/perl.c b/perl.c index fb2c408..b19fe07 100644 --- a/perl.c +++ b/perl.c @@ -2,7 +2,8 @@ /* perl.c * * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 - * 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 + * 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, + * 2013 * by Larry Wall and others * * You may distribute under the terms of either the GNU General Public @@ -3337,7 +3338,7 @@ Perl_moreswitches(pTHX_ const char *s) #endif PerlIO_printf(PerlIO_stdout(), - "\n\nCopyright 1987-2012, Larry Wall\n"); + "\n\nCopyright 1987-2013, Larry Wall\n"); #ifdef MSDOS PerlIO_printf(PerlIO_stdout(), "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n"); diff --git a/perlio.c b/perlio.c index e42a78f..6c40e34 100644 --- a/perlio.c +++ b/perlio.c @@ -2192,7 +2192,7 @@ PerlIOBase_read(pTHX_ PerlIO *f, void *vbuf, Size_t count) SSize_t avail = PerlIO_get_cnt(f); SSize_t take = 0; if (avail > 0) - take = ((SSize_t)count < avail) ? (SSize_t)count : avail; + take = (((SSize_t) count >= 0) && ((SSize_t)count < avail)) ? (SSize_t)count : avail; if (take > 0) { STDCHAR *ptr = PerlIO_get_ptr(f); Copy(ptr, buf, take, STDCHAR); @@ -4125,7 +4125,7 @@ PerlIOBuf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count) */ b->posn -= b->bufsiz; } - if (avail > (SSize_t) count) { + if ((SSize_t) count >= 0 && avail > (SSize_t) count) { /* * If we have space for more than count, just move count */ @@ -4175,7 +4175,7 @@ PerlIOBuf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count) } while (count > 0) { SSize_t avail = b->bufsiz - (b->ptr - b->buf); - if ((SSize_t) count < avail) + if ((SSize_t) count >= 0 && (SSize_t) count < avail) avail = count; if (flushptr > buf && flushptr <= buf + avail) avail = flushptr - buf; @@ -4450,7 +4450,7 @@ PerlIOPending_read(pTHX_ PerlIO *f, void *vbuf, Size_t count) { SSize_t avail = PerlIO_get_cnt(f); SSize_t got = 0; - if ((SSize_t)count < avail) + if ((SSize_t) count >= 0 && (SSize_t)count < avail) avail = count; if (avail > 0) got = PerlIOBuf_read(aTHX_ f, vbuf, avail); diff --git a/pod/perldelta.pod b/pod/perldelta.pod index c3e7ca5..4f55fde 100644 --- a/pod/perldelta.pod +++ b/pod/perldelta.pod @@ -13,24 +13,28 @@ If you are upgrading from an earlier release such as 5.12.0, first read L<perl5140delta>, which describes differences between 5.12.0 and 5.14.0. -=head1 Notice - -XXX Any important notices here - =head1 Core Enhancements No changes since 5.14.0. =head1 Security -This release contains a number of minor security fixes. These are -included mainly to allow the test suite to pass cleanly with the clang -compiler's address sanitizer facility. +This release contains one major and a number of minor security fixes. +The latter are included mainly to allow the test suite to pass cleanly +with the clang compiler's address sanitizer facility. + +=head2 CVE-2013-1667: memory exhaustion with arbitrary hash keys + +With a carefully crafted set of hash keys (for example arguments on a +URL), it is possible to cause a hash to consume a large amount of memory +and CPU, and thus possibly to achieve a Denial-of-Service. + +This problem has been fixed. =head2 [perl #111594] Socket::unpack_sockaddr_un heap-buffer-overflow -A read buffer overflow could occur when copying sockaddr buffers. Fairly -harmless. +A read buffer overflow could occur when copying C<sockaddr> buffers. +Fairly harmless. This problem has been fixed. @@ -57,8 +61,15 @@ This problem has been fixed. =head2 [perl #115992] PL_eval_start use-after-free -The statement C<local $[;>, when preceded by an eval, and when not part of -an assignment, could crash. Fairly harmless. +The statement C<local $[;>, when preceded by an C<eval>, and when not part +of an assignment, could crash. Fairly harmless. + +This problem has been fixed. + +=head2 wrap-around with IO on long strings + +Reading or writing strings greater than 2**31 bytes in size could segfault +due to integer wraparound. This problem has been fixed. @@ -92,7 +103,7 @@ L</Security> (version numbers have not changed): =back -L<Module::CoreList> has been updated to version 2.XXX to add data for +L<Module::CoreList> has been updated to version 2.49_05 to add data for this release. =head2 Removed Modules and Pragmata @@ -137,9 +148,10 @@ None. =item VMS -5.14.3 failed to compile on VMS due to incomplete application of a patch series -that allowed userelocatableinc and usesitecustomize to be used simultaneously. -Other platforms were not affected and the problem has now been corrected. +5.14.3 failed to compile on VMS due to incomplete application of a patch +series that allowed C<userelocatableinc> and C<usesitecustomize> to be +used simultaneously. Other platforms were not affected and the problem +has now been corrected. =back @@ -162,7 +174,26 @@ None. =head1 Acknowledgements -XXX The list of people to thank goes here. +Perl 5.14.4 represents approximately 5 months of development since Perl 5.14.3 +and contains approximately 1,100 lines of changes across 44 files from 11 +authors. + +Perl continues to flourish into its third decade thanks to a vibrant community +of users and developers. The following people are known to have contributed the +improvements that became Perl 5.14.4: + +Andy Dougherty, Chris 'BinGOs' Williams, Craig A. Berry, Dave Rolsky, David +Mitchell, Dominic Hargreaves, Father Chrysostomos, Florian Ragwitz, Reini +Urban, Ricardo Signes, Yves Orton. + +The list above is almost certainly incomplete as it is automatically generated +from version control history. In particular, it does not include the names of +the (very much appreciated) contributors who reported issues to the Perl bug +tracker. + +For a more complete list of all of Perl's historical contributors, please see +the F<AUTHORS> file in the Perl source distribution. + =head1 Reporting Bugs diff --git a/t/op/hash.t b/t/op/hash.t index 278bea7..201260a 100644 --- a/t/op/hash.t +++ b/t/op/hash.t @@ -39,22 +39,36 @@ use constant THRESHOLD => 14; use constant START => "a"; # some initial hash data -my %h2 = map {$_ => 1} 'a'..'cc'; +my %h2; +my $counter= "a"; +$h2{$counter++}++ while $counter ne 'cd'; ok (!Internals::HvREHASH(%h2), "starting with pre-populated non-pathological hash (rehash flag if off)"); my @keys = get_keys(\%h2); +my $buckets= buckets(\%h2); $h2{$_}++ for @keys; +$h2{$counter++}++ while buckets(\%h2) == $buckets; # force a split ok (Internals::HvREHASH(%h2), - scalar(@keys) . " colliding into the same bucket keys are triggering rehash"); + scalar(@keys) . " colliding into the same bucket keys are triggering rehash after split"); + +# returns the number of buckets in a hash +sub buckets { + my $hr = shift; + my $keys_buckets= scalar(%$hr); + if ($keys_buckets=~m!/([0-9]+)\z!) { + return 0+$1; + } else { + return 8; + } +} sub get_keys { my $hr = shift; # the minimum of bits required to mount the attack on a hash my $min_bits = log(THRESHOLD)/log(2); - # if the hash has already been populated with a significant amount # of entries the number of mask bits can be higher my $keys = scalar keys %$hr; -- Perl5 Master Repository
