Bug#962237: buster-pu: package perl/5.28.1-6+deb10u1
Package: release.debian.org
Severity: normal
Tags: buster
User: release.debian.org@packages.debian.org
Usertags: pu
As per #962234 for stretch and my remarks on #961443 I'd like to
uploaded a targeted fix for these no-dsa security issues:
https://metacpan.org/pod/release/XSAWYERX/perl-5.28.3/pod/perldelta.pod
We can come back to #961443 when we're happy that the upgrade issues
have been solved.
Cheers
Dominic
diff --git a/cpan/IO-Socket-IP/t/01local-client-v4.t b/cpan/IO-Socket-IP/t/01local-client-v4.t
index 7ab7156993..f6aeac4c3b 100644
--- a/cpan/IO-Socket-IP/t/01local-client-v4.t
+++ b/cpan/IO-Socket-IP/t/01local-client-v4.t
@@ -8,7 +8,7 @@ use Test::More;
use IO::Socket::IP;
use IO::Socket::INET;
-use Socket qw( inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in );
+use Socket qw( inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in AI_NUMERICHOST );
# Some odd locations like BSD jails might not like INADDR_LOOPBACK. We'll
# establish a baseline first to test against
@@ -29,12 +29,14 @@ foreach my $socktype (qw( SOCK_STREAM SOCK_DGRAM )) {
LocalHost => "127.0.0.1",
Type => Socket->$socktype,
Proto => ( $socktype eq "SOCK_STREAM" ? "tcp" : "udp" ), # Because IO::Socket::INET is stupid and always presumes tcp
+ GetAddrInfoFlags => AI_NUMERICHOST,
) or die "Cannot listen on PF_INET - $@";
my $socket = IO::Socket::IP->new(
PeerHost => "127.0.0.1",
PeerService => $testserver->sockport,
Type => Socket->$socktype,
+ GetAddrInfoFlags => AI_NUMERICHOST,
);
ok( defined $socket, "IO::Socket::IP->new constructs a $socktype socket" ) or
diff --git a/cpan/IO-Socket-IP/t/02local-server-v4.t b/cpan/IO-Socket-IP/t/02local-server-v4.t
index c0d349f573..fb711f08bd 100644
--- a/cpan/IO-Socket-IP/t/02local-server-v4.t
+++ b/cpan/IO-Socket-IP/t/02local-server-v4.t
@@ -8,7 +8,7 @@ use Test::More;
use IO::Socket::IP;
use IO::Socket::INET;
-use Socket qw( inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in );
+use Socket qw( inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in AI_NUMERICHOST );
# Some odd locations like BSD jails might not like INADDR_LOOPBACK. We'll
# establish a baseline first to test against
@@ -29,6 +29,7 @@ foreach my $socktype (qw( SOCK_STREAM SOCK_DGRAM )) {
LocalHost => "127.0.0.1",
LocalPort => "0",
Type => Socket->$socktype,
+ GetAddrInfoFlags => AI_NUMERICHOST,
);
ok( defined $testserver, "IO::Socket::IP->new constructs a $socktype socket" ) or
diff --git a/cpan/IO-Socket-IP/t/03local-cross-v4.t b/cpan/IO-Socket-IP/t/03local-cross-v4.t
index 8cac72a95b..3e8174ee08 100644
--- a/cpan/IO-Socket-IP/t/03local-cross-v4.t
+++ b/cpan/IO-Socket-IP/t/03local-cross-v4.t
@@ -6,6 +6,7 @@ use warnings;
use Test::More;
use IO::Socket::IP;
+use Socket qw(AI_NUMERICHOST);
foreach my $socktype (qw( SOCK_STREAM SOCK_DGRAM )) {
my $testserver = IO::Socket::IP->new(
@@ -13,12 +14,14 @@ foreach my $socktype (qw( SOCK_STREAM SOCK_DGRAM )) {
LocalHost => "127.0.0.1",
LocalPort => "0",
Type => Socket->$socktype,
+ GetAddrInfoFlags => AI_NUMERICHOST,
) or die "Cannot listen on PF_INET - $@";
my $socket = IO::Socket::IP->new(
PeerHost => "127.0.0.1",
PeerService => $testserver->sockport,
Type => Socket->$socktype,
+ GetAddrInfoFlags => AI_NUMERICHOST,
) or die "Cannot connect on PF_INET - $@";
my $testclient = ( $socktype eq "SOCK_STREAM" ) ?
diff --git a/cpan/IO-Socket-IP/t/11sockopts.t b/cpan/IO-Socket-IP/t/11sockopts.t
index 5b850924dd..28daada89f 100644
--- a/cpan/IO-Socket-IP/t/11sockopts.t
+++ b/cpan/IO-Socket-IP/t/11sockopts.t
@@ -8,7 +8,7 @@ use Test::More;
use IO::Socket::IP;
use Errno qw( EACCES );
-use Socket qw( SOL_SOCKET SO_REUSEADDR SO_REUSEPORT SO_BROADCAST );
+use Socket qw( SOL_SOCKET SO_REUSEADDR SO_REUSEPORT SO_BROADCAST AI_NUMERICHOST);
TODO: {
local $TODO = "SO_REUSEADDR doesn't appear to work on cygwin smokers" if $^O eq "cygwin";
@@ -21,6 +21,7 @@ TODO: {
Type => SOCK_STREAM,
Listen => 1,
ReuseAddr => 1,
+ GetAddrInfoFlags => AI_NUMERICHOST,
) or die "Cannot socket() - $@";
ok( $sock->getsockopt( SOL_SOCKET, SO_REUSEADDR ), 'SO_REUSEADDR set' );
@@ -32,6 +33,7 @@ TODO: {
Sockopts => [
[ SOL_SOCKET, SO_REUSEADDR ],
],
+ GetAddrInfoFlags => AI_NUMERICHOST,
) or die "Cannot socket() - $@";
ok( $sock->getsockopt( SOL_SOCKET, SO_REUSEADDR ), 'SO_REUSEADDR set via Sockopts' );
@@ -50,6 +52,7 @@ SKIP: {
Type => SOCK_STREAM,
Listen => 1,
ReusePort => 1,
+ GetAddrInfoFlags => AI_NUMERICHOST,
) or die "Cannot socket() - $@";
ok( $sock->getsockopt( SOL_SOCKET, SO_REUSEPORT ), 'SO_REUSEPORT set' );
@@ -62,6 +65,7 @@ SKIP: {
LocalHost => "127.0.0.1",
Type => SOCK_DGRAM,
Broadcast => 1,
+ GetAddrInfoFlags => AI_NUMERICHOST,
);
skip "Privileges required to set broadcast on datagram socket", 1 if !$sock and $! == EACCES;
die "Cannot socket() - $@" unless $sock;
diff --git a/cpan/IO-Socket-IP/t/18fdopen.t b/cpan/IO-Socket-IP/t/18fdopen.t
index 20cbe46d47..6843a2c3d2 100644
--- a/cpan/IO-Socket-IP/t/18fdopen.t
+++ b/cpan/IO-Socket-IP/t/18fdopen.t
@@ -6,12 +6,13 @@ use warnings;
use Test::More;
use IO::Socket::IP;
-use Socket qw( SOCK_STREAM );
+use Socket qw( SOCK_STREAM AI_NUMERICHOST );
my $s1 = IO::Socket::IP->new(
LocalHost => "127.0.0.1",
Type => SOCK_STREAM,
Listen => 1,
+ GetAddrInfoFlags => AI_NUMERICHOST,
) or die "Cannot listen on AF_INET - $@";
my $s2 = IO::Socket::IP->new;
diff --git a/cpan/IO-Socket-IP/t/20subclass.t b/cpan/IO-Socket-IP/t/20subclass.t
index 231bd52cab..fbc9cff23e 100644
--- a/cpan/IO-Socket-IP/t/20subclass.t
+++ b/cpan/IO-Socket-IP/t/20subclass.t
@@ -6,16 +6,19 @@ use warnings;
use Test::More;
use IO::Socket::IP;
+use Socket qw( AI_NUMERICHOST );
my $server = IO::Socket::IP->new(
Listen => 1,
LocalHost => "127.0.0.1",
LocalPort => 0,
+ GetAddrInfoFlags => AI_NUMERICHOST,
) or die "Cannot listen on PF_INET - $!";
my $client = IO::Socket::IP->new(
PeerHost => $server->sockhost,
PeerPort => $server->sockport,
+ GetAddrInfoFlags => AI_NUMERICHOST,
) or die "Cannot connect on PF_INET - $!";
my $accepted = $server->accept( 'MySubclass' )
diff --git a/cpan/IO-Socket-IP/t/21as-inet.t b/cpan/IO-Socket-IP/t/21as-inet.t
index 2b8713d46f..fedb8be538 100644
--- a/cpan/IO-Socket-IP/t/21as-inet.t
+++ b/cpan/IO-Socket-IP/t/21as-inet.t
@@ -6,16 +6,19 @@ use warnings;
use Test::More;
use IO::Socket::IP;
+use Socket qw( AI_NUMERICHOST );
my $server = IO::Socket::IP->new(
Listen => 1,
LocalHost => "127.0.0.1",
LocalPort => 0,
+ GetAddrInfoFlags => AI_NUMERICHOST,
) or die "Cannot listen on PF_INET - $!";
my $client = IO::Socket::IP->new(
PeerHost => $server->sockhost,
PeerPort => $server->sockport,
+ GetAddrInfoFlags => AI_NUMERICHOST,
) or die "Cannot connect on PF_INET - $!";
my $accepted = $server->accept
diff --git a/cpan/IO-Socket-IP/t/22timeout.t b/cpan/IO-Socket-IP/t/22timeout.t
index a4c28b3af0..c4a08f5d1f 100644
--- a/cpan/IO-Socket-IP/t/22timeout.t
+++ b/cpan/IO-Socket-IP/t/22timeout.t
@@ -6,17 +6,20 @@ use warnings;
use Test::More;
use IO::Socket::IP;
+use Socket qw( AI_NUMERICHOST );
my $server = IO::Socket::IP->new(
Listen => 1,
LocalHost => "127.0.0.1",
LocalPort => 0,
+ GetAddrInfoFlags => AI_NUMERICHOST,
) or die "Cannot listen on PF_INET - $!";
my $client = IO::Socket::IP->new(
PeerHost => $server->sockhost,
PeerPort => $server->sockport,
Timeout => 0.1,
+ GetAddrInfoFlags => AI_NUMERICHOST,
) or die "Cannot connect on PF_INET - $!";
ok( defined $client, 'client constructed with Timeout' );
diff --git a/cpan/IO-Socket-IP/t/30nonblocking-connect.t b/cpan/IO-Socket-IP/t/30nonblocking-connect.t
index 518bd2ebd8..ade8349354 100644
--- a/cpan/IO-Socket-IP/t/30nonblocking-connect.t
+++ b/cpan/IO-Socket-IP/t/30nonblocking-connect.t
@@ -8,7 +8,7 @@ use Test::More;
use IO::Socket::IP;
use IO::Socket::INET;
-use Socket qw( inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in );
+use Socket qw( inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in AI_NUMERICHOST );
use Errno qw( EINPROGRESS EWOULDBLOCK );
# Some odd locations like BSD jails might not like INADDR_LOOPBACK. We'll
@@ -27,6 +27,7 @@ my $testserver = IO::Socket::INET->new(
Listen => 1,
LocalHost => "127.0.0.1",
Type => SOCK_STREAM,
+ GetAddrInfoFlags => AI_NUMERICHOST,
) or die "Cannot listen on PF_INET - $@";
my $socket = IO::Socket::IP->new(
@@ -34,6 +35,7 @@ my $socket = IO::Socket::IP->new(
PeerService => $testserver->sockport,
Type => SOCK_STREAM,
Blocking => 0,
+ GetAddrInfoFlags => AI_NUMERICHOST,
);
ok( defined $socket, 'IO::Socket::IP->new( Blocking => 0 ) constructs a socket' ) or
diff --git a/debian/.git-dpm b/debian/.git-dpm
index b25cde2302..61325f837a 100644
--- a/debian/.git-dpm
+++ b/debian/.git-dpm
@@ -1,6 +1,6 @@
# see git-dpm(1) from git-dpm package
-c13d09cc35d629482559ef95109cb92e09f6a8e8
-c13d09cc35d629482559ef95109cb92e09f6a8e8
+b13b2eb99ca0d8286d45d09a5439dc25d39ea18b
+b13b2eb99ca0d8286d45d09a5439dc25d39ea18b
533cd3622b6a61a362e7538a26e25b244ca799f2
533cd3622b6a61a362e7538a26e25b244ca799f2
perl_5.28.1.orig.tar.xz
diff --git a/debian/changelog b/debian/changelog
index b3fe7a3ca0..d6e1f27d66 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,17 @@
+perl (5.28.1-6+deb10u1) UNRELEASED; urgency=medium
+
+ * Multiple regexp security fixes (Closes: #962005)
+ + [SECURITY] CVE-2020-10543: Buffer overflow caused by a crafted
+ regular expression
+ + [SECURITY] CVE-2020-10878: Integer overflow via malformed bytecode
+ produced by a crafted regular expression
+ + [SECURITY] CVE-2020-12723: Buffer overflow caused by a crafted
+ regular expression
+ * Fix FTBFS with IPv6-only host (Closes: #962019)
+ * Fix test failure with certain sbuild configurations (Closes: #930095)
+
+ -- Dominic Hargreaves <dom@earth.li> Wed, 03 Jun 2020 23:08:14 +0100
+
perl (5.28.1-6) unstable; urgency=medium
* Fix NDBM autopkgtests by recreating necessary hardlinks at test time
diff --git a/debian/patches/debian/configure-regen.diff b/debian/patches/debian/configure-regen.diff
index bf586b9bc0..d1e822e593 100644
--- a/debian/patches/debian/configure-regen.diff
+++ b/debian/patches/debian/configure-regen.diff
@@ -10,7 +10,7 @@ Bug-Debian: https://bugs.debian.org/762638
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/Configure b/Configure
-index 3be9f05b7..437b8afc5 100755
+index 3be9f05b7d..437b8afc57 100755
--- a/Configure
+++ b/Configure
@@ -1483,8 +1483,7 @@ archname=''
diff --git a/debian/patches/debian/cpan-missing-site-dirs.diff b/debian/patches/debian/cpan-missing-site-dirs.diff
index d2e43f7083..5df228a1c9 100644
--- a/debian/patches/debian/cpan-missing-site-dirs.diff
+++ b/debian/patches/debian/cpan-missing-site-dirs.diff
@@ -18,7 +18,7 @@ Patch-Name: debian/cpan-missing-site-dirs.diff
1 file changed, 27 insertions(+), 4 deletions(-)
diff --git a/cpan/CPAN/lib/CPAN/FirstTime.pm b/cpan/CPAN/lib/CPAN/FirstTime.pm
-index cdf1dc220..bdb7899bb 100644
+index cdf1dc220d..bdb7899bb9 100644
--- a/cpan/CPAN/lib/CPAN/FirstTime.pm
+++ b/cpan/CPAN/lib/CPAN/FirstTime.pm
@@ -2067,11 +2067,34 @@ sub _print_urllist {
diff --git a/debian/patches/debian/cpan_definstalldirs.diff b/debian/patches/debian/cpan_definstalldirs.diff
index 45b518a0ec..571bd437fa 100644
--- a/debian/patches/debian/cpan_definstalldirs.diff
+++ b/debian/patches/debian/cpan_definstalldirs.diff
@@ -14,7 +14,7 @@ Patch-Name: debian/cpan_definstalldirs.diff
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/cpan/CPAN/lib/CPAN/FirstTime.pm b/cpan/CPAN/lib/CPAN/FirstTime.pm
-index 49fa8ab7b..cdf1dc220 100644
+index 49fa8ab7b9..cdf1dc220d 100644
--- a/cpan/CPAN/lib/CPAN/FirstTime.pm
+++ b/cpan/CPAN/lib/CPAN/FirstTime.pm
@@ -1033,7 +1033,7 @@ sub init {
diff --git a/debian/patches/debian/db_file_ver.diff b/debian/patches/debian/db_file_ver.diff
index 89c8a8e0b7..e999e32e40 100644
--- a/debian/patches/debian/db_file_ver.diff
+++ b/debian/patches/debian/db_file_ver.diff
@@ -13,7 +13,7 @@ Patch-Name: debian/db_file_ver.diff
1 file changed, 2 insertions(+)
diff --git a/cpan/DB_File/version.c b/cpan/DB_File/version.c
-index e01f6f6fa..544e6ee8f 100644
+index e01f6f6fa3..544e6ee8fb 100644
--- a/cpan/DB_File/version.c
+++ b/cpan/DB_File/version.c
@@ -48,6 +48,7 @@ __getBerkeleyDBInfo()
diff --git a/debian/patches/debian/deprecate-with-apt.diff b/debian/patches/debian/deprecate-with-apt.diff
index 42a1115d36..64ae29c7d2 100644
--- a/debian/patches/debian/deprecate-with-apt.diff
+++ b/debian/patches/debian/deprecate-with-apt.diff
@@ -10,7 +10,7 @@ Patch-Name: debian/deprecate-with-apt.diff
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/lib/deprecate.pm b/lib/deprecate.pm
-index 47bc11253..01d48fa6c 100644
+index 47bc11253e..01d48fa6cc 100644
--- a/lib/deprecate.pm
+++ b/lib/deprecate.pm
@@ -7,6 +7,16 @@ our $VERSION = 0.03;
diff --git a/debian/patches/debian/disable-stack-check.diff b/debian/patches/debian/disable-stack-check.diff
index 113a13ac6e..5ab9649025 100644
--- a/debian/patches/debian/disable-stack-check.diff
+++ b/debian/patches/debian/disable-stack-check.diff
@@ -21,7 +21,7 @@ Patch-Name: debian/disable-stack-check.diff
2 files changed, 6 insertions(+)
diff --git a/dump.c b/dump.c
-index 227eb996e..4e1c594ce 100644
+index 227eb996ee..4e1c594ce8 100644
--- a/dump.c
+++ b/dump.c
@@ -2500,6 +2500,8 @@ Perl_runops_debug(pTHX)
@@ -42,7 +42,7 @@ index 227eb996e..4e1c594ce 100644
if (PL_debug) {
ENTER;
diff --git a/pp_hot.c b/pp_hot.c
-index 56e3cbe6e..f4e1ae726 100644
+index 56e3cbe6e1..f4e1ae726d 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -5232,6 +5232,8 @@ PP(pp_entersub)
diff --git a/debian/patches/debian/doc_info.diff b/debian/patches/debian/doc_info.diff
index 72b85ad5c4..2fa047b7f1 100644
--- a/debian/patches/debian/doc_info.diff
+++ b/debian/patches/debian/doc_info.diff
@@ -11,7 +11,7 @@ Patch-Name: debian/doc_info.diff
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/pod/perl.pod b/pod/perl.pod
-index fbbb952b6..bc0f531f8 100644
+index fbbb952b6b..bc0f531f86 100644
--- a/pod/perl.pod
+++ b/pod/perl.pod
@@ -295,8 +295,16 @@ aux h2ph h2xs perlbug pl2pm pod2html pod2man splain xsubpp
diff --git a/debian/patches/debian/enc2xs_inc.diff b/debian/patches/debian/enc2xs_inc.diff
index aaaaa8e2e2..c91c2b14cb 100644
--- a/debian/patches/debian/enc2xs_inc.diff
+++ b/debian/patches/debian/enc2xs_inc.diff
@@ -17,7 +17,7 @@ Patch-Name: debian/enc2xs_inc.diff
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/cpan/Encode/bin/enc2xs b/cpan/Encode/bin/enc2xs
-index 619b64b75..050c863ef 100644
+index 619b64b757..050c863ef9 100644
--- a/cpan/Encode/bin/enc2xs
+++ b/cpan/Encode/bin/enc2xs
@@ -1013,11 +1013,11 @@ use vars qw(
@@ -53,7 +53,7 @@ index 619b64b75..050c863ef 100644
for my $enc ( sort keys %LocalMod ) {
$_ModLines .=
diff --git a/t/porting/customized.t b/t/porting/customized.t
-index d425e5b77..d906a8255 100644
+index d425e5b775..d906a82553 100644
--- a/t/porting/customized.t
+++ b/t/porting/customized.t
@@ -108,8 +108,11 @@ foreach my $module ( sort keys %Modules ) {
diff --git a/debian/patches/debian/errno_ver.diff b/debian/patches/debian/errno_ver.diff
index 73b802e147..1a09f063f7 100644
--- a/debian/patches/debian/errno_ver.diff
+++ b/debian/patches/debian/errno_ver.diff
@@ -16,7 +16,7 @@ Patch-Name: debian/errno_ver.diff
1 file changed, 16 deletions(-)
diff --git a/ext/Errno/Errno_pm.PL b/ext/Errno/Errno_pm.PL
-index d565f31b2..6a0031f0f 100644
+index d565f31b2f..6a0031f0f7 100644
--- a/ext/Errno/Errno_pm.PL
+++ b/ext/Errno/Errno_pm.PL
@@ -288,22 +288,6 @@ package Errno;
diff --git a/debian/patches/debian/extutils_set_libperl_path.diff b/debian/patches/debian/extutils_set_libperl_path.diff
index 317221ded5..3b9b715fbb 100644
--- a/debian/patches/debian/extutils_set_libperl_path.diff
+++ b/debian/patches/debian/extutils_set_libperl_path.diff
@@ -12,7 +12,7 @@ Patch-Name: debian/extutils_set_libperl_path.diff
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
-index dbb8651a9..780e390cd 100644
+index dbb8651a9f..780e390cd9 100644
--- a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
+++ b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
@@ -2564,7 +2564,7 @@ MAP_PRELIBS = $Config{perllibs} $Config{cryptlib}
diff --git a/debian/patches/debian/fakeroot.diff b/debian/patches/debian/fakeroot.diff
index 5b4c7c422b..c99a48fcd9 100644
--- a/debian/patches/debian/fakeroot.diff
+++ b/debian/patches/debian/fakeroot.diff
@@ -16,7 +16,7 @@ Patch-Name: debian/fakeroot.diff
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/Makefile.SH b/Makefile.SH
-index 519700929..48151bce6 100755
+index 5197009290..48151bce65 100755
--- a/Makefile.SH
+++ b/Makefile.SH
@@ -48,10 +48,7 @@ case "$useshrplib" in
diff --git a/debian/patches/debian/find_html2text.diff b/debian/patches/debian/find_html2text.diff
index cb56d1e692..23fce578f5 100644
--- a/debian/patches/debian/find_html2text.diff
+++ b/debian/patches/debian/find_html2text.diff
@@ -21,7 +21,7 @@ functionality].
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cpan/CPAN/lib/CPAN/Distribution.pm b/cpan/CPAN/lib/CPAN/Distribution.pm
-index 72101afc7..9f896584d 100644
+index 72101afc7b..9f896584d1 100644
--- a/cpan/CPAN/lib/CPAN/Distribution.pm
+++ b/cpan/CPAN/lib/CPAN/Distribution.pm
@@ -4149,7 +4149,7 @@ sub _display_url {
diff --git a/debian/patches/debian/gdbm-fatal.diff b/debian/patches/debian/gdbm-fatal.diff
index a863e3804b..4414e4c1dd 100644
--- a/debian/patches/debian/gdbm-fatal.diff
+++ b/debian/patches/debian/gdbm-fatal.diff
@@ -11,7 +11,7 @@ Patch-Name: debian/gdbm-fatal.diff
1 file changed, 3 insertions(+)
diff --git a/ext/GDBM_File/t/fatal.t b/ext/GDBM_File/t/fatal.t
-index 0e426d4db..3df6878f8 100644
+index 0e426d4dbc..3df6878f8c 100644
--- a/ext/GDBM_File/t/fatal.t
+++ b/ext/GDBM_File/t/fatal.t
@@ -12,6 +12,9 @@ BEGIN {
diff --git a/debian/patches/debian/hppa_op_optimize_workaround.diff b/debian/patches/debian/hppa_op_optimize_workaround.diff
index e4feb8da14..d8005d554d 100644
--- a/debian/patches/debian/hppa_op_optimize_workaround.diff
+++ b/debian/patches/debian/hppa_op_optimize_workaround.diff
@@ -16,7 +16,7 @@ Patch-Name: debian/hppa_op_optimize_workaround.diff
1 file changed, 6 insertions(+)
diff --git a/cflags.SH b/cflags.SH
-index e60742fed..3e4526ff8 100755
+index e60742fed1..3e4526ff8f 100755
--- a/cflags.SH
+++ b/cflags.SH
@@ -497,6 +497,12 @@ for file do
diff --git a/debian/patches/debian/hppa_opmini_optimize_workaround.diff b/debian/patches/debian/hppa_opmini_optimize_workaround.diff
index b68efca5da..562affe006 100644
--- a/debian/patches/debian/hppa_opmini_optimize_workaround.diff
+++ b/debian/patches/debian/hppa_opmini_optimize_workaround.diff
@@ -14,7 +14,7 @@ Patch-Name: debian/hppa_opmini_optimize_workaround.diff
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cflags.SH b/cflags.SH
-index 3e4526ff8..c8231e64e 100755
+index 3e4526ff8f..c8231e64e8 100755
--- a/cflags.SH
+++ b/cflags.SH
@@ -497,7 +497,7 @@ for file do
diff --git a/debian/patches/debian/hurd-softupdates.diff b/debian/patches/debian/hurd-softupdates.diff
index 0542c027f9..e36dbd8ce4 100644
--- a/debian/patches/debian/hurd-softupdates.diff
+++ b/debian/patches/debian/hurd-softupdates.diff
@@ -13,7 +13,7 @@ Patch-Name: debian/hurd-softupdates.diff
1 file changed, 1 insertion(+)
diff --git a/t/op/stat.t b/t/op/stat.t
-index 8dcb3d3fd..aa16fe739 100644
+index 8dcb3d3fd5..aa16fe7399 100644
--- a/t/op/stat.t
+++ b/t/op/stat.t
@@ -100,6 +100,7 @@ print FOO "Now is the time for all good men to come to.\n";
diff --git a/debian/patches/debian/installman-utf8.diff b/debian/patches/debian/installman-utf8.diff
index 7e87a5e823..89994c021b 100644
--- a/debian/patches/debian/installman-utf8.diff
+++ b/debian/patches/debian/installman-utf8.diff
@@ -15,7 +15,7 @@ Patch-Name: debian/installman-utf8.diff
1 file changed, 1 insertion(+)
diff --git a/installman b/installman
-index 0154be4d6..fff0ff04a 100755
+index 0154be4d68..fff0ff04a7 100755
--- a/installman
+++ b/installman
@@ -161,6 +161,7 @@ sub pod2man {
diff --git a/debian/patches/debian/instmodsh_doc.diff b/debian/patches/debian/instmodsh_doc.diff
index 5d083cd6e3..b21b35fc55 100644
--- a/debian/patches/debian/instmodsh_doc.diff
+++ b/debian/patches/debian/instmodsh_doc.diff
@@ -9,7 +9,7 @@ Patch-Name: debian/instmodsh_doc.diff
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/cpan/ExtUtils-MakeMaker/bin/instmodsh b/cpan/ExtUtils-MakeMaker/bin/instmodsh
-index ab0f9d1ff..b3b109f47 100644
+index ab0f9d1ffe..b3b109f475 100644
--- a/cpan/ExtUtils-MakeMaker/bin/instmodsh
+++ b/cpan/ExtUtils-MakeMaker/bin/instmodsh
@@ -19,9 +19,11 @@ instmodsh - A shell to examine installed modules
diff --git a/debian/patches/debian/kfreebsd-softupdates.diff b/debian/patches/debian/kfreebsd-softupdates.diff
index 1aa61d2731..dcc7833a13 100644
--- a/debian/patches/debian/kfreebsd-softupdates.diff
+++ b/debian/patches/debian/kfreebsd-softupdates.diff
@@ -16,7 +16,7 @@ Patch-Name: debian/kfreebsd-softupdates.diff
1 file changed, 1 insertion(+)
diff --git a/t/op/stat.t b/t/op/stat.t
-index 905eb85fd..8dcb3d3fd 100644
+index 905eb85fd4..8dcb3d3fd5 100644
--- a/t/op/stat.t
+++ b/t/op/stat.t
@@ -99,6 +99,7 @@ sleep 3 if $funky_FAT_timestamps;
diff --git a/debian/patches/debian/ld_run_path.diff b/debian/patches/debian/ld_run_path.diff
index 8870750b89..ee1933d336 100644
--- a/debian/patches/debian/ld_run_path.diff
+++ b/debian/patches/debian/ld_run_path.diff
@@ -9,7 +9,7 @@ Patch-Name: debian/ld_run_path.diff
1 file changed, 2 insertions(+)
diff --git a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist/Kid.pm b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist/Kid.pm
-index a6da85586..fb849b21c 100644
+index a6da855862..fb849b21ca 100644
--- a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist/Kid.pm
+++ b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist/Kid.pm
@@ -62,6 +62,8 @@ sub _unix_os2_ext {
diff --git a/debian/patches/debian/libnet_config_path.diff b/debian/patches/debian/libnet_config_path.diff
index 88fdafdd72..98d229f73d 100644
--- a/debian/patches/debian/libnet_config_path.diff
+++ b/debian/patches/debian/libnet_config_path.diff
@@ -10,7 +10,7 @@ Patch-Name: debian/libnet_config_path.diff
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/cpan/libnet/lib/Net/Config.pm b/cpan/libnet/lib/Net/Config.pm
-index 4f822a40a..4b3978113 100644
+index 4f822a40a4..4b39781134 100644
--- a/cpan/libnet/lib/Net/Config.pm
+++ b/cpan/libnet/lib/Net/Config.pm
@@ -72,9 +72,8 @@ my %nc = (
diff --git a/debian/patches/debian/libperl_embed_doc.diff b/debian/patches/debian/libperl_embed_doc.diff
index 826579a666..c87b68e32b 100644
--- a/debian/patches/debian/libperl_embed_doc.diff
+++ b/debian/patches/debian/libperl_embed_doc.diff
@@ -11,7 +11,7 @@ Patch-Name: debian/libperl_embed_doc.diff
1 file changed, 3 insertions(+)
diff --git a/lib/ExtUtils/Embed.pm b/lib/ExtUtils/Embed.pm
-index e75e41f8c..985c35345 100644
+index e75e41f8c4..985c353457 100644
--- a/lib/ExtUtils/Embed.pm
+++ b/lib/ExtUtils/Embed.pm
@@ -293,6 +293,9 @@ and extensions in your C/C++ applications.
diff --git a/debian/patches/debian/makemaker-manext.diff b/debian/patches/debian/makemaker-manext.diff
index 6615efda87..ae785e500a 100644
--- a/debian/patches/debian/makemaker-manext.diff
+++ b/debian/patches/debian/makemaker-manext.diff
@@ -15,7 +15,7 @@ Bug-Debian: https://bugs.debian.org/247370
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Any.pm b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Any.pm
-index 1a3893c30..8bb0ef2ee 100644
+index 1a3893c30b..8bb0ef2ee9 100644
--- a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Any.pm
+++ b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Any.pm
@@ -1090,8 +1090,8 @@ END
diff --git a/debian/patches/debian/makemaker-pasthru.diff b/debian/patches/debian/makemaker-pasthru.diff
index 92bcf854a1..78e1451b04 100644
--- a/debian/patches/debian/makemaker-pasthru.diff
+++ b/debian/patches/debian/makemaker-pasthru.diff
@@ -16,7 +16,7 @@ Patch-Name: debian/makemaker-pasthru.diff
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
-index 4977baa15..bb41b274b 100644
+index 4977baa15d..bb41b274b3 100644
--- a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
+++ b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
@@ -2955,7 +2955,7 @@ sub pasthru {
diff --git a/debian/patches/debian/mod_paths.diff b/debian/patches/debian/mod_paths.diff
index 5628e7d09e..4f297fbc3e 100644
--- a/debian/patches/debian/mod_paths.diff
+++ b/debian/patches/debian/mod_paths.diff
@@ -24,7 +24,7 @@ Patch-Name: debian/mod_paths.diff
1 file changed, 58 insertions(+)
diff --git a/perl.c b/perl.c
-index e6dfa8dc0..c7828e69c 100644
+index e6dfa8dc05..c7828e69ce 100644
--- a/perl.c
+++ b/perl.c
@@ -4674,6 +4674,10 @@ S_init_perllib(pTHX)
diff --git a/debian/patches/debian/no_packlist_perllocal.diff b/debian/patches/debian/no_packlist_perllocal.diff
index 7097e32e38..aac3ccd2fe 100644
--- a/debian/patches/debian/no_packlist_perllocal.diff
+++ b/debian/patches/debian/no_packlist_perllocal.diff
@@ -9,7 +9,7 @@ Patch-Name: debian/no_packlist_perllocal.diff
1 file changed, 3 insertions(+), 32 deletions(-)
diff --git a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
-index 780e390cd..4977baa15 100644
+index 780e390cd9..4977baa15d 100644
--- a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
+++ b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
@@ -2232,11 +2232,6 @@ pure_perl_install :: all
diff --git a/debian/patches/debian/patchlevel.diff b/debian/patches/debian/patchlevel.diff
index e980292d26..9fd86fca45 100644
--- a/debian/patches/debian/patchlevel.diff
+++ b/debian/patches/debian/patchlevel.diff
@@ -15,7 +15,7 @@ Patch-Name: debian/patchlevel.diff
1 file changed, 3 insertions(+)
diff --git a/patchlevel.h b/patchlevel.h
-index a5ca94bcc..d126b0df1 100644
+index a5ca94bcc0..d126b0df1f 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -137,6 +137,9 @@ static const char * const local_patches[] = {
diff --git a/debian/patches/debian/perl5db-x-terminal-emulator.patch b/debian/patches/debian/perl5db-x-terminal-emulator.patch
index b55b991d7c..bf46cea1a1 100644
--- a/debian/patches/debian/perl5db-x-terminal-emulator.patch
+++ b/debian/patches/debian/perl5db-x-terminal-emulator.patch
@@ -15,7 +15,7 @@ Patch-Name: debian/perl5db-x-terminal-emulator.patch
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/perl5db.pl b/lib/perl5db.pl
-index ecc49a814..6eb03d7c1 100644
+index ecc49a814d..6eb03d7c11 100644
--- a/lib/perl5db.pl
+++ b/lib/perl5db.pl
@@ -6987,7 +6987,7 @@ properly set up.
diff --git a/debian/patches/debian/perlbug-editor.diff b/debian/patches/debian/perlbug-editor.diff
index bbb5b33cbe..a566ab6b8e 100644
--- a/debian/patches/debian/perlbug-editor.diff
+++ b/debian/patches/debian/perlbug-editor.diff
@@ -10,7 +10,7 @@ Patch-Name: debian/perlbug-editor.diff
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/utils/perlbug.PL b/utils/perlbug.PL
-index d1eb1e04a..4555d0449 100644
+index d1eb1e04a8..4555d04494 100644
--- a/utils/perlbug.PL
+++ b/utils/perlbug.PL
@@ -272,7 +272,7 @@ sub Init {
diff --git a/debian/patches/debian/perldoc-pager.diff b/debian/patches/debian/perldoc-pager.diff
index 9b14d38d0d..97231557a3 100644
--- a/debian/patches/debian/perldoc-pager.diff
+++ b/debian/patches/debian/perldoc-pager.diff
@@ -14,7 +14,7 @@ Patch-Name: debian/perldoc-pager.diff
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cpan/Pod-Perldoc/lib/Pod/Perldoc/ToTerm.pm b/cpan/Pod-Perldoc/lib/Pod/Perldoc/ToTerm.pm
-index 9501d6310..a5aedf630 100644
+index 9501d6310e..a5aedf6302 100644
--- a/cpan/Pod-Perldoc/lib/Pod/Perldoc/ToTerm.pm
+++ b/cpan/Pod-Perldoc/lib/Pod/Perldoc/ToTerm.pm
@@ -32,7 +32,7 @@ sub pager_configuration {
diff --git a/debian/patches/debian/perlivp.diff b/debian/patches/debian/perlivp.diff
index 7797295c1f..4c85cad8fa 100644
--- a/debian/patches/debian/perlivp.diff
+++ b/debian/patches/debian/perlivp.diff
@@ -26,7 +26,7 @@ Patch-Name: debian/perlivp.diff
1 file changed, 1 insertion(+)
diff --git a/utils/perlivp.PL b/utils/perlivp.PL
-index 50d187a54..bd8091c54 100644
+index 50d187a544..bd8091c548 100644
--- a/utils/perlivp.PL
+++ b/utils/perlivp.PL
@@ -155,6 +155,7 @@ my $INC_total = 0;
diff --git a/debian/patches/debian/prune_libs.diff b/debian/patches/debian/prune_libs.diff
index 053ac6dce7..696a18c472 100644
--- a/debian/patches/debian/prune_libs.diff
+++ b/debian/patches/debian/prune_libs.diff
@@ -17,7 +17,7 @@ Patch-Name: debian/prune_libs.diff
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/regen-configure/U/modified/Myinit.U b/regen-configure/U/modified/Myinit.U
-index 0e3155aec..e1d58c207 100644
+index 0e3155aecd..e1d58c2077 100644
--- a/regen-configure/U/modified/Myinit.U
+++ b/regen-configure/U/modified/Myinit.U
@@ -32,8 +32,7 @@
@@ -31,7 +31,7 @@ index 0e3155aec..e1d58c207 100644
: This is only used by the lib/ExtUtils/MakeMaker.pm routine extliblist.
glibpth=`echo " $glibpth " | sed -e 's! /usr/shlib ! !'`
diff --git a/regen-configure/U/perl/End.U b/regen-configure/U/perl/End.U
-index 352071422..9716623ae 100644
+index 352071422f..9716623ae0 100644
--- a/regen-configure/U/perl/End.U
+++ b/regen-configure/U/perl/End.U
@@ -37,7 +37,7 @@ sunos*X4*)
diff --git a/debian/patches/debian/sh4_op_optimize_workaround.diff b/debian/patches/debian/sh4_op_optimize_workaround.diff
index 3dee288c34..4ec2b01ef5 100644
--- a/debian/patches/debian/sh4_op_optimize_workaround.diff
+++ b/debian/patches/debian/sh4_op_optimize_workaround.diff
@@ -14,7 +14,7 @@ Patch-Name: debian/sh4_op_optimize_workaround.diff
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/cflags.SH b/cflags.SH
-index c8231e64e..3bb0c3e93 100755
+index c8231e64e8..3bb0c3e937 100755
--- a/cflags.SH
+++ b/cflags.SH
@@ -497,9 +497,9 @@ for file do
diff --git a/debian/patches/debian/squelch-locale-warnings.diff b/debian/patches/debian/squelch-locale-warnings.diff
index 676395e0f8..7026a5f841 100644
--- a/debian/patches/debian/squelch-locale-warnings.diff
+++ b/debian/patches/debian/squelch-locale-warnings.diff
@@ -20,7 +20,7 @@ Patch-Name: debian/squelch-locale-warnings.diff
2 files changed, 11 insertions(+)
diff --git a/locale.c b/locale.c
-index 765334047..aedd7da0c 100644
+index 7653340477..aedd7da0c5 100644
--- a/locale.c
+++ b/locale.c
@@ -3142,6 +3142,9 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
@@ -34,7 +34,7 @@ index 765334047..aedd7da0c 100644
|| (
/* disallow with "" or "0" */
diff --git a/pod/perllocale.pod b/pod/perllocale.pod
-index a32f72c88..e12b81cc4 100644
+index a32f72c88e..e12b81cc4c 100644
--- a/pod/perllocale.pod
+++ b/pod/perllocale.pod
@@ -1293,6 +1293,14 @@ B<NOTE>: C<PERL_BADLANG> only gives you a way to hide the warning message.
diff --git a/debian/patches/debian/writable_site_dirs.diff b/debian/patches/debian/writable_site_dirs.diff
index 285bbeb661..e1b1fcdb15 100644
--- a/debian/patches/debian/writable_site_dirs.diff
+++ b/debian/patches/debian/writable_site_dirs.diff
@@ -11,7 +11,7 @@ Patch-Name: debian/writable_site_dirs.diff
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
-index 274e35c6f..dbb8651a9 100644
+index 274e35c6fc..dbb8651a9f 100644
--- a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
+++ b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
@@ -2249,7 +2249,7 @@ q{ "$(INST_LIB)" "$(DESTINSTALLPRIVLIB)" \
diff --git a/debian/patches/fixes/CVE-2020-10543.diff b/debian/patches/fixes/CVE-2020-10543.diff
new file mode 100644
index 0000000000..33a7fc20be
--- /dev/null
+++ b/debian/patches/fixes/CVE-2020-10543.diff
@@ -0,0 +1,32 @@
+From 3c031d58f421e54cc56bfd023073f08537335de4 Mon Sep 17 00:00:00 2001
+From: John Lightsey <jd@cpanel.net>
+Date: Wed, 20 Nov 2019 20:02:45 -0600
+Subject: regcomp.c: Prevent integer overflow from nested regex quantifiers.
+
+(CVE-2020-10543) On 32bit systems the size calculations for nested regular
+expression quantifiers could overflow causing heap memory corruption.
+
+Bug-Debian: https://bugs.debian.org/962005
+Origin: upstream
+Patch-Name: fixes/CVE-2020-10543.diff
+---
+ regcomp.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/regcomp.c b/regcomp.c
+index e1da15a77c..dd18add1db 100644
+--- a/regcomp.c
++++ b/regcomp.c
+@@ -5181,6 +5181,12 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
+ (void)ReREFCNT_inc(RExC_rx_sv);
+ }
+
++ if ( ( minnext > 0 && mincount >= SSize_t_MAX / minnext )
++ || min >= SSize_t_MAX - minnext * mincount )
++ {
++ FAIL("Regexp out of space");
++ }
++
+ min += minnext * mincount;
+ is_inf_internal |= deltanext == SSize_t_MAX
+ || (maxcount == REG_INFTY && minnext + deltanext > 0);
diff --git a/debian/patches/fixes/CVE-2020-10878.diff b/debian/patches/fixes/CVE-2020-10878.diff
new file mode 100644
index 0000000000..3ebc4ad609
--- /dev/null
+++ b/debian/patches/fixes/CVE-2020-10878.diff
@@ -0,0 +1,150 @@
+From c9023d134e4800e43e8bcb83266aa0380321a05c Mon Sep 17 00:00:00 2001
+From: Hugo van der Sanden <hv@crypt.org>
+Date: Tue, 18 Feb 2020 13:51:16 +0000
+Subject: study_chunk: extract rck_elide_nothing
+
+(CVE-2020-10878)
+
+Bug-Debian: https://bugs.debian.org/962005
+Origin: upstream
+Patch-Name: fixes/CVE-2020-10878.diff
+---
+ embed.fnc | 1 +
+ embed.h | 1 +
+ proto.h | 3 +++
+ regcomp.c | 70 ++++++++++++++++++++++++++++++++++---------------------
+ 4 files changed, 48 insertions(+), 27 deletions(-)
+
+diff --git a/embed.fnc b/embed.fnc
+index e762fe1eec..cf89277163 100644
+--- a/embed.fnc
++++ b/embed.fnc
+@@ -2477,6 +2477,7 @@ Es |SSize_t|study_chunk |NN RExC_state_t *pRExC_state \
+ |I32 stopparen|U32 recursed_depth \
+ |NULLOK regnode_ssc *and_withp \
+ |U32 flags|U32 depth
++Es |void |rck_elide_nothing|NN regnode *node
+ EsR |SV * |get_ANYOFM_contents|NN const regnode * n
+ EsRn |U32 |add_data |NN RExC_state_t* const pRExC_state \
+ |NN const char* const s|const U32 n
+diff --git a/embed.h b/embed.h
+index a5416a1148..886551ce5c 100644
+--- a/embed.h
++++ b/embed.h
+@@ -1202,6 +1202,7 @@
+ #define output_or_return_posix_warnings(a,b,c) S_output_or_return_posix_warnings(aTHX_ a,b,c)
+ #define parse_lparen_question_flags(a) S_parse_lparen_question_flags(aTHX_ a)
+ #define populate_ANYOF_from_invlist(a,b) S_populate_ANYOF_from_invlist(aTHX_ a,b)
++#define rck_elide_nothing(a) S_rck_elide_nothing(aTHX_ a)
+ #define reg(a,b,c,d) S_reg(aTHX_ a,b,c,d)
+ #define reg2Lanode(a,b,c,d) S_reg2Lanode(aTHX_ a,b,c,d)
+ #define reg_node(a,b) S_reg_node(aTHX_ a,b)
+diff --git a/proto.h b/proto.h
+index 66bb29b132..d3f8802c1d 100644
+--- a/proto.h
++++ b/proto.h
+@@ -5485,6 +5485,9 @@ STATIC void S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state);
+ STATIC void S_populate_ANYOF_from_invlist(pTHX_ regnode *node, SV** invlist_ptr);
+ #define PERL_ARGS_ASSERT_POPULATE_ANYOF_FROM_INVLIST \
+ assert(node); assert(invlist_ptr)
++STATIC void S_rck_elide_nothing(pTHX_ regnode *node);
++#define PERL_ARGS_ASSERT_RCK_ELIDE_NOTHING \
++ assert(node)
+ PERL_STATIC_NO_RET void S_re_croak2(pTHX_ bool utf8, const char* pat1, const char* pat2, ...)
+ __attribute__noreturn__;
+ #define PERL_ARGS_ASSERT_RE_CROAK2 \
+diff --git a/regcomp.c b/regcomp.c
+index dd18add1db..0a9c6a8085 100644
+--- a/regcomp.c
++++ b/regcomp.c
+@@ -4178,6 +4178,44 @@ S_unwind_scan_frames(pTHX_ const void *p)
+ } while (f);
+ }
+
++/* Follow the next-chain of the current node and optimize away
++ all the NOTHINGs from it.
++ */
++STATIC void
++S_rck_elide_nothing(pTHX_ regnode *node)
++{
++ dVAR;
++
++ PERL_ARGS_ASSERT_RCK_ELIDE_NOTHING;
++
++ if (OP(node) != CURLYX) {
++ const int max = (reg_off_by_arg[OP(node)]
++ ? I32_MAX
++ /* I32 may be smaller than U16 on CRAYs! */
++ : (I32_MAX < U16_MAX ? I32_MAX : U16_MAX));
++ int off = (reg_off_by_arg[OP(node)] ? ARG(node) : NEXT_OFF(node));
++ int noff;
++ regnode *n = node;
++
++ /* Skip NOTHING and LONGJMP. */
++ while (
++ (n = regnext(n))
++ && (
++ (PL_regkind[OP(n)] == NOTHING && (noff = NEXT_OFF(n)))
++ || ((OP(n) == LONGJMP) && (noff = ARG(n)))
++ )
++ && off + noff < max
++ ) {
++ off += noff;
++ }
++ if (reg_off_by_arg[OP(node)])
++ ARG(node) = off;
++ else
++ NEXT_OFF(node) = off;
++ }
++ return;
++}
++
+ /* the return from this sub is the minimum length that could possibly match */
+ STATIC SSize_t
+ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
+@@ -4277,28 +4315,10 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
+ */
+ JOIN_EXACT(scan,&min_subtract, &unfolded_multi_char, 0);
+
+- /* Follow the next-chain of the current node and optimize
+- away all the NOTHINGs from it. */
+- if (OP(scan) != CURLYX) {
+- const int max = (reg_off_by_arg[OP(scan)]
+- ? I32_MAX
+- /* I32 may be smaller than U16 on CRAYs! */
+- : (I32_MAX < U16_MAX ? I32_MAX : U16_MAX));
+- int off = (reg_off_by_arg[OP(scan)] ? ARG(scan) : NEXT_OFF(scan));
+- int noff;
+- regnode *n = scan;
+-
+- /* Skip NOTHING and LONGJMP. */
+- while ((n = regnext(n))
+- && ((PL_regkind[OP(n)] == NOTHING && (noff = NEXT_OFF(n)))
+- || ((OP(n) == LONGJMP) && (noff = ARG(n))))
+- && off + noff < max)
+- off += noff;
+- if (reg_off_by_arg[OP(scan)])
+- ARG(scan) = off;
+- else
+- NEXT_OFF(scan) = off;
+- }
++ /* Follow the next-chain of the current node and optimize
++ away all the NOTHINGs from it.
++ */
++ rck_elide_nothing(scan);
+
+ /* The principal pseudo-switch. Cannot be a switch, since we
+ look into several different things. */
+@@ -5425,11 +5445,7 @@ Perl_re_printf( aTHX_ "LHS=%" UVuf " RHS=%" UVuf "\n",
+ if (data && (fl & SF_HAS_EVAL))
+ data->flags |= SF_HAS_EVAL;
+ optimize_curly_tail:
+- if (OP(oscan) != CURLYX) {
+- while (PL_regkind[OP(next = regnext(oscan))] == NOTHING
+- && NEXT_OFF(next))
+- NEXT_OFF(oscan) += NEXT_OFF(next);
+- }
++ rck_elide_nothing(oscan);
+ continue;
+
+ default:
diff --git a/debian/patches/fixes/CVE-2020-12723.diff b/debian/patches/fixes/CVE-2020-12723.diff
new file mode 100644
index 0000000000..ba9fd1ae4c
--- /dev/null
+++ b/debian/patches/fixes/CVE-2020-12723.diff
@@ -0,0 +1,279 @@
+From 20c1e2be75af0e9f8c13d224110a99d4c591999f Mon Sep 17 00:00:00 2001
+From: Hugo van der Sanden <hv@crypt.org>
+Date: Sat, 11 Apr 2020 14:10:24 +0100
+Subject: study_chunk: avoid mutating regexp program within GOSUB
+
+gh16947 and gh17743: studying GOSUB may restudy in an inner call
+(via a mix of recursion and enframing) something that an outer call
+is in the middle of looking at. Let the outer frame deal with it.
+
+(CVE-2020-12723)
+
+Bug-Debian: https://bugs.debian.org/962005
+Origin: upstream
+Patch-Name: fixes/CVE-2020-12723.diff
+---
+ embed.fnc | 2 +-
+ embed.h | 2 +-
+ proto.h | 2 +-
+ regcomp.c | 48 ++++++++++++++++++++++++++++++++----------------
+ t/re/pat.t | 26 +++++++++++++++++++++++++-
+ 5 files changed, 60 insertions(+), 20 deletions(-)
+
+diff --git a/embed.fnc b/embed.fnc
+index cf89277163..4b1ba28277 100644
+--- a/embed.fnc
++++ b/embed.fnc
+@@ -2476,7 +2476,7 @@ Es |SSize_t|study_chunk |NN RExC_state_t *pRExC_state \
+ |NULLOK struct scan_data_t *data \
+ |I32 stopparen|U32 recursed_depth \
+ |NULLOK regnode_ssc *and_withp \
+- |U32 flags|U32 depth
++ |U32 flags|U32 depth|bool was_mutate_ok
+ Es |void |rck_elide_nothing|NN regnode *node
+ EsR |SV * |get_ANYOFM_contents|NN const regnode * n
+ EsRn |U32 |add_data |NN RExC_state_t* const pRExC_state \
+diff --git a/embed.h b/embed.h
+index 886551ce5c..50fcabc140 100644
+--- a/embed.h
++++ b/embed.h
+@@ -1232,7 +1232,7 @@
+ #define ssc_is_cp_posixl_init S_ssc_is_cp_posixl_init
+ #define ssc_or(a,b,c) S_ssc_or(aTHX_ a,b,c)
+ #define ssc_union(a,b,c) S_ssc_union(aTHX_ a,b,c)
+-#define study_chunk(a,b,c,d,e,f,g,h,i,j,k) S_study_chunk(aTHX_ a,b,c,d,e,f,g,h,i,j,k)
++#define study_chunk(a,b,c,d,e,f,g,h,i,j,k,l) S_study_chunk(aTHX_ a,b,c,d,e,f,g,h,i,j,k,l)
+ # endif
+ # if defined(PERL_IN_REGCOMP_C) || defined (PERL_IN_DUMP_C)
+ #define _invlist_dump(a,b,c,d) Perl__invlist_dump(aTHX_ a,b,c,d)
+diff --git a/proto.h b/proto.h
+index d3f8802c1d..e276f69bd1 100644
+--- a/proto.h
++++ b/proto.h
+@@ -5596,7 +5596,7 @@ PERL_STATIC_INLINE void S_ssc_union(pTHX_ regnode_ssc *ssc, SV* const invlist, c
+ #define PERL_ARGS_ASSERT_SSC_UNION \
+ assert(ssc); assert(invlist)
+ #endif
+-STATIC SSize_t S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, SSize_t *minlenp, SSize_t *deltap, regnode *last, struct scan_data_t *data, I32 stopparen, U32 recursed_depth, regnode_ssc *and_withp, U32 flags, U32 depth);
++STATIC SSize_t S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, SSize_t *minlenp, SSize_t *deltap, regnode *last, struct scan_data_t *data, I32 stopparen, U32 recursed_depth, regnode_ssc *and_withp, U32 flags, U32 depth, bool was_mutate_ok);
+ #define PERL_ARGS_ASSERT_STUDY_CHUNK \
+ assert(pRExC_state); assert(scanp); assert(minlenp); assert(deltap); assert(last)
+ #endif
+diff --git a/regcomp.c b/regcomp.c
+index 0a9c6a8085..e66032a16a 100644
+--- a/regcomp.c
++++ b/regcomp.c
+@@ -110,6 +110,7 @@ typedef struct scan_frame {
+ regnode *next_regnode; /* next node to process when last is reached */
+ U32 prev_recursed_depth;
+ I32 stopparen; /* what stopparen do we use */
++ bool in_gosub; /* this or an outer frame is for GOSUB */
+
+ struct scan_frame *this_prev_frame; /* this previous frame */
+ struct scan_frame *prev_frame; /* previous frame */
+@@ -4225,7 +4226,7 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
+ I32 stopparen,
+ U32 recursed_depth,
+ regnode_ssc *and_withp,
+- U32 flags, U32 depth)
++ U32 flags, U32 depth, bool was_mutate_ok)
+ /* scanp: Start here (read-write). */
+ /* deltap: Write maxlen-minlen here. */
+ /* last: Stop before this one. */
+@@ -4303,6 +4304,10 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
+ node length to get a real minimum (because
+ the folded version may be shorter) */
+ bool unfolded_multi_char = FALSE;
++ /* avoid mutating ops if we are anywhere within the recursed or
++ * enframed handling for a GOSUB: the outermost level will handle it.
++ */
++ bool mutate_ok = was_mutate_ok && !(frame && frame->in_gosub);
+ /* Peephole optimizer: */
+ DEBUG_STUDYDATA("Peep", data, depth, is_inf);
+ DEBUG_PEEP("Peep", scan, depth, flags);
+@@ -4313,7 +4318,8 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
+ * parsing code, as each (?:..) is handled by a different invocation of
+ * reg() -- Yves
+ */
+- JOIN_EXACT(scan,&min_subtract, &unfolded_multi_char, 0);
++ if (mutate_ok)
++ JOIN_EXACT(scan,&min_subtract, &unfolded_multi_char, 0);
+
+ /* Follow the next-chain of the current node and optimize
+ away all the NOTHINGs from it.
+@@ -4345,7 +4351,7 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
+ /* DEFINEP study_chunk() recursion */
+ (void)study_chunk(pRExC_state, &scan, &minlen,
+ &deltanext, next, &data_fake, stopparen,
+- recursed_depth, NULL, f, depth+1);
++ recursed_depth, NULL, f, depth+1, mutate_ok);
+
+ scan = next;
+ } else
+@@ -4413,7 +4419,8 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
+ /* recurse study_chunk() for each BRANCH in an alternation */
+ minnext = study_chunk(pRExC_state, &scan, minlenp,
+ &deltanext, next, &data_fake, stopparen,
+- recursed_depth, NULL, f,depth+1);
++ recursed_depth, NULL, f, depth+1,
++ mutate_ok);
+
+ if (min1 > minnext)
+ min1 = minnext;
+@@ -4480,9 +4487,10 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
+ }
+ }
+
+- if (PERL_ENABLE_TRIE_OPTIMISATION &&
+- OP( startbranch ) == BRANCH )
+- {
++ if (PERL_ENABLE_TRIE_OPTIMISATION
++ && OP(startbranch) == BRANCH
++ && mutate_ok
++ ) {
+ /* demq.
+
+ Assuming this was/is a branch we are dealing with: 'scan'
+@@ -4933,6 +4941,9 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
+ newframe->stopparen = stopparen;
+ newframe->prev_recursed_depth = recursed_depth;
+ newframe->this_prev_frame= frame;
++ newframe->in_gosub = (
++ (frame && frame->in_gosub) || OP(scan) == GOSUB
++ );
+
+ DEBUG_STUDYDATA("frame-new", data, depth, is_inf);
+ DEBUG_PEEP("fnew", scan, depth, flags);
+@@ -5153,7 +5164,7 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
+ (mincount == 0
+ ? (f & ~SCF_DO_SUBSTR)
+ : f)
+- ,depth+1);
++ , depth+1, mutate_ok);
+
+ if (flags & SCF_DO_STCLASS)
+ data->start_class = oclass;
+@@ -5221,7 +5232,9 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
+ if ( OP(oscan) == CURLYX && data
+ && data->flags & SF_IN_PAR
+ && !(data->flags & SF_HAS_EVAL)
+- && !deltanext && minnext == 1 ) {
++ && !deltanext && minnext == 1
++ && mutate_ok
++ ) {
+ /* Try to optimize to CURLYN. */
+ regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS;
+ regnode * const nxt1 = nxt;
+@@ -5267,10 +5280,10 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
+ && !(data->flags & SF_HAS_EVAL)
+ && !deltanext /* atom is fixed width */
+ && minnext != 0 /* CURLYM can't handle zero width */
+-
+ /* Nor characters whose fold at run-time may be
+ * multi-character */
+ && ! (RExC_seen & REG_UNFOLDED_MULTI_SEEN)
++ && mutate_ok
+ ) {
+ /* XXXX How to optimize if data == 0? */
+ /* Optimize to a simpler form. */
+@@ -5318,7 +5331,8 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
+ /* Optimize again: */
+ /* recurse study_chunk() on optimised CURLYX => CURLYM */
+ study_chunk(pRExC_state, &nxt1, minlenp, &deltanext, nxt,
+- NULL, stopparen, recursed_depth, NULL, 0,depth+1);
++ NULL, stopparen, recursed_depth, NULL, 0,
++ depth+1, mutate_ok);
+ }
+ else
+ oscan->flags = 0;
+@@ -5735,7 +5749,8 @@ Perl_re_printf( aTHX_ "LHS=%" UVuf " RHS=%" UVuf "\n",
+ /* recurse study_chunk() for lookahead body */
+ minnext = study_chunk(pRExC_state, &nscan, minlenp, &deltanext,
+ last, &data_fake, stopparen,
+- recursed_depth, NULL, f, depth+1);
++ recursed_depth, NULL, f, depth+1,
++ mutate_ok);
+ if (scan->flags) {
+ if (deltanext) {
+ FAIL("Variable length lookbehind not implemented");
+@@ -5827,7 +5842,7 @@ Perl_re_printf( aTHX_ "LHS=%" UVuf " RHS=%" UVuf "\n",
+ *minnextp = study_chunk(pRExC_state, &nscan, minnextp,
+ &deltanext, last, &data_fake,
+ stopparen, recursed_depth, NULL,
+- f,depth+1);
++ f, depth+1, mutate_ok);
+ if (scan->flags) {
+ if (deltanext) {
+ FAIL("Variable length lookbehind not implemented");
+@@ -5988,7 +6003,8 @@ Perl_re_printf( aTHX_ "LHS=%" UVuf " RHS=%" UVuf "\n",
+ /* optimise study_chunk() for TRIE */
+ minnext = study_chunk(pRExC_state, &scan, minlenp,
+ &deltanext, (regnode *)nextbranch, &data_fake,
+- stopparen, recursed_depth, NULL, f,depth+1);
++ stopparen, recursed_depth, NULL, f, depth+1,
++ mutate_ok);
+ }
+ if (nextbranch && PL_regkind[OP(nextbranch)]==BRANCH)
+ nextbranch= regnext((regnode*)nextbranch);
+@@ -7673,7 +7689,7 @@ Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count,
+ &data, -1, 0, NULL,
+ SCF_DO_SUBSTR | SCF_WHILEM_VISITED_POS | stclass_flag
+ | (restudied ? SCF_TRIE_DOING_RESTUDY : 0),
+- 0);
++ 0, TRUE);
+
+
+ CHECK_RESTUDY_GOTO_butfirst(LEAVE_with_name("study_chunk"));
+@@ -7802,7 +7818,7 @@ Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count,
+ SCF_DO_STCLASS_AND|SCF_WHILEM_VISITED_POS|(restudied
+ ? SCF_TRIE_DOING_RESTUDY
+ : 0),
+- 0);
++ 0, TRUE);
+
+ CHECK_RESTUDY_GOTO_butfirst(NOOP);
+
+diff --git a/t/re/pat.t b/t/re/pat.t
+index 1d98fe77d7..1488259b02 100644
+--- a/t/re/pat.t
++++ b/t/re/pat.t
+@@ -23,7 +23,7 @@ BEGIN {
+ skip_all('no re module') unless defined &DynaLoader::boot_DynaLoader;
+ skip_all_without_unicode_tables();
+
+-plan tests => 848; # Update this when adding/deleting tests.
++plan tests => 852; # Update this when adding/deleting tests.
+
+ run_tests() unless caller;
+
+@@ -1948,6 +1948,30 @@ EOP
+ fresh_perl_is('m m0*0+\Rm', "",{},"Undefined behavior in address sanitizer");
+ }
+
++ # gh16947: test regexp corruption (GOSUB)
++ {
++ fresh_perl_is(q{
++ 'xy' =~ /x(?0)|x(?|y|y)/ && print 'ok'
++ }, 'ok', {}, 'gh16947: test regexp corruption (GOSUB)');
++ }
++ # gh16947: test fix doesn't break SUSPEND
++ {
++ fresh_perl_is(q{ 'sx' =~ m{ss++}i; print 'ok' },
++ 'ok', {}, "gh16947: test fix doesn't break SUSPEND");
++ }
++
++ # gh17743: more regexp corruption via GOSUB
++ {
++ fresh_perl_is(q{
++ "0" =~ /((0(?0)|000(?|0000|0000)(?0))|)/; print "ok"
++ }, 'ok', {}, 'gh17743: test regexp corruption (1)');
++
++ fresh_perl_is(q{
++ "000000000000" =~ /(0(())(0((?0)())|000(?|\x{ef}\x{bf}\x{bd}|\x{ef}\x{bf}\x{bd}))|)/;
++ print "ok"
++ }, 'ok', {}, 'gh17743: test regexp corruption (2)');
++ }
++
+ } # End of sub run_tests
+
+ 1;
diff --git a/debian/patches/fixes/autodie-scope.diff b/debian/patches/fixes/autodie-scope.diff
index a9ce874a67..3b3c931b21 100644
--- a/debian/patches/fixes/autodie-scope.diff
+++ b/debian/patches/fixes/autodie-scope.diff
@@ -23,7 +23,7 @@ Patch-Name: fixes/autodie-scope.diff
create mode 100755 cpan/autodie/t/no-default.t
diff --git a/cpan/autodie/lib/Fatal.pm b/cpan/autodie/lib/Fatal.pm
-index 16e174347..2058abdab 100644
+index 16e1743474..2058abdab0 100644
--- a/cpan/autodie/lib/Fatal.pm
+++ b/cpan/autodie/lib/Fatal.pm
@@ -580,7 +580,12 @@ sub unimport {
@@ -42,7 +42,7 @@ index 16e174347..2058abdab 100644
}
diff --git a/cpan/autodie/t/no-all.t b/cpan/autodie/t/no-all.t
new file mode 100755
-index 000000000..1a503f68b
+index 0000000000..1a503f68be
--- /dev/null
+++ b/cpan/autodie/t/no-all.t
@@ -0,0 +1,22 @@
@@ -70,7 +70,7 @@ index 000000000..1a503f68b
+1;
diff --git a/cpan/autodie/t/no-default.t b/cpan/autodie/t/no-default.t
new file mode 100755
-index 000000000..44d2acf27
+index 0000000000..44d2acf27a
--- /dev/null
+++ b/cpan/autodie/t/no-default.t
@@ -0,0 +1,23 @@
diff --git a/debian/patches/fixes/caretx-fallback.diff b/debian/patches/fixes/caretx-fallback.diff
index e88d86c93c..60bad8b59d 100644
--- a/debian/patches/fixes/caretx-fallback.diff
+++ b/debian/patches/fixes/caretx-fallback.diff
@@ -12,7 +12,7 @@ Patch-Name: fixes/caretx-fallback.diff
1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/caretx.c b/caretx.c
-index d758f730d..247708de8 100644
+index d758f730de..247708de8c 100644
--- a/caretx.c
+++ b/caretx.c
@@ -56,7 +56,19 @@ Perl_set_caret_X(pTHX) {
diff --git a/debian/patches/fixes/cpan_web_link.diff b/debian/patches/fixes/cpan_web_link.diff
index 0aa99086b6..bf1874c393 100644
--- a/debian/patches/fixes/cpan_web_link.diff
+++ b/debian/patches/fixes/cpan_web_link.diff
@@ -11,7 +11,7 @@ Patch-Name: fixes/cpan_web_link.diff
1 file changed, 3 insertions(+)
diff --git a/cpan/CPAN/lib/CPAN.pm b/cpan/CPAN/lib/CPAN.pm
-index 1f69119e5..c472effe1 100644
+index 1f69119e5f..c472effe18 100644
--- a/cpan/CPAN/lib/CPAN.pm
+++ b/cpan/CPAN/lib/CPAN.pm
@@ -3990,6 +3990,9 @@ your operating system) then typing C<cpan> in a console window will
diff --git a/debian/patches/fixes/document_makemaker_ccflags.diff b/debian/patches/fixes/document_makemaker_ccflags.diff
index 5b8009f6fc..e2f86001b6 100644
--- a/debian/patches/fixes/document_makemaker_ccflags.diff
+++ b/debian/patches/fixes/document_makemaker_ccflags.diff
@@ -15,7 +15,7 @@ Patch-Name: fixes/document_makemaker_ccflags.diff
1 file changed, 4 insertions(+)
diff --git a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm
-index 90d9eac49..81bdc9664 100644
+index 90d9eac49c..81bdc96649 100644
--- a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm
+++ b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm
@@ -1838,6 +1838,10 @@ currently used by MakeMaker but may be handy in Makefile.PLs.
diff --git a/debian/patches/fixes/errno-include-path.diff b/debian/patches/fixes/errno-include-path.diff
index be3c1945f4..bb5f58bf24 100644
--- a/debian/patches/fixes/errno-include-path.diff
+++ b/debian/patches/fixes/errno-include-path.diff
@@ -25,7 +25,7 @@ Origin: upstream, https://perl5.git.perl.org/perl.git/commit/6c5080f25fa3dcede39
1 file changed, 14 insertions(+), 10 deletions(-)
diff --git a/ext/Errno/Errno_pm.PL b/ext/Errno/Errno_pm.PL
-index 6a0031f0f..9d1454c96 100644
+index 6a0031f0f7..9d1454c96a 100644
--- a/ext/Errno/Errno_pm.PL
+++ b/ext/Errno/Errno_pm.PL
@@ -2,7 +2,7 @@ use ExtUtils::MakeMaker;
diff --git a/debian/patches/fixes/eumm-usrmerge.diff b/debian/patches/fixes/eumm-usrmerge.diff
index e8281a05f1..98243d139f 100644
--- a/debian/patches/fixes/eumm-usrmerge.diff
+++ b/debian/patches/fixes/eumm-usrmerge.diff
@@ -21,7 +21,7 @@ Patch-Name: fixes/eumm-usrmerge.diff
3 files changed, 55 insertions(+), 3 deletions(-)
diff --git a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
-index bb41b274b..2e33d0a8a 100644
+index bb41b274b3..2e33d0a8ae 100644
--- a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
+++ b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
@@ -1243,8 +1243,8 @@ sub _fixin_replace_shebang {
@@ -61,7 +61,7 @@ index bb41b274b..2e33d0a8a 100644
# Figure out how to invoke interpreter on this machine.
diff --git a/cpan/ExtUtils-MakeMaker/t/fixin.t b/cpan/ExtUtils-MakeMaker/t/fixin.t
-index 061e45624..872b023c5 100644
+index 061e456247..872b023c55 100644
--- a/cpan/ExtUtils-MakeMaker/t/fixin.t
+++ b/cpan/ExtUtils-MakeMaker/t/fixin.t
@@ -9,7 +9,7 @@ BEGIN {
@@ -109,7 +109,7 @@ index 061e45624..872b023c5 100644
+ );
+}
diff --git a/cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm b/cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm
-index 3d093fcfb..cfe49e546 100644
+index 3d093fcfbd..cfe49e5465 100644
--- a/cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm
+++ b/cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm
@@ -53,6 +53,9 @@ program - this is a program
diff --git a/debian/patches/fixes/fix-manifest-failures.diff b/debian/patches/fixes/fix-manifest-failures.diff
index 1570cb9801..69ff58e8b4 100644
--- a/debian/patches/fixes/fix-manifest-failures.diff
+++ b/debian/patches/fixes/fix-manifest-failures.diff
@@ -18,7 +18,7 @@ Patch-Name: fixes/fix-manifest-failures.diff
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/t/test.pl b/t/test.pl
-index 868911ce3..4d9af221b 100644
+index 868911ce39..4d9af221b9 100644
--- a/t/test.pl
+++ b/t/test.pl
@@ -199,7 +199,9 @@ sub find_git_or_skip {
diff --git a/debian/patches/fixes/getopt-long-4.diff b/debian/patches/fixes/getopt-long-4.diff
index 6a8200bfe5..f11cc82674 100644
--- a/debian/patches/fixes/getopt-long-4.diff
+++ b/debian/patches/fixes/getopt-long-4.diff
@@ -12,7 +12,7 @@ Patch-Name: fixes/getopt-long-4.diff
1 file changed, 6 insertions(+)
diff --git a/cpan/Getopt-Long/lib/Getopt/Long.pm b/cpan/Getopt-Long/lib/Getopt/Long.pm
-index 664c8b63c..e4e3026db 100644
+index 664c8b63c9..e4e3026db6 100644
--- a/cpan/Getopt-Long/lib/Getopt/Long.pm
+++ b/cpan/Getopt-Long/lib/Getopt/Long.pm
@@ -1123,6 +1123,12 @@ sub FindOption ($$$$$) {
diff --git a/debian/patches/fixes/inplace-editing-bugfix/part1.diff b/debian/patches/fixes/inplace-editing-bugfix/part1.diff
index 6bfdd9d44b..613eee2baf 100644
--- a/debian/patches/fixes/inplace-editing-bugfix/part1.diff
+++ b/debian/patches/fixes/inplace-editing-bugfix/part1.diff
@@ -14,7 +14,7 @@ Patch-Name: fixes/inplace-editing-bugfix/part1.diff
4 files changed, 43 insertions(+), 24 deletions(-)
diff --git a/doio.c b/doio.c
-index 309326b27..39f0c42e7 100644
+index 309326b27a..39f0c42e7e 100644
--- a/doio.c
+++ b/doio.c
@@ -1526,31 +1526,14 @@ S_dir_unchanged(pTHX_ const char *orig_pv, MAGIC *mg) {
@@ -96,7 +96,7 @@ index 309326b27..39f0c42e7 100644
}
else {
diff --git a/embed.fnc b/embed.fnc
-index 454a380e4..e762fe1ee 100644
+index 454a380e4c..e762fe1eec 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -440,6 +440,7 @@ p |bool|do_exec3 |NN const char *incmd|int fd|int do_report
@@ -108,7 +108,7 @@ index 454a380e4..e762fe1ee 100644
#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
: Defined in doio.c, used only in pp_sys.c
diff --git a/embed.h b/embed.h
-index fb93ebc1c..a5416a114 100644
+index fb93ebc1cb..a5416a1148 100644
--- a/embed.h
+++ b/embed.h
@@ -1746,6 +1746,7 @@
@@ -120,7 +120,7 @@ index fb93ebc1c..a5416a114 100644
#define ingroup(a,b) S_ingroup(aTHX_ a,b)
#define openn_cleanup(a,b,c,d,e,f,g,h,i,j,k,l,m) S_openn_cleanup(aTHX_ a,b,c,d,e,f,g,h,i,j,k,l,m)
diff --git a/proto.h b/proto.h
-index c91141b9e..66bb29b13 100644
+index c91141b9e8..66bb29b132 100644
--- a/proto.h
+++ b/proto.h
@@ -4723,6 +4723,9 @@ STATIC void S_deb_stack_n(pTHX_ SV** stack_base, I32 stack_min, I32 stack_max, I
diff --git a/debian/patches/fixes/inplace-editing-bugfix/part2.diff b/debian/patches/fixes/inplace-editing-bugfix/part2.diff
index 07426faebe..9e8dab90d2 100644
--- a/debian/patches/fixes/inplace-editing-bugfix/part2.diff
+++ b/debian/patches/fixes/inplace-editing-bugfix/part2.diff
@@ -12,7 +12,7 @@ Patch-Name: fixes/inplace-editing-bugfix/part2.diff
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/t/io/inplace.t b/t/io/inplace.t
-index 98159e06b..ac50f1ab7 100644
+index 98159e06bf..ac50f1ab77 100644
--- a/t/io/inplace.t
+++ b/t/io/inplace.t
@@ -5,7 +5,7 @@ require './test.pl';
diff --git a/debian/patches/fixes/inplace-editing-bugfix/part3.diff b/debian/patches/fixes/inplace-editing-bugfix/part3.diff
index 475e83ccbc..76dbdc410d 100644
--- a/debian/patches/fixes/inplace-editing-bugfix/part3.diff
+++ b/debian/patches/fixes/inplace-editing-bugfix/part3.diff
@@ -31,7 +31,7 @@ Patch-Name: fixes/inplace-editing-bugfix/part3.diff
3 files changed, 28 insertions(+), 23 deletions(-)
diff --git a/doio.c b/doio.c
-index 39f0c42e7..f8be31c84 100644
+index 39f0c42e7e..f8be31c84a 100644
--- a/doio.c
+++ b/doio.c
@@ -1173,34 +1173,39 @@ S_argvout_free(pTHX_ SV *io, MAGIC *mg) {
@@ -95,7 +95,7 @@ index 39f0c42e7..f8be31c84 100644
}
#ifdef ARGV_USE_ATFUNCTIONS
diff --git a/t/io/inplace.t b/t/io/inplace.t
-index ac50f1ab7..0403cd925 100644
+index ac50f1ab77..0403cd9250 100644
--- a/t/io/inplace.t
+++ b/t/io/inplace.t
@@ -96,7 +96,7 @@ SKIP:
@@ -108,7 +108,7 @@ index ac50f1ab7..0403cd925 100644
our $file = tempfile() ;
diff --git a/t/run/switches.t b/t/run/switches.t
-index 7ccef1e06..594cad6e7 100644
+index 7ccef1e063..594cad6e7f 100644
--- a/t/run/switches.t
+++ b/t/run/switches.t
@@ -429,7 +429,7 @@ __EOF__
diff --git a/debian/patches/fixes/io-socket-ip-nov4.diff b/debian/patches/fixes/io-socket-ip-nov4.diff
new file mode 100644
index 0000000000..e5c90653ea
--- /dev/null
+++ b/debian/patches/fixes/io-socket-ip-nov4.diff
@@ -0,0 +1,272 @@
+From f957f72fbf1f8097741f2e7383cb504fb728391d Mon Sep 17 00:00:00 2001
+From: Dominic Hargreaves <dom@earth.li>
+Date: Wed, 3 Jun 2020 22:38:09 +0100
+Subject: Fix test failures in IO::Socket::IP with an IPv6-only host
+
+This can be tested with:
+
+ # unshare -n
+ # ip li set lo up
+ # ip li add dummy0 type dummy
+ # ip li set dummy0 up
+
+Thanks to Julien Cristau and Niko Tyni for contributing the basis
+of the patch and test instructions.
+
+Bug-Debian: https://bugs.debian.org/962019
+Forwarded: https://rt.cpan.org/Ticket/Display.html?id=132760
+Patch-Name: fixes/io-socket-ip-nov4.diff
+---
+ cpan/IO-Socket-IP/t/01local-client-v4.t | 4 +++-
+ cpan/IO-Socket-IP/t/02local-server-v4.t | 3 ++-
+ cpan/IO-Socket-IP/t/03local-cross-v4.t | 3 +++
+ cpan/IO-Socket-IP/t/11sockopts.t | 6 +++++-
+ cpan/IO-Socket-IP/t/18fdopen.t | 3 ++-
+ cpan/IO-Socket-IP/t/20subclass.t | 3 +++
+ cpan/IO-Socket-IP/t/21as-inet.t | 3 +++
+ cpan/IO-Socket-IP/t/22timeout.t | 3 +++
+ cpan/IO-Socket-IP/t/30nonblocking-connect.t | 4 +++-
+ 9 files changed, 27 insertions(+), 5 deletions(-)
+
+diff --git a/cpan/IO-Socket-IP/t/01local-client-v4.t b/cpan/IO-Socket-IP/t/01local-client-v4.t
+index 7ab7156993..f6aeac4c3b 100644
+--- a/cpan/IO-Socket-IP/t/01local-client-v4.t
++++ b/cpan/IO-Socket-IP/t/01local-client-v4.t
+@@ -8,7 +8,7 @@ use Test::More;
+ use IO::Socket::IP;
+
+ use IO::Socket::INET;
+-use Socket qw( inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in );
++use Socket qw( inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in AI_NUMERICHOST );
+
+ # Some odd locations like BSD jails might not like INADDR_LOOPBACK. We'll
+ # establish a baseline first to test against
+@@ -29,12 +29,14 @@ foreach my $socktype (qw( SOCK_STREAM SOCK_DGRAM )) {
+ LocalHost => "127.0.0.1",
+ Type => Socket->$socktype,
+ Proto => ( $socktype eq "SOCK_STREAM" ? "tcp" : "udp" ), # Because IO::Socket::INET is stupid and always presumes tcp
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ ) or die "Cannot listen on PF_INET - $@";
+
+ my $socket = IO::Socket::IP->new(
+ PeerHost => "127.0.0.1",
+ PeerService => $testserver->sockport,
+ Type => Socket->$socktype,
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ );
+
+ ok( defined $socket, "IO::Socket::IP->new constructs a $socktype socket" ) or
+diff --git a/cpan/IO-Socket-IP/t/02local-server-v4.t b/cpan/IO-Socket-IP/t/02local-server-v4.t
+index c0d349f573..fb711f08bd 100644
+--- a/cpan/IO-Socket-IP/t/02local-server-v4.t
++++ b/cpan/IO-Socket-IP/t/02local-server-v4.t
+@@ -8,7 +8,7 @@ use Test::More;
+ use IO::Socket::IP;
+
+ use IO::Socket::INET;
+-use Socket qw( inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in );
++use Socket qw( inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in AI_NUMERICHOST );
+
+ # Some odd locations like BSD jails might not like INADDR_LOOPBACK. We'll
+ # establish a baseline first to test against
+@@ -29,6 +29,7 @@ foreach my $socktype (qw( SOCK_STREAM SOCK_DGRAM )) {
+ LocalHost => "127.0.0.1",
+ LocalPort => "0",
+ Type => Socket->$socktype,
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ );
+
+ ok( defined $testserver, "IO::Socket::IP->new constructs a $socktype socket" ) or
+diff --git a/cpan/IO-Socket-IP/t/03local-cross-v4.t b/cpan/IO-Socket-IP/t/03local-cross-v4.t
+index 8cac72a95b..3e8174ee08 100644
+--- a/cpan/IO-Socket-IP/t/03local-cross-v4.t
++++ b/cpan/IO-Socket-IP/t/03local-cross-v4.t
+@@ -6,6 +6,7 @@ use warnings;
+ use Test::More;
+
+ use IO::Socket::IP;
++use Socket qw(AI_NUMERICHOST);
+
+ foreach my $socktype (qw( SOCK_STREAM SOCK_DGRAM )) {
+ my $testserver = IO::Socket::IP->new(
+@@ -13,12 +14,14 @@ foreach my $socktype (qw( SOCK_STREAM SOCK_DGRAM )) {
+ LocalHost => "127.0.0.1",
+ LocalPort => "0",
+ Type => Socket->$socktype,
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ ) or die "Cannot listen on PF_INET - $@";
+
+ my $socket = IO::Socket::IP->new(
+ PeerHost => "127.0.0.1",
+ PeerService => $testserver->sockport,
+ Type => Socket->$socktype,
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ ) or die "Cannot connect on PF_INET - $@";
+
+ my $testclient = ( $socktype eq "SOCK_STREAM" ) ?
+diff --git a/cpan/IO-Socket-IP/t/11sockopts.t b/cpan/IO-Socket-IP/t/11sockopts.t
+index 5b850924dd..28daada89f 100644
+--- a/cpan/IO-Socket-IP/t/11sockopts.t
++++ b/cpan/IO-Socket-IP/t/11sockopts.t
+@@ -8,7 +8,7 @@ use Test::More;
+ use IO::Socket::IP;
+
+ use Errno qw( EACCES );
+-use Socket qw( SOL_SOCKET SO_REUSEADDR SO_REUSEPORT SO_BROADCAST );
++use Socket qw( SOL_SOCKET SO_REUSEADDR SO_REUSEPORT SO_BROADCAST AI_NUMERICHOST);
+
+ TODO: {
+ local $TODO = "SO_REUSEADDR doesn't appear to work on cygwin smokers" if $^O eq "cygwin";
+@@ -21,6 +21,7 @@ TODO: {
+ Type => SOCK_STREAM,
+ Listen => 1,
+ ReuseAddr => 1,
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ ) or die "Cannot socket() - $@";
+
+ ok( $sock->getsockopt( SOL_SOCKET, SO_REUSEADDR ), 'SO_REUSEADDR set' );
+@@ -32,6 +33,7 @@ TODO: {
+ Sockopts => [
+ [ SOL_SOCKET, SO_REUSEADDR ],
+ ],
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ ) or die "Cannot socket() - $@";
+
+ ok( $sock->getsockopt( SOL_SOCKET, SO_REUSEADDR ), 'SO_REUSEADDR set via Sockopts' );
+@@ -50,6 +52,7 @@ SKIP: {
+ Type => SOCK_STREAM,
+ Listen => 1,
+ ReusePort => 1,
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ ) or die "Cannot socket() - $@";
+
+ ok( $sock->getsockopt( SOL_SOCKET, SO_REUSEPORT ), 'SO_REUSEPORT set' );
+@@ -62,6 +65,7 @@ SKIP: {
+ LocalHost => "127.0.0.1",
+ Type => SOCK_DGRAM,
+ Broadcast => 1,
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ );
+ skip "Privileges required to set broadcast on datagram socket", 1 if !$sock and $! == EACCES;
+ die "Cannot socket() - $@" unless $sock;
+diff --git a/cpan/IO-Socket-IP/t/18fdopen.t b/cpan/IO-Socket-IP/t/18fdopen.t
+index 20cbe46d47..6843a2c3d2 100644
+--- a/cpan/IO-Socket-IP/t/18fdopen.t
++++ b/cpan/IO-Socket-IP/t/18fdopen.t
+@@ -6,12 +6,13 @@ use warnings;
+ use Test::More;
+
+ use IO::Socket::IP;
+-use Socket qw( SOCK_STREAM );
++use Socket qw( SOCK_STREAM AI_NUMERICHOST );
+
+ my $s1 = IO::Socket::IP->new(
+ LocalHost => "127.0.0.1",
+ Type => SOCK_STREAM,
+ Listen => 1,
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ ) or die "Cannot listen on AF_INET - $@";
+
+ my $s2 = IO::Socket::IP->new;
+diff --git a/cpan/IO-Socket-IP/t/20subclass.t b/cpan/IO-Socket-IP/t/20subclass.t
+index 231bd52cab..fbc9cff23e 100644
+--- a/cpan/IO-Socket-IP/t/20subclass.t
++++ b/cpan/IO-Socket-IP/t/20subclass.t
+@@ -6,16 +6,19 @@ use warnings;
+ use Test::More;
+
+ use IO::Socket::IP;
++use Socket qw( AI_NUMERICHOST );
+
+ my $server = IO::Socket::IP->new(
+ Listen => 1,
+ LocalHost => "127.0.0.1",
+ LocalPort => 0,
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ ) or die "Cannot listen on PF_INET - $!";
+
+ my $client = IO::Socket::IP->new(
+ PeerHost => $server->sockhost,
+ PeerPort => $server->sockport,
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ ) or die "Cannot connect on PF_INET - $!";
+
+ my $accepted = $server->accept( 'MySubclass' )
+diff --git a/cpan/IO-Socket-IP/t/21as-inet.t b/cpan/IO-Socket-IP/t/21as-inet.t
+index 2b8713d46f..fedb8be538 100644
+--- a/cpan/IO-Socket-IP/t/21as-inet.t
++++ b/cpan/IO-Socket-IP/t/21as-inet.t
+@@ -6,16 +6,19 @@ use warnings;
+ use Test::More;
+
+ use IO::Socket::IP;
++use Socket qw( AI_NUMERICHOST );
+
+ my $server = IO::Socket::IP->new(
+ Listen => 1,
+ LocalHost => "127.0.0.1",
+ LocalPort => 0,
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ ) or die "Cannot listen on PF_INET - $!";
+
+ my $client = IO::Socket::IP->new(
+ PeerHost => $server->sockhost,
+ PeerPort => $server->sockport,
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ ) or die "Cannot connect on PF_INET - $!";
+
+ my $accepted = $server->accept
+diff --git a/cpan/IO-Socket-IP/t/22timeout.t b/cpan/IO-Socket-IP/t/22timeout.t
+index a4c28b3af0..c4a08f5d1f 100644
+--- a/cpan/IO-Socket-IP/t/22timeout.t
++++ b/cpan/IO-Socket-IP/t/22timeout.t
+@@ -6,17 +6,20 @@ use warnings;
+ use Test::More;
+
+ use IO::Socket::IP;
++use Socket qw( AI_NUMERICHOST );
+
+ my $server = IO::Socket::IP->new(
+ Listen => 1,
+ LocalHost => "127.0.0.1",
+ LocalPort => 0,
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ ) or die "Cannot listen on PF_INET - $!";
+
+ my $client = IO::Socket::IP->new(
+ PeerHost => $server->sockhost,
+ PeerPort => $server->sockport,
+ Timeout => 0.1,
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ ) or die "Cannot connect on PF_INET - $!";
+
+ ok( defined $client, 'client constructed with Timeout' );
+diff --git a/cpan/IO-Socket-IP/t/30nonblocking-connect.t b/cpan/IO-Socket-IP/t/30nonblocking-connect.t
+index 518bd2ebd8..ade8349354 100644
+--- a/cpan/IO-Socket-IP/t/30nonblocking-connect.t
++++ b/cpan/IO-Socket-IP/t/30nonblocking-connect.t
+@@ -8,7 +8,7 @@ use Test::More;
+ use IO::Socket::IP;
+
+ use IO::Socket::INET;
+-use Socket qw( inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in );
++use Socket qw( inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in AI_NUMERICHOST );
+ use Errno qw( EINPROGRESS EWOULDBLOCK );
+
+ # Some odd locations like BSD jails might not like INADDR_LOOPBACK. We'll
+@@ -27,6 +27,7 @@ my $testserver = IO::Socket::INET->new(
+ Listen => 1,
+ LocalHost => "127.0.0.1",
+ Type => SOCK_STREAM,
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ ) or die "Cannot listen on PF_INET - $@";
+
+ my $socket = IO::Socket::IP->new(
+@@ -34,6 +35,7 @@ my $socket = IO::Socket::IP->new(
+ PeerService => $testserver->sockport,
+ Type => SOCK_STREAM,
+ Blocking => 0,
++ GetAddrInfoFlags => AI_NUMERICHOST,
+ );
+
+ ok( defined $socket, 'IO::Socket::IP->new( Blocking => 0 ) constructs a socket' ) or
diff --git a/debian/patches/fixes/kfreebsd-renameat.diff b/debian/patches/fixes/kfreebsd-renameat.diff
index 76dcd2cb60..307966e8f8 100644
--- a/debian/patches/fixes/kfreebsd-renameat.diff
+++ b/debian/patches/fixes/kfreebsd-renameat.diff
@@ -12,7 +12,7 @@ Origin: upstream, https://perl5.git.perl.org/perl.git/commit/a3c63a9402266c2f0e3
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/doio.c b/doio.c
-index 16daf9fd1..309326b27 100644
+index 16daf9fd11..309326b27a 100644
--- a/doio.c
+++ b/doio.c
@@ -1461,7 +1461,7 @@ Perl_nextargv(pTHX_ GV *gv, bool nomagicopen)
diff --git a/debian/patches/fixes/math_complex_doc_angle_units.diff b/debian/patches/fixes/math_complex_doc_angle_units.diff
index 7b1bc195bb..55d40cacc4 100644
--- a/debian/patches/fixes/math_complex_doc_angle_units.diff
+++ b/debian/patches/fixes/math_complex_doc_angle_units.diff
@@ -11,7 +11,7 @@ Patch-Name: fixes/math_complex_doc_angle_units.diff
1 file changed, 5 insertions(+)
diff --git a/cpan/Math-Complex/lib/Math/Trig.pm b/cpan/Math-Complex/lib/Math/Trig.pm
-index acad31ff4..bc7ac780e 100644
+index acad31ff49..bc7ac780e9 100644
--- a/cpan/Math-Complex/lib/Math/Trig.pm
+++ b/cpan/Math-Complex/lib/Math/Trig.pm
@@ -263,6 +263,11 @@ core Perl which defines only the C<sin()> and C<cos()>. The constant
diff --git a/debian/patches/fixes/math_complex_doc_great_circle.diff b/debian/patches/fixes/math_complex_doc_great_circle.diff
index bd92da8c47..0044737926 100644
--- a/debian/patches/fixes/math_complex_doc_great_circle.diff
+++ b/debian/patches/fixes/math_complex_doc_great_circle.diff
@@ -11,7 +11,7 @@ Patch-Name: fixes/math_complex_doc_great_circle.diff
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cpan/Math-Complex/lib/Math/Trig.pm b/cpan/Math-Complex/lib/Math/Trig.pm
-index 1d9612a41..efc2ff80a 100644
+index 1d9612a41c..efc2ff80ac 100644
--- a/cpan/Math-Complex/lib/Math/Trig.pm
+++ b/cpan/Math-Complex/lib/Math/Trig.pm
@@ -608,7 +608,7 @@ or the midpoint if you know the end points:
diff --git a/debian/patches/fixes/math_complex_doc_see_also.diff b/debian/patches/fixes/math_complex_doc_see_also.diff
index 3fccf3a408..a450510bec 100644
--- a/debian/patches/fixes/math_complex_doc_see_also.diff
+++ b/debian/patches/fixes/math_complex_doc_see_also.diff
@@ -11,7 +11,7 @@ Patch-Name: fixes/math_complex_doc_see_also.diff
1 file changed, 2 insertions(+)
diff --git a/cpan/Math-Complex/lib/Math/Trig.pm b/cpan/Math-Complex/lib/Math/Trig.pm
-index efc2ff80a..acad31ff4 100644
+index efc2ff80ac..acad31ff49 100644
--- a/cpan/Math-Complex/lib/Math/Trig.pm
+++ b/cpan/Math-Complex/lib/Math/Trig.pm
@@ -743,6 +743,8 @@ an answer instead of giving a fatal runtime error.
diff --git a/debian/patches/fixes/memoize-pod.diff b/debian/patches/fixes/memoize-pod.diff
index 0c6fb04c14..66fa487c39 100644
--- a/debian/patches/fixes/memoize-pod.diff
+++ b/debian/patches/fixes/memoize-pod.diff
@@ -11,7 +11,7 @@ Patch-Name: fixes/memoize-pod.diff
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/cpan/Memoize/Memoize.pm b/cpan/Memoize/Memoize.pm
-index f4e6522d4..2f28b361f 100644
+index f4e6522d48..2f28b361f8 100644
--- a/cpan/Memoize/Memoize.pm
+++ b/cpan/Memoize/Memoize.pm
@@ -752,6 +752,8 @@ cache that was populated by the first call. C<complicated> ends up
diff --git a/debian/patches/fixes/memoize_storable_nstore.diff b/debian/patches/fixes/memoize_storable_nstore.diff
index ce29fa254f..942ee01d70 100644
--- a/debian/patches/fixes/memoize_storable_nstore.diff
+++ b/debian/patches/fixes/memoize_storable_nstore.diff
@@ -53,7 +53,7 @@ Patch-Name: fixes/memoize_storable_nstore.diff
2 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/cpan/Memoize/Memoize/Storable.pm b/cpan/Memoize/Memoize/Storable.pm
-index 131479729..87876f227 100644
+index 1314797297..87876f227e 100644
--- a/cpan/Memoize/Memoize/Storable.pm
+++ b/cpan/Memoize/Memoize/Storable.pm
@@ -55,7 +55,7 @@ sub DESTROY {
@@ -66,7 +66,7 @@ index 131479729..87876f227 100644
} else {
Storable::store($self->{H}, $self->{FILENAME});
diff --git a/cpan/Memoize/t/tie_storable.t b/cpan/Memoize/t/tie_storable.t
-index de3b8dc26..a62423850 100644
+index de3b8dc26b..a62423850e 100644
--- a/cpan/Memoize/t/tie_storable.t
+++ b/cpan/Memoize/t/tie_storable.t
@@ -31,18 +31,34 @@ if ($@) {
diff --git a/debian/patches/fixes/pipe-open-bugfix/part1.diff b/debian/patches/fixes/pipe-open-bugfix/part1.diff
index 59a527b1b4..763168dbb5 100644
--- a/debian/patches/fixes/pipe-open-bugfix/part1.diff
+++ b/debian/patches/fixes/pipe-open-bugfix/part1.diff
@@ -23,7 +23,7 @@ Patch-Name: fixes/pipe-open-bugfix/part1.diff
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/util.c b/util.c
-index 842cc953e..17dfda9bc 100644
+index 842cc953e2..17dfda9bc7 100644
--- a/util.c
+++ b/util.c
@@ -2441,8 +2441,10 @@ Perl_my_popen(pTHX_ const char *cmd, const char *mode)
diff --git a/debian/patches/fixes/pipe-open-bugfix/part2.diff b/debian/patches/fixes/pipe-open-bugfix/part2.diff
index cc5ba71bb7..73e160a022 100644
--- a/debian/patches/fixes/pipe-open-bugfix/part2.diff
+++ b/debian/patches/fixes/pipe-open-bugfix/part2.diff
@@ -15,7 +15,7 @@ Patch-Name: fixes/pipe-open-bugfix/part2.diff
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/util.c b/util.c
-index 17dfda9bc..25b5c6601 100644
+index 17dfda9bc7..25b5c6601e 100644
--- a/util.c
+++ b/util.c
@@ -2302,8 +2302,10 @@ Perl_my_popen_list(pTHX_ const char *mode, int n, SV **args)
diff --git a/debian/patches/fixes/posix-mb-sbuild-fix.diff b/debian/patches/fixes/posix-mb-sbuild-fix.diff
new file mode 100644
index 0000000000..ae9c9d71e9
--- /dev/null
+++ b/debian/patches/fixes/posix-mb-sbuild-fix.diff
@@ -0,0 +1,39 @@
+From b13b2eb99ca0d8286d45d09a5439dc25d39ea18b Mon Sep 17 00:00:00 2001
+From: Dominic Hargreaves <dom@earth.li>
+Date: Sun, 17 May 2020 00:14:23 +0100
+Subject: Fix edge case test failure in ext/POSIX/t/mb.t
+
+This new test fails in an environment where LANG is set to one thing and
+LC_ALL is set to another, and where LANG is set to a locale which is
+not installed in the environment in question.
+
+Such a test environment is arguably broken, but appears in common
+chroot setups such as Debian's sbuild tool where LANG is inherited from
+the parent environment, and LC_ALL is used to override it.
+
+Origin: backport, https://github.com/Perl/perl5/commit/8f8f6a18de1ce640a226f841deebf018443f872f
+Patch-Name: fixes/posix-mb-sbuild-fix.diff
+---
+ ext/POSIX/t/mb.t | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/ext/POSIX/t/mb.t b/ext/POSIX/t/mb.t
+index 961edf6cf2..cdd0808eee 100644
+--- a/ext/POSIX/t/mb.t
++++ b/ext/POSIX/t/mb.t
+@@ -33,9 +33,13 @@ SKIP: {
+ my $utf8_locale = find_utf8_ctype_locale();
+ skip("no utf8 locale available", 2) unless $utf8_locale;
+
++ # Here we need to influence LC_CTYPE, but it's not enough to just
++ # set this because LC_ALL could override it. It's also not enough
++ # to delete LC_ALL because it could be used to override other
++ # variables such as LANG in the underlying test environment.
++ # Continue to set LC_CTYPE just in case...
+ local $ENV{LC_CTYPE} = $utf8_locale;
+- local $ENV{LC_ALL};
+- delete $ENV{LC_ALL};
++ local $ENV{LC_ALL} = $utf8_locale;
+
+ fresh_perl_is(
+ 'use POSIX; print &POSIX::mblen("\x{c3}\x{28}", &POSIX::MB_CUR_MAX)',
diff --git a/debian/patches/fixes/posix-mbrlen.diff b/debian/patches/fixes/posix-mbrlen.diff
index f7dc1a4140..4e574d4d72 100644
--- a/debian/patches/fixes/posix-mbrlen.diff
+++ b/debian/patches/fixes/posix-mbrlen.diff
@@ -53,7 +53,7 @@ Origin: backport, https://perl5.git.perl.org/perl.git/commit/25d7b7aa379d33ce2e8
create mode 100644 ext/POSIX/t/mb.t
diff --git a/MANIFEST b/MANIFEST
-index fcf3455b2..aa5e9b16b 100644
+index fcf3455b2e..aa5e9b16bd 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -4233,6 +4233,7 @@ ext/POSIX/POSIX.xs POSIX extension external subroutines
@@ -65,7 +65,7 @@ index fcf3455b2..aa5e9b16b 100644
ext/POSIX/t/sigaction.t See if POSIX::sigaction works
ext/POSIX/t/sigset.t See if POSIX::SigSet works
diff --git a/ext/POSIX/POSIX.xs b/ext/POSIX/POSIX.xs
-index 749730584..395025a86 100644
+index 7497305841..395025a868 100644
--- a/ext/POSIX/POSIX.xs
+++ b/ext/POSIX/POSIX.xs
@@ -3318,7 +3318,7 @@ mblen(s, n)
@@ -79,7 +79,7 @@ index 749730584..395025a86 100644
RETVAL = mblen(s, n);
diff --git a/ext/POSIX/t/mb.t b/ext/POSIX/t/mb.t
new file mode 100644
-index 000000000..961edf6cf
+index 0000000000..961edf6cf2
--- /dev/null
+++ b/ext/POSIX/t/mb.t
@@ -0,0 +1,47 @@
diff --git a/debian/patches/fixes/respect_umask.diff b/debian/patches/fixes/respect_umask.diff
index db0c73036b..e7186f8aae 100644
--- a/debian/patches/fixes/respect_umask.diff
+++ b/debian/patches/fixes/respect_umask.diff
@@ -13,7 +13,7 @@ Patch-Name: fixes/respect_umask.diff
2 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/cpan/ExtUtils-Install/lib/ExtUtils/Install.pm b/cpan/ExtUtils-Install/lib/ExtUtils/Install.pm
-index 047c00714..cd7e4f234 100644
+index 047c007145..cd7e4f234c 100644
--- a/cpan/ExtUtils-Install/lib/ExtUtils/Install.pm
+++ b/cpan/ExtUtils-Install/lib/ExtUtils/Install.pm
@@ -463,7 +463,7 @@ sub _can_write_dir {
@@ -88,7 +88,7 @@ index 047c00714..cd7e4f234 100644
if ($need_filtering) {
run_filter($pm_filter, $from, $to);
diff --git a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
-index fe53be12e..274e35c6f 100644
+index fe53be12ef..274e35c6fc 100644
--- a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
+++ b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm
@@ -2229,7 +2229,7 @@ doc__install : doc_site_install
diff --git a/debian/patches/fixes/storable-probing/disable-probing.diff b/debian/patches/fixes/storable-probing/disable-probing.diff
index eace7c22a7..697344dd31 100644
--- a/debian/patches/fixes/storable-probing/disable-probing.diff
+++ b/debian/patches/fixes/storable-probing/disable-probing.diff
@@ -22,7 +22,7 @@ Patch-Name: fixes/storable-probing/disable-probing.diff
8 files changed, 31 insertions(+), 164 deletions(-)
diff --git a/Makefile.SH b/Makefile.SH
-index 48151bce6..084924dab 100755
+index 48151bce65..084924dab5 100755
--- a/Makefile.SH
+++ b/Makefile.SH
@@ -173,15 +173,11 @@ esac
@@ -77,7 +77,7 @@ index 48151bce6..084924dab 100755
flags="--$name";
flags=`echo $flags | sed -e 's/--all//'`
diff --git a/dist/Storable/Makefile.PL b/dist/Storable/Makefile.PL
-index 69efc8294..60af5d256 100644
+index 69efc82944..60af5d256a 100644
--- a/dist/Storable/Makefile.PL
+++ b/dist/Storable/Makefile.PL
@@ -12,15 +12,7 @@ use Config;
@@ -144,7 +144,7 @@ index 69efc8294..60af5d256 100644
'
all :: Storable.pm
diff --git a/dist/Storable/__Storable__.pm b/dist/Storable/__Storable__.pm
-index 71c669daa..e5a655ecd 100644
+index 71c669daaf..e5a655ecda 100644
--- a/dist/Storable/__Storable__.pm
+++ b/dist/Storable/__Storable__.pm
@@ -32,8 +32,6 @@ our $VERSION = '3.08';
@@ -193,7 +193,7 @@ index 71c669daa..e5a655ecd 100644
modifying C<$Storable::recursion_limit> and
C<$Storable::recursion_limit_hash> respectively. Either can be set to
diff --git a/dist/Storable/stacksize b/dist/Storable/stacksize
-index 14e073973..f93eccce1 100644
+index 14e0739734..f93eccce1a 100644
--- a/dist/Storable/stacksize
+++ b/dist/Storable/stacksize
@@ -1,21 +1,17 @@
@@ -370,7 +370,7 @@ index 14e073973..f93eccce1 100644
- or die "Failed to close $fn: $!\n";
}
diff --git a/dist/Storable/t/recurse.t b/dist/Storable/t/recurse.t
-index 63fde90fd..b5967a072 100644
+index 63fde90fdf..b5967a072c 100644
--- a/dist/Storable/t/recurse.t
+++ b/dist/Storable/t/recurse.t
@@ -318,9 +318,11 @@ is($refcount_ok, 1, "check refcount");
@@ -387,7 +387,7 @@ index 63fde90fd..b5967a072 100644
my $t;
print "# max depth ", MAX_DEPTH, "\n";
diff --git a/win32/GNUmakefile b/win32/GNUmakefile
-index 05193a1f2..afc18ec8a 100644
+index 05193a1f2d..afc18ec8a4 100644
--- a/win32/GNUmakefile
+++ b/win32/GNUmakefile
@@ -1168,7 +1168,7 @@ CFG_VARS = \
@@ -417,7 +417,7 @@ index 05193a1f2..afc18ec8a 100644
# be running in parallel like UNIDATAFILES, this target a placeholder for the
# future
diff --git a/win32/Makefile b/win32/Makefile
-index 1e245f712..a4776dd22 100644
+index 1e245f7128..a4776dd227 100644
--- a/win32/Makefile
+++ b/win32/Makefile
@@ -939,7 +939,7 @@ CFG_VARS = \
@@ -452,7 +452,7 @@ index 1e245f712..a4776dd22 100644
-del /f $(LIBDIR)\Win32CORE.pm
-del /f $(LIBDIR)\Win32API\File.pm
diff --git a/win32/makefile.mk b/win32/makefile.mk
-index a6072a95a..15b148d15 100644
+index a6072a95a6..15b148d155 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -1139,7 +1139,7 @@ CFG_VARS = \
diff --git a/debian/patches/fixes/storable-probing/prereq1.diff b/debian/patches/fixes/storable-probing/prereq1.diff
index 88e4751b27..18cef04078 100644
--- a/debian/patches/fixes/storable-probing/prereq1.diff
+++ b/debian/patches/fixes/storable-probing/prereq1.diff
@@ -12,7 +12,7 @@ Patch-Name: fixes/storable-probing/prereq1.diff
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/dist/Storable/Makefile.PL b/dist/Storable/Makefile.PL
-index 697750566..4f0213277 100644
+index 697750566d..4f02132776 100644
--- a/dist/Storable/Makefile.PL
+++ b/dist/Storable/Makefile.PL
@@ -14,10 +14,12 @@ use File::Spec;
diff --git a/debian/patches/fixes/storable-probing/prereq2.diff b/debian/patches/fixes/storable-probing/prereq2.diff
index a6fbabce28..7f3175ad36 100644
--- a/debian/patches/fixes/storable-probing/prereq2.diff
+++ b/debian/patches/fixes/storable-probing/prereq2.diff
@@ -12,7 +12,7 @@ Patch-Name: fixes/storable-probing/prereq2.diff
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/dist/Storable/Makefile.PL b/dist/Storable/Makefile.PL
-index 4f0213277..69efc8294 100644
+index 4f02132776..69efc82944 100644
--- a/dist/Storable/Makefile.PL
+++ b/dist/Storable/Makefile.PL
@@ -92,11 +92,18 @@ sub depend {
@@ -36,7 +36,7 @@ index 4f0213277..69efc8294 100644
release : dist
git tag \$(VERSION)
diff --git a/dist/Storable/stacksize b/dist/Storable/stacksize
-index 7abd3a84c..14e073973 100644
+index 7abd3a84cc..14e0739734 100644
--- a/dist/Storable/stacksize
+++ b/dist/Storable/stacksize
@@ -7,6 +7,9 @@ use Cwd;
diff --git a/debian/patches/fixes/storable-recursion.diff b/debian/patches/fixes/storable-recursion.diff
index 28a17493ed..8d9dd7aa2c 100644
--- a/debian/patches/fixes/storable-recursion.diff
+++ b/debian/patches/fixes/storable-recursion.diff
@@ -54,7 +54,7 @@ Patch-Name: fixes/storable-recursion.diff
2 files changed, 77 insertions(+), 37 deletions(-)
diff --git a/dist/Storable/Storable.xs b/dist/Storable/Storable.xs
-index 6a90e2481..f6df32b12 100644
+index 6a90e24814..f6df32b121 100644
--- a/dist/Storable/Storable.xs
+++ b/dist/Storable/Storable.xs
@@ -418,6 +418,24 @@ typedef struct stcxt {
@@ -259,7 +259,7 @@ index 6a90e2481..f6df32b12 100644
--cxt->recur_depth;
}
diff --git a/dist/Storable/t/recurse.t b/dist/Storable/t/recurse.t
-index fa8be0b37..63fde90fd 100644
+index fa8be0b374..63fde90fdf 100644
--- a/dist/Storable/t/recurse.t
+++ b/dist/Storable/t/recurse.t
@@ -20,7 +20,7 @@ use Storable qw(freeze thaw dclone);
diff --git a/debian/patches/fixes/time-local-2020.diff b/debian/patches/fixes/time-local-2020.diff
index 6e26e6142f..de58fe2c0d 100644
--- a/debian/patches/fixes/time-local-2020.diff
+++ b/debian/patches/fixes/time-local-2020.diff
@@ -15,7 +15,7 @@ Patch-Name: fixes/time-local-2020.diff
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/cpan/Time-Local/t/Local.t b/cpan/Time-Local/t/Local.t
-index 634139695..e28c6d212 100644
+index 634139695f..e28c6d2129 100644
--- a/cpan/Time-Local/t/Local.t
+++ b/cpan/Time-Local/t/Local.t
@@ -96,7 +96,7 @@ SKIP: {
diff --git a/debian/patches/series b/debian/patches/series
index 223bfea376..d0328bc6e9 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -59,3 +59,8 @@ fixes/storable-probing/prereq2.diff
fixes/storable-probing/disable-probing.diff
debian/perlbug-editor.diff
fixes/posix-mbrlen.diff
+fixes/CVE-2020-10543.diff
+fixes/CVE-2020-10878.diff
+fixes/CVE-2020-12723.diff
+fixes/io-socket-ip-nov4.diff
+fixes/posix-mb-sbuild-fix.diff
diff --git a/embed.fnc b/embed.fnc
index e762fe1eec..4b1ba28277 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -2476,7 +2476,8 @@ Es |SSize_t|study_chunk |NN RExC_state_t *pRExC_state \
|NULLOK struct scan_data_t *data \
|I32 stopparen|U32 recursed_depth \
|NULLOK regnode_ssc *and_withp \
- |U32 flags|U32 depth
+ |U32 flags|U32 depth|bool was_mutate_ok
+Es |void |rck_elide_nothing|NN regnode *node
EsR |SV * |get_ANYOFM_contents|NN const regnode * n
EsRn |U32 |add_data |NN RExC_state_t* const pRExC_state \
|NN const char* const s|const U32 n
diff --git a/embed.h b/embed.h
index a5416a1148..50fcabc140 100644
--- a/embed.h
+++ b/embed.h
@@ -1202,6 +1202,7 @@
#define output_or_return_posix_warnings(a,b,c) S_output_or_return_posix_warnings(aTHX_ a,b,c)
#define parse_lparen_question_flags(a) S_parse_lparen_question_flags(aTHX_ a)
#define populate_ANYOF_from_invlist(a,b) S_populate_ANYOF_from_invlist(aTHX_ a,b)
+#define rck_elide_nothing(a) S_rck_elide_nothing(aTHX_ a)
#define reg(a,b,c,d) S_reg(aTHX_ a,b,c,d)
#define reg2Lanode(a,b,c,d) S_reg2Lanode(aTHX_ a,b,c,d)
#define reg_node(a,b) S_reg_node(aTHX_ a,b)
@@ -1231,7 +1232,7 @@
#define ssc_is_cp_posixl_init S_ssc_is_cp_posixl_init
#define ssc_or(a,b,c) S_ssc_or(aTHX_ a,b,c)
#define ssc_union(a,b,c) S_ssc_union(aTHX_ a,b,c)
-#define study_chunk(a,b,c,d,e,f,g,h,i,j,k) S_study_chunk(aTHX_ a,b,c,d,e,f,g,h,i,j,k)
+#define study_chunk(a,b,c,d,e,f,g,h,i,j,k,l) S_study_chunk(aTHX_ a,b,c,d,e,f,g,h,i,j,k,l)
# endif
# if defined(PERL_IN_REGCOMP_C) || defined (PERL_IN_DUMP_C)
#define _invlist_dump(a,b,c,d) Perl__invlist_dump(aTHX_ a,b,c,d)
diff --git a/ext/POSIX/t/mb.t b/ext/POSIX/t/mb.t
index 961edf6cf2..cdd0808eee 100644
--- a/ext/POSIX/t/mb.t
+++ b/ext/POSIX/t/mb.t
@@ -33,9 +33,13 @@ SKIP: {
my $utf8_locale = find_utf8_ctype_locale();
skip("no utf8 locale available", 2) unless $utf8_locale;
+ # Here we need to influence LC_CTYPE, but it's not enough to just
+ # set this because LC_ALL could override it. It's also not enough
+ # to delete LC_ALL because it could be used to override other
+ # variables such as LANG in the underlying test environment.
+ # Continue to set LC_CTYPE just in case...
local $ENV{LC_CTYPE} = $utf8_locale;
- local $ENV{LC_ALL};
- delete $ENV{LC_ALL};
+ local $ENV{LC_ALL} = $utf8_locale;
fresh_perl_is(
'use POSIX; print &POSIX::mblen("\x{c3}\x{28}", &POSIX::MB_CUR_MAX)',
diff --git a/proto.h b/proto.h
index 66bb29b132..e276f69bd1 100644
--- a/proto.h
+++ b/proto.h
@@ -5485,6 +5485,9 @@ STATIC void S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state);
STATIC void S_populate_ANYOF_from_invlist(pTHX_ regnode *node, SV** invlist_ptr);
#define PERL_ARGS_ASSERT_POPULATE_ANYOF_FROM_INVLIST \
assert(node); assert(invlist_ptr)
+STATIC void S_rck_elide_nothing(pTHX_ regnode *node);
+#define PERL_ARGS_ASSERT_RCK_ELIDE_NOTHING \
+ assert(node)
PERL_STATIC_NO_RET void S_re_croak2(pTHX_ bool utf8, const char* pat1, const char* pat2, ...)
__attribute__noreturn__;
#define PERL_ARGS_ASSERT_RE_CROAK2 \
@@ -5593,7 +5596,7 @@ PERL_STATIC_INLINE void S_ssc_union(pTHX_ regnode_ssc *ssc, SV* const invlist, c
#define PERL_ARGS_ASSERT_SSC_UNION \
assert(ssc); assert(invlist)
#endif
-STATIC SSize_t S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, SSize_t *minlenp, SSize_t *deltap, regnode *last, struct scan_data_t *data, I32 stopparen, U32 recursed_depth, regnode_ssc *and_withp, U32 flags, U32 depth);
+STATIC SSize_t S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, SSize_t *minlenp, SSize_t *deltap, regnode *last, struct scan_data_t *data, I32 stopparen, U32 recursed_depth, regnode_ssc *and_withp, U32 flags, U32 depth, bool was_mutate_ok);
#define PERL_ARGS_ASSERT_STUDY_CHUNK \
assert(pRExC_state); assert(scanp); assert(minlenp); assert(deltap); assert(last)
#endif
diff --git a/regcomp.c b/regcomp.c
index e1da15a77c..e66032a16a 100644
--- a/regcomp.c
+++ b/regcomp.c
@@ -110,6 +110,7 @@ typedef struct scan_frame {
regnode *next_regnode; /* next node to process when last is reached */
U32 prev_recursed_depth;
I32 stopparen; /* what stopparen do we use */
+ bool in_gosub; /* this or an outer frame is for GOSUB */
struct scan_frame *this_prev_frame; /* this previous frame */
struct scan_frame *prev_frame; /* previous frame */
@@ -4178,6 +4179,44 @@ S_unwind_scan_frames(pTHX_ const void *p)
} while (f);
}
+/* Follow the next-chain of the current node and optimize away
+ all the NOTHINGs from it.
+ */
+STATIC void
+S_rck_elide_nothing(pTHX_ regnode *node)
+{
+ dVAR;
+
+ PERL_ARGS_ASSERT_RCK_ELIDE_NOTHING;
+
+ if (OP(node) != CURLYX) {
+ const int max = (reg_off_by_arg[OP(node)]
+ ? I32_MAX
+ /* I32 may be smaller than U16 on CRAYs! */
+ : (I32_MAX < U16_MAX ? I32_MAX : U16_MAX));
+ int off = (reg_off_by_arg[OP(node)] ? ARG(node) : NEXT_OFF(node));
+ int noff;
+ regnode *n = node;
+
+ /* Skip NOTHING and LONGJMP. */
+ while (
+ (n = regnext(n))
+ && (
+ (PL_regkind[OP(n)] == NOTHING && (noff = NEXT_OFF(n)))
+ || ((OP(n) == LONGJMP) && (noff = ARG(n)))
+ )
+ && off + noff < max
+ ) {
+ off += noff;
+ }
+ if (reg_off_by_arg[OP(node)])
+ ARG(node) = off;
+ else
+ NEXT_OFF(node) = off;
+ }
+ return;
+}
+
/* the return from this sub is the minimum length that could possibly match */
STATIC SSize_t
S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
@@ -4187,7 +4226,7 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
I32 stopparen,
U32 recursed_depth,
regnode_ssc *and_withp,
- U32 flags, U32 depth)
+ U32 flags, U32 depth, bool was_mutate_ok)
/* scanp: Start here (read-write). */
/* deltap: Write maxlen-minlen here. */
/* last: Stop before this one. */
@@ -4265,6 +4304,10 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
node length to get a real minimum (because
the folded version may be shorter) */
bool unfolded_multi_char = FALSE;
+ /* avoid mutating ops if we are anywhere within the recursed or
+ * enframed handling for a GOSUB: the outermost level will handle it.
+ */
+ bool mutate_ok = was_mutate_ok && !(frame && frame->in_gosub);
/* Peephole optimizer: */
DEBUG_STUDYDATA("Peep", data, depth, is_inf);
DEBUG_PEEP("Peep", scan, depth, flags);
@@ -4275,30 +4318,13 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
* parsing code, as each (?:..) is handled by a different invocation of
* reg() -- Yves
*/
- JOIN_EXACT(scan,&min_subtract, &unfolded_multi_char, 0);
-
- /* Follow the next-chain of the current node and optimize
- away all the NOTHINGs from it. */
- if (OP(scan) != CURLYX) {
- const int max = (reg_off_by_arg[OP(scan)]
- ? I32_MAX
- /* I32 may be smaller than U16 on CRAYs! */
- : (I32_MAX < U16_MAX ? I32_MAX : U16_MAX));
- int off = (reg_off_by_arg[OP(scan)] ? ARG(scan) : NEXT_OFF(scan));
- int noff;
- regnode *n = scan;
-
- /* Skip NOTHING and LONGJMP. */
- while ((n = regnext(n))
- && ((PL_regkind[OP(n)] == NOTHING && (noff = NEXT_OFF(n)))
- || ((OP(n) == LONGJMP) && (noff = ARG(n))))
- && off + noff < max)
- off += noff;
- if (reg_off_by_arg[OP(scan)])
- ARG(scan) = off;
- else
- NEXT_OFF(scan) = off;
- }
+ if (mutate_ok)
+ JOIN_EXACT(scan,&min_subtract, &unfolded_multi_char, 0);
+
+ /* Follow the next-chain of the current node and optimize
+ away all the NOTHINGs from it.
+ */
+ rck_elide_nothing(scan);
/* The principal pseudo-switch. Cannot be a switch, since we
look into several different things. */
@@ -4325,7 +4351,7 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
/* DEFINEP study_chunk() recursion */
(void)study_chunk(pRExC_state, &scan, &minlen,
&deltanext, next, &data_fake, stopparen,
- recursed_depth, NULL, f, depth+1);
+ recursed_depth, NULL, f, depth+1, mutate_ok);
scan = next;
} else
@@ -4393,7 +4419,8 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
/* recurse study_chunk() for each BRANCH in an alternation */
minnext = study_chunk(pRExC_state, &scan, minlenp,
&deltanext, next, &data_fake, stopparen,
- recursed_depth, NULL, f,depth+1);
+ recursed_depth, NULL, f, depth+1,
+ mutate_ok);
if (min1 > minnext)
min1 = minnext;
@@ -4460,9 +4487,10 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
}
}
- if (PERL_ENABLE_TRIE_OPTIMISATION &&
- OP( startbranch ) == BRANCH )
- {
+ if (PERL_ENABLE_TRIE_OPTIMISATION
+ && OP(startbranch) == BRANCH
+ && mutate_ok
+ ) {
/* demq.
Assuming this was/is a branch we are dealing with: 'scan'
@@ -4913,6 +4941,9 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
newframe->stopparen = stopparen;
newframe->prev_recursed_depth = recursed_depth;
newframe->this_prev_frame= frame;
+ newframe->in_gosub = (
+ (frame && frame->in_gosub) || OP(scan) == GOSUB
+ );
DEBUG_STUDYDATA("frame-new", data, depth, is_inf);
DEBUG_PEEP("fnew", scan, depth, flags);
@@ -5133,7 +5164,7 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
(mincount == 0
? (f & ~SCF_DO_SUBSTR)
: f)
- ,depth+1);
+ , depth+1, mutate_ok);
if (flags & SCF_DO_STCLASS)
data->start_class = oclass;
@@ -5181,6 +5212,12 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
(void)ReREFCNT_inc(RExC_rx_sv);
}
+ if ( ( minnext > 0 && mincount >= SSize_t_MAX / minnext )
+ || min >= SSize_t_MAX - minnext * mincount )
+ {
+ FAIL("Regexp out of space");
+ }
+
min += minnext * mincount;
is_inf_internal |= deltanext == SSize_t_MAX
|| (maxcount == REG_INFTY && minnext + deltanext > 0);
@@ -5195,7 +5232,9 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
if ( OP(oscan) == CURLYX && data
&& data->flags & SF_IN_PAR
&& !(data->flags & SF_HAS_EVAL)
- && !deltanext && minnext == 1 ) {
+ && !deltanext && minnext == 1
+ && mutate_ok
+ ) {
/* Try to optimize to CURLYN. */
regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS;
regnode * const nxt1 = nxt;
@@ -5241,10 +5280,10 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
&& !(data->flags & SF_HAS_EVAL)
&& !deltanext /* atom is fixed width */
&& minnext != 0 /* CURLYM can't handle zero width */
-
/* Nor characters whose fold at run-time may be
* multi-character */
&& ! (RExC_seen & REG_UNFOLDED_MULTI_SEEN)
+ && mutate_ok
) {
/* XXXX How to optimize if data == 0? */
/* Optimize to a simpler form. */
@@ -5292,7 +5331,8 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
/* Optimize again: */
/* recurse study_chunk() on optimised CURLYX => CURLYM */
study_chunk(pRExC_state, &nxt1, minlenp, &deltanext, nxt,
- NULL, stopparen, recursed_depth, NULL, 0,depth+1);
+ NULL, stopparen, recursed_depth, NULL, 0,
+ depth+1, mutate_ok);
}
else
oscan->flags = 0;
@@ -5419,11 +5459,7 @@ Perl_re_printf( aTHX_ "LHS=%" UVuf " RHS=%" UVuf "\n",
if (data && (fl & SF_HAS_EVAL))
data->flags |= SF_HAS_EVAL;
optimize_curly_tail:
- if (OP(oscan) != CURLYX) {
- while (PL_regkind[OP(next = regnext(oscan))] == NOTHING
- && NEXT_OFF(next))
- NEXT_OFF(oscan) += NEXT_OFF(next);
- }
+ rck_elide_nothing(oscan);
continue;
default:
@@ -5713,7 +5749,8 @@ Perl_re_printf( aTHX_ "LHS=%" UVuf " RHS=%" UVuf "\n",
/* recurse study_chunk() for lookahead body */
minnext = study_chunk(pRExC_state, &nscan, minlenp, &deltanext,
last, &data_fake, stopparen,
- recursed_depth, NULL, f, depth+1);
+ recursed_depth, NULL, f, depth+1,
+ mutate_ok);
if (scan->flags) {
if (deltanext) {
FAIL("Variable length lookbehind not implemented");
@@ -5805,7 +5842,7 @@ Perl_re_printf( aTHX_ "LHS=%" UVuf " RHS=%" UVuf "\n",
*minnextp = study_chunk(pRExC_state, &nscan, minnextp,
&deltanext, last, &data_fake,
stopparen, recursed_depth, NULL,
- f,depth+1);
+ f, depth+1, mutate_ok);
if (scan->flags) {
if (deltanext) {
FAIL("Variable length lookbehind not implemented");
@@ -5966,7 +6003,8 @@ Perl_re_printf( aTHX_ "LHS=%" UVuf " RHS=%" UVuf "\n",
/* optimise study_chunk() for TRIE */
minnext = study_chunk(pRExC_state, &scan, minlenp,
&deltanext, (regnode *)nextbranch, &data_fake,
- stopparen, recursed_depth, NULL, f,depth+1);
+ stopparen, recursed_depth, NULL, f, depth+1,
+ mutate_ok);
}
if (nextbranch && PL_regkind[OP(nextbranch)]==BRANCH)
nextbranch= regnext((regnode*)nextbranch);
@@ -7651,7 +7689,7 @@ Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count,
&data, -1, 0, NULL,
SCF_DO_SUBSTR | SCF_WHILEM_VISITED_POS | stclass_flag
| (restudied ? SCF_TRIE_DOING_RESTUDY : 0),
- 0);
+ 0, TRUE);
CHECK_RESTUDY_GOTO_butfirst(LEAVE_with_name("study_chunk"));
@@ -7780,7 +7818,7 @@ Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count,
SCF_DO_STCLASS_AND|SCF_WHILEM_VISITED_POS|(restudied
? SCF_TRIE_DOING_RESTUDY
: 0),
- 0);
+ 0, TRUE);
CHECK_RESTUDY_GOTO_butfirst(NOOP);
diff --git a/t/re/pat.t b/t/re/pat.t
index 1d98fe77d7..1488259b02 100644
--- a/t/re/pat.t
+++ b/t/re/pat.t
@@ -23,7 +23,7 @@ BEGIN {
skip_all('no re module') unless defined &DynaLoader::boot_DynaLoader;
skip_all_without_unicode_tables();
-plan tests => 848; # Update this when adding/deleting tests.
+plan tests => 852; # Update this when adding/deleting tests.
run_tests() unless caller;
@@ -1948,6 +1948,30 @@ EOP
fresh_perl_is('m m0*0+\Rm', "",{},"Undefined behavior in address sanitizer");
}
+ # gh16947: test regexp corruption (GOSUB)
+ {
+ fresh_perl_is(q{
+ 'xy' =~ /x(?0)|x(?|y|y)/ && print 'ok'
+ }, 'ok', {}, 'gh16947: test regexp corruption (GOSUB)');
+ }
+ # gh16947: test fix doesn't break SUSPEND
+ {
+ fresh_perl_is(q{ 'sx' =~ m{ss++}i; print 'ok' },
+ 'ok', {}, "gh16947: test fix doesn't break SUSPEND");
+ }
+
+ # gh17743: more regexp corruption via GOSUB
+ {
+ fresh_perl_is(q{
+ "0" =~ /((0(?0)|000(?|0000|0000)(?0))|)/; print "ok"
+ }, 'ok', {}, 'gh17743: test regexp corruption (1)');
+
+ fresh_perl_is(q{
+ "000000000000" =~ /(0(())(0((?0)())|000(?|\x{ef}\x{bf}\x{bd}|\x{ef}\x{bf}\x{bd}))|)/;
+ print "ok"
+ }, 'ok', {}, 'gh17743: test regexp corruption (2)');
+ }
+
} # End of sub run_tests
1;
Reply to: