dcb3b7
From 3c38abae50c05c6f3c9f7eca561ec08c62fba1ba Mon Sep 17 00:00:00 2001
dcb3b7
From: Sergey Aleynikov <sergey.aleynikov@gmail.com>
dcb3b7
Date: Thu, 5 Jan 2017 01:33:32 +0300
dcb3b7
Subject: [PATCH] Fix memory leak in B::RHE->HASH method.
dcb3b7
MIME-Version: 1.0
dcb3b7
Content-Type: text/plain; charset=UTF-8
dcb3b7
Content-Transfer-Encoding: 8bit
dcb3b7
dcb3b7
Petr Písař: Ported to 5.24.1:
dcb3b7
dcb3b7
commit 4b6e9aa6aa2256da1ec7ed08f819cbf5d1463741
dcb3b7
Author: Sergey Aleynikov <sergey.aleynikov@gmail.com>
dcb3b7
Date:   Thu Jan 5 01:33:32 2017 +0300
dcb3b7
dcb3b7
    Fix memory leak in B::RHE->HASH method.
dcb3b7
dcb3b7
Signed-off-by: Petr Písař <ppisar@redhat.com>
dcb3b7
---
dcb3b7
 ext/B/B.xs    |  2 +-
dcb3b7
 t/op/svleak.t | 12 +++++++++++-
dcb3b7
 2 files changed, 12 insertions(+), 2 deletions(-)
dcb3b7
dcb3b7
diff --git a/ext/B/B.xs b/ext/B/B.xs
dcb3b7
index b4b6a40..e859d7d 100644
dcb3b7
--- a/ext/B/B.xs
dcb3b7
+++ b/ext/B/B.xs
dcb3b7
@@ -2179,7 +2179,7 @@ SV*
dcb3b7
 HASH(h)
dcb3b7
 	B::RHE h
dcb3b7
     CODE:
dcb3b7
-	RETVAL = newRV( (SV*)cophh_2hv(h, 0) );
dcb3b7
+	RETVAL = newRV_noinc( (SV*)cophh_2hv(h, 0) );
dcb3b7
     OUTPUT:
dcb3b7
 	RETVAL
dcb3b7
 
dcb3b7
diff --git a/t/op/svleak.t b/t/op/svleak.t
dcb3b7
index c18f498..b0692ff 100644
dcb3b7
--- a/t/op/svleak.t
dcb3b7
+++ b/t/op/svleak.t
dcb3b7
@@ -15,7 +15,7 @@ BEGIN {
dcb3b7
 
dcb3b7
 use Config;
dcb3b7
 
dcb3b7
-plan tests => 132;
dcb3b7
+plan tests => 133;
dcb3b7
 
dcb3b7
 # run some code N times. If the number of SVs at the end of loop N is
dcb3b7
 # greater than (N-1)*delta at the end of loop 1, we've got a leak
dcb3b7
@@ -547,3 +547,13 @@ EOF
dcb3b7
     sub f { $a =~ /[^.]+$b/; }
dcb3b7
     ::leak(2, 0, \&f, q{use re 'strict' shouldn't leak warning strings});
dcb3b7
 }
dcb3b7
+
dcb3b7
+# check that B::RHE->HASH does not leak
dcb3b7
+{
dcb3b7
+    package BHINT;
dcb3b7
+    sub foo {}
dcb3b7
+    require B;
dcb3b7
+    my $op = B::svref_2object(\&foo)->ROOT->first;
dcb3b7
+    sub lk { { my $d = $op->hints_hash->HASH } }
dcb3b7
+    ::leak(3, 0, \&lk, q!B::RHE->HASH shoudln't leak!);
dcb3b7
+}
dcb3b7
-- 
dcb3b7
2.7.4
dcb3b7