summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Mitchell <davem@fdisolutions.com>2004-07-23 11:06:02 +0000
committerDave Mitchell <davem@fdisolutions.com>2004-07-23 11:06:02 +0000
commit2c8ddff3c182e26372c9343750c9b3c45e438ca2 (patch)
tree963b08715beee22e79b1a96ecd3b2f5720e1dc0a
parent7be51a492103f5312d8e2c90a7d13d18dab93c61 (diff)
downloadperl-2c8ddff3c182e26372c9343750c9b3c45e438ca2.tar.gz
[perl #30733] memory leak in array delete
av_delete() wasn't mortalizing the returned value p4raw-id: //depot/perl@23158
-rw-r--r--av.c2
-rwxr-xr-xt/op/delete.t15
2 files changed, 16 insertions, 1 deletions
diff --git a/av.c b/av.c
index 3eaeea8ecd..bedd04b41e 100644
--- a/av.c
+++ b/av.c
@@ -864,6 +864,8 @@ Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags)
SvREFCNT_dec(sv);
sv = Nullsv;
}
+ else
+ sv = sv_2mortal(sv);
return sv;
}
diff --git a/t/op/delete.t b/t/op/delete.t
index 53212a1140..ac4405c419 100755
--- a/t/op/delete.t
+++ b/t/op/delete.t
@@ -1,6 +1,6 @@
#!./perl
-print "1..37\n";
+print "1..38\n";
# delete() on hash elements
@@ -129,3 +129,16 @@ print @{$refary[0]} == 1 ? "ok 35\n" : "not ok 35 @list\n";
print "not " if defined $y;
print "ok 37\n";
}
+
+{
+ # [perl #30733] array delete didn't free returned element
+ my $x = 0;
+ sub X::DESTROY { $x++ }
+ {
+ my @a;
+ $a[0] = bless [], 'X';
+ my $y = delete $a[0];
+ }
+ print "not " unless $x == 1;
+ print "ok 38\n";
+}