Fix a memory leak in IO::Poll
This commit is contained in:
parent
4599430ffb
commit
0b127f245a
134
perl-5.24.0-perl-129788-IO-Poll-fix-memory-leak.patch
Normal file
134
perl-5.24.0-perl-129788-IO-Poll-fix-memory-leak.patch
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
From 478d23ef9e7700e20a75907648dd4c53b1b4f544 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Tony Cook <tony@develop-help.com>
|
||||||
|
Date: Tue, 25 Oct 2016 16:17:18 +1100
|
||||||
|
Subject: [PATCH] (perl #129788) IO::Poll: fix memory leak
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Petr Pisar: Ported to 5.24.0:
|
||||||
|
|
||||||
|
commit 6de2dd46140d0d3ab6813e26940d7b74418b0260
|
||||||
|
Author: Tony Cook <tony@develop-help.com>
|
||||||
|
Date: Tue Oct 25 16:17:18 2016 +1100
|
||||||
|
|
||||||
|
(perl #129788) IO::Poll: fix memory leak
|
||||||
|
|
||||||
|
Whenever a magical/tied scalar which dies upon read was passed to _poll()
|
||||||
|
temporary buffer for events was not freed.
|
||||||
|
|
||||||
|
Adapted from a patch by Sergey Aleynikov <sergey.aleynikov@gmail.com>
|
||||||
|
|
||||||
|
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
||||||
|
---
|
||||||
|
MANIFEST | 1 +
|
||||||
|
META.json | 1 +
|
||||||
|
META.yml | 1 +
|
||||||
|
dist/IO/IO.xs | 3 +--
|
||||||
|
dist/IO/t/io_leak.t | 37 +++++++++++++++++++++++++++++++++++++
|
||||||
|
5 files changed, 41 insertions(+), 2 deletions(-)
|
||||||
|
create mode 100644 dist/IO/t/io_leak.t
|
||||||
|
|
||||||
|
diff --git a/MANIFEST b/MANIFEST
|
||||||
|
index 2cdf616..3b5f8fb 100644
|
||||||
|
--- a/MANIFEST
|
||||||
|
+++ b/MANIFEST
|
||||||
|
@@ -3228,6 +3228,7 @@ dist/IO/t/io_dir.t See if directory-related methods from IO work
|
||||||
|
dist/IO/t/io_dup.t See if dup()-related methods from IO work
|
||||||
|
dist/IO/t/io_file_export.t Test IO::File exports
|
||||||
|
dist/IO/t/io_file.t See if binmode()-related methods on IO::File work
|
||||||
|
+dist/IO/t/io_leak.t See if IO leaks SVs (only run in core)
|
||||||
|
dist/IO/t/io_linenum.t See if I/O line numbers are tracked correctly
|
||||||
|
dist/IO/t/io_multihomed.t See if INET sockets work with multi-homed hosts
|
||||||
|
dist/IO/t/io_pipe.t See if pipe()-related methods from IO work
|
||||||
|
diff --git a/META.json b/META.json
|
||||||
|
index 4cb21a9..2809b58 100644
|
||||||
|
--- a/META.json
|
||||||
|
+++ b/META.json
|
||||||
|
@@ -84,6 +84,7 @@
|
||||||
|
"dist/IO/t/io_dup.t",
|
||||||
|
"dist/IO/t/io_file.t",
|
||||||
|
"dist/IO/t/io_file_export.t",
|
||||||
|
+ "dist/IO/t/io_leak.t",
|
||||||
|
"dist/IO/t/io_linenum.t",
|
||||||
|
"dist/IO/t/io_multihomed.t",
|
||||||
|
"dist/IO/t/io_pipe.t",
|
||||||
|
diff --git a/META.yml b/META.yml
|
||||||
|
index 13a2bb3..7494d2a 100644
|
||||||
|
--- a/META.yml
|
||||||
|
+++ b/META.yml
|
||||||
|
@@ -81,6 +81,7 @@ no_index:
|
||||||
|
- dist/IO/t/io_dup.t
|
||||||
|
- dist/IO/t/io_file.t
|
||||||
|
- dist/IO/t/io_file_export.t
|
||||||
|
+ - dist/IO/t/io_leak.t
|
||||||
|
- dist/IO/t/io_linenum.t
|
||||||
|
- dist/IO/t/io_multihomed.t
|
||||||
|
- dist/IO/t/io_pipe.t
|
||||||
|
diff --git a/dist/IO/IO.xs b/dist/IO/IO.xs
|
||||||
|
index fe749a6..15ef9b2 100644
|
||||||
|
--- a/dist/IO/IO.xs
|
||||||
|
+++ b/dist/IO/IO.xs
|
||||||
|
@@ -318,7 +318,7 @@ PPCODE:
|
||||||
|
{
|
||||||
|
#ifdef HAS_POLL
|
||||||
|
const int nfd = (items - 1) / 2;
|
||||||
|
- SV *tmpsv = NEWSV(999,nfd * sizeof(struct pollfd));
|
||||||
|
+ SV *tmpsv = sv_2mortal(NEWSV(999,nfd * sizeof(struct pollfd)));
|
||||||
|
/* We should pass _some_ valid pointer even if nfd is zero, but it
|
||||||
|
* doesn't matter what it is, since we're telling it to not check any fds.
|
||||||
|
*/
|
||||||
|
@@ -337,7 +337,6 @@ PPCODE:
|
||||||
|
sv_setiv(ST(i), fds[j].revents); i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- SvREFCNT_dec(tmpsv);
|
||||||
|
XSRETURN_IV(ret);
|
||||||
|
#else
|
||||||
|
not_here("IO::Poll::poll");
|
||||||
|
diff --git a/dist/IO/t/io_leak.t b/dist/IO/t/io_leak.t
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..08cbe2b
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/dist/IO/t/io_leak.t
|
||||||
|
@@ -0,0 +1,37 @@
|
||||||
|
+#!/usr/bin/perl
|
||||||
|
+
|
||||||
|
+use warnings;
|
||||||
|
+use strict;
|
||||||
|
+
|
||||||
|
+use Test::More;
|
||||||
|
+
|
||||||
|
+eval { require XS::APItest; XS::APItest->import('sv_count'); 1 }
|
||||||
|
+ or plan skip_all => "No XS::APItest::sv_count() available";
|
||||||
|
+
|
||||||
|
+plan tests => 1;
|
||||||
|
+
|
||||||
|
+sub leak {
|
||||||
|
+ my ($n, $delta, $code, $name) = @_;
|
||||||
|
+ my $sv0 = 0;
|
||||||
|
+ my $sv1 = 0;
|
||||||
|
+ for my $i (1..$n) {
|
||||||
|
+ &$code();
|
||||||
|
+ $sv1 = sv_count();
|
||||||
|
+ $sv0 = $sv1 if $i == 1;
|
||||||
|
+ }
|
||||||
|
+ cmp_ok($sv1-$sv0, '<=', ($n-1)*$delta, $name);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+# [perl #129788] IO::Poll shouldn't leak on errors
|
||||||
|
+{
|
||||||
|
+ package io_poll_leak;
|
||||||
|
+ use IO::Poll;
|
||||||
|
+
|
||||||
|
+ sub TIESCALAR { bless {} }
|
||||||
|
+ sub FETCH { die }
|
||||||
|
+
|
||||||
|
+ tie(my $a, __PACKAGE__);
|
||||||
|
+ sub f {eval { IO::Poll::_poll(0, $a, 1) }}
|
||||||
|
+
|
||||||
|
+ ::leak(5, 0, \&f, q{IO::Poll::_poll shouldn't leak});
|
||||||
|
+}
|
||||||
|
--
|
||||||
|
2.7.4
|
||||||
|
|
@ -238,6 +238,9 @@ Patch62: perl-5.25.7-Fix-const-correctness-in-hv_func.h.patch
|
|||||||
# in upsream after 5.25.7
|
# in upsream after 5.25.7
|
||||||
Patch63: perl-5.24.0-assertion-failure-in-.-or-0-x-0.patch
|
Patch63: perl-5.24.0-assertion-failure-in-.-or-0-x-0.patch
|
||||||
|
|
||||||
|
# Fix a memory leak in IO::Poll, RT#129788, in upstream after 5.25.7
|
||||||
|
Patch64: perl-5.24.0-perl-129788-IO-Poll-fix-memory-leak.patch
|
||||||
|
|
||||||
# Link XS modules to libperl.so with EU::CBuilder on Linux, bug #960048
|
# Link XS modules to libperl.so with EU::CBuilder on Linux, bug #960048
|
||||||
Patch200: perl-5.16.3-Link-XS-modules-to-libperl.so-with-EU-CBuilder-on-Li.patch
|
Patch200: perl-5.16.3-Link-XS-modules-to-libperl.so-with-EU-CBuilder-on-Li.patch
|
||||||
|
|
||||||
@ -2927,6 +2930,7 @@ Perl extension for Version Objects
|
|||||||
%patch61 -p1
|
%patch61 -p1
|
||||||
%patch62 -p1
|
%patch62 -p1
|
||||||
%patch63 -p1
|
%patch63 -p1
|
||||||
|
%patch64 -p1
|
||||||
%patch200 -p1
|
%patch200 -p1
|
||||||
%patch201 -p1
|
%patch201 -p1
|
||||||
|
|
||||||
@ -2981,6 +2985,7 @@ perl -x patchlevel.h \
|
|||||||
'Fedora Patch61: Fix assigning split() return values to an array' \
|
'Fedora Patch61: Fix assigning split() return values to an array' \
|
||||||
'Fedora Patch62: Fix const correctness in hv_func.h (RT#130169)' \
|
'Fedora Patch62: Fix const correctness in hv_func.h (RT#130169)' \
|
||||||
'Fedora Patch63: Fix a crash in optimized evaluation of "or ((0) x 0))" (RT#130247)' \
|
'Fedora Patch63: Fix a crash in optimized evaluation of "or ((0) x 0))" (RT#130247)' \
|
||||||
|
'Fedora Patch64: Fix a memory leak in IO::Poll (RT#129788)' \
|
||||||
'Fedora Patch200: Link XS modules to libperl.so with EU::CBuilder on Linux' \
|
'Fedora Patch200: Link XS modules to libperl.so with EU::CBuilder on Linux' \
|
||||||
'Fedora Patch201: Link XS modules to libperl.so with EU::MM on Linux' \
|
'Fedora Patch201: Link XS modules to libperl.so with EU::MM on Linux' \
|
||||||
%{nil}
|
%{nil}
|
||||||
@ -5261,6 +5266,7 @@ popd
|
|||||||
%changelog
|
%changelog
|
||||||
* Mon Dec 19 2016 Petr Pisar <ppisar@redhat.com> - 4:5.24.0-382
|
* Mon Dec 19 2016 Petr Pisar <ppisar@redhat.com> - 4:5.24.0-382
|
||||||
- Fix a crash in optimized evaluation of "or ((0) x 0))" (RT#130247)
|
- Fix a crash in optimized evaluation of "or ((0) x 0))" (RT#130247)
|
||||||
|
- Fix a memory leak in IO::Poll (RT#129788)
|
||||||
|
|
||||||
* Thu Dec 01 2016 Petr Pisar <ppisar@redhat.com> - 4:5.24.0-381
|
* Thu Dec 01 2016 Petr Pisar <ppisar@redhat.com> - 4:5.24.0-381
|
||||||
- Fix crash in Storable when deserializing malformed code reference
|
- Fix crash in Storable when deserializing malformed code reference
|
||||||
|
Loading…
Reference in New Issue
Block a user