perl5241delta - perl v5.24.1 的新功能
本文档描述了 5.24.0 版本和 5.24.1 版本之间的差异。
如果您要从 5.22.0 等早期版本升级,请先阅读 perl5240delta,其中描述了 5.22.0 和 5.24.0 之间的差异。
以前,如果 perl 不是以 setuid 方式运行并且尚未解析 -T 或 -t 开关,则 PerlIO 调试输出将发送到由 PERLIO_DEBUG
环境变量指定的 文件。
如果 Perl 在解析其开关之前执行输出,这会导致 Perl 创建或覆盖名为 PERLIO_DEBUG
的文件,即使提供了 -T 开关。
Perl 现在需要 -Di 开关才能生成 PerlIO 调试输出。默认情况下,这将写入 stderr
,但可以选择通过设置 PERLIO_DEBUG
环境变量将其重定向到文件。
如果 Perl 以 setuid 方式运行或提供了 -T 开关,则会忽略 PERLIO_DEBUG
,调试输出将发送到 stderr
,就像其他任何 -D 开关一样。
核心提供的工具和许多模块不再搜索 @INC
中的默认当前目录条目以查找可选模块。例如,Storable 将从 @INC
中删除最后的 ".",然后再尝试加载 Log::Agent。
这可以防止攻击者将可选模块注入到另一个用户运行的进程中,其中当前目录可由攻击者写入,例如 /tmp 目录。
在大多数情况下,此删除不应造成问题,但在 base 中遇到了困难,它将提供的每个模块名称都视为可选。这些困难尚未解决,因此对于此版本,base 没有更改。我们希望在 Perl 5.24.2 中为 base 提供修复程序。
为了保护您自己的代码免受此攻击,请在脚本开头从 @INC
中删除默认的 "." 条目,因此
#!/usr/bin/perl
use strict;
...
变为
#!/usr/bin/perl
BEGIN { pop @INC if $INC[-1] eq '.' }
use strict;
...
或者对于模块,从本地化的 @INC
中删除 ".",因此
my $can_foo = eval { require Foo; }
变为
my $can_foo = eval {
local @INC = @INC;
pop @INC if $INC[-1] eq '.';
require Foo;
};
除了上述安全更改之外,没有其他有意与 Perl 5.24.0 不兼容的更改。如果存在任何不兼容,它们是错误,我们要求您提交报告。请参见下面的 "报告错误"。
Archive::Tar 已从版本 2.04 升级到 2.04_01。
bignum 已从版本 0.42 升级到 0.42_01。
CPAN 已从版本 2.11 升级到 2.11_01。
Digest 已从版本 1.17 升级到 1.17_01。
Digest::SHA 已从版本 5.95 升级到 5.95_01。
Encode 已从版本 2.80 升级到 2.80_01。
ExtUtils::MakeMaker 已从版本 7.10_01 升级到 7.10_02。
File::Fetch 已从版本 0.48 升级到 0.48_01。
File::Spec 已从版本 3.63 升级到 3.63_01。
HTTP::Tiny 已从版本 0.056 升级到 0.056_001。
IO 已从版本 1.36 升级到 1.36_01。
IO-Compress 模块已从版本 2.069 升级到 2.069_001。
IPC::Cmd 已从版本 0.92 升级到 0.92_01。
JSON::PP 已从版本 2.27300 升级到 2.27300_01。
Locale::Maketext 已从版本 1.26 升级到 1.26_01。
Locale::Maketext::Simple 已从版本 0.21 升级到 0.21_01。
Memoize 已从版本 1.03 升级到 1.03_01。
Module::CoreList 已从版本 5.20160506 升级到 5.20170114_24。
Net::Ping 已从版本 2.43 升级到 2.43_01。
Parse::CPAN::Meta 已从版本 1.4417 升级到 1.4417_001。
Pod::Html 已从版本 1.22 升级到 1.2201。
Pod::Perldoc 已从版本 3.25_02 升级到 3.25_03。
Storable 已从版本 2.56 升级到 2.56_01。
Sys::Syslog 已从版本 0.33 升级到 0.33_01。
Test 已从版本 1.28 升级到 1.28_01。
Test::Harness 已从版本 3.36 升级到 3.36_01。
XSLoader 已从版本 0.21 升级到 0.22,修复了安全漏洞,该漏洞允许从 @INC
之外的路径加载二进制文件。 [GH #15418]
PERLIO_DEBUG
的文档已更新。
新增了-Di 选项的文档,并更新了 PERLIO_DEBUG
的文档。
添加了一个新的测试脚本 t/run/switchDx.t,用于测试新的 -Di 选项是否正常工作。
Perl 5.24.0 中引入的哈希邦重定向更改,即如果 perl 发现哈希邦路径包含 "perl" 后跟 "6",则会重定向到另一个解释器(Perl 6),已被恢复,因为它在 #!/opt/perl64/bin/perl
等情况下出现故障。
Perl 5.24.1 代表了自 Perl 5.24.0 发布以来的大约 8 个月的开发,包含了来自 18 位作者的 240 个文件中的大约 8,100 行更改。
不包括自动生成的的文件、文档和发布工具,大约有 2,200 行更改涉及 170 个 .pm、.t、.c 和 .h 文件。
得益于充满活力的用户和开发者社区,Perl 继续在第三个十年蓬勃发展。以下人员已知为 Perl 5.24.1 的改进做出了贡献。
Aaron Crane, Alex Vandiver, Aristotle Pagaltzis, Chad Granum, Chris 'BinGOs' Williams, Craig A. Berry, Father Chrysostomos, James E Keenan, Jarkko Hietaniemi, Karen Etheridge, Leon Timmermans, Matthew Horsfall, Ricardo Signes, Sawyer X, Sébastien Aperghis-Tramoni, Stevan Little, Steve Hay, Tony Cook.
上面的列表几乎肯定是不完整的,因为它是由版本控制历史自动生成的。特别是,它不包括向 Perl 错误跟踪器报告问题的(非常感谢)贡献者的姓名。
此版本中包含的许多更改源自 Perl 内核中包含的 CPAN 模块。我们感谢整个 CPAN 社区帮助 Perl 蓬勃发展。
有关 Perl 所有历史贡献者的更完整列表,请参阅 Perl 源代码分发中的 AUTHORS 文件。
如果您发现您认为是错误的内容,您可以查看最近发布到 comp.lang.perl.misc 新闻组的文章和 Perl 错误数据库 https://rt.perl.org/。您也可以在 https://www.perl5.cn/(Perl 主页)上找到信息。
如果您认为您遇到了未报告的错误,请运行随您的发行版提供的 perlbug 程序。请确保将您的错误缩减为一个微小但足够完整的测试用例。您的错误报告以及 perl -V
的输出将被发送到 [email protected],由 Perl 移植团队进行分析。
如果您要报告的错误涉及安全隐患,不适合发送到公开存档的邮件列表,请参阅 "perlsec 中的 SECURITY VULNERABILITY CONTACT INFORMATION",了解如何报告此问题。
Changes 文件,了解如何查看有关更改的详尽信息。
INSTALL 文件,了解如何构建 Perl。
README 文件,了解一般信息。
Artistic 和 Copying 文件,了解版权信息。