diff options
author | Dave Mitchell <davem@fdisolutions.com> | 2004-07-23 11:06:02 +0000 |
---|---|---|
committer | Dave Mitchell <davem@fdisolutions.com> | 2004-07-23 11:06:02 +0000 |
commit | 2c8ddff3c182e26372c9343750c9b3c45e438ca2 (patch) | |
tree | 963b08715beee22e79b1a96ecd3b2f5720e1dc0a | |
parent | 7be51a492103f5312d8e2c90a7d13d18dab93c61 (diff) | |
download | perl-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.c | 2 | ||||
-rwxr-xr-x | t/op/delete.t | 15 |
2 files changed, 16 insertions, 1 deletions
@@ -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"; +} |