This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add some defensive coding to av_store()
authorKarl Williamson <khw@cpan.org>
Sat, 1 Jun 2019 20:39:55 +0000 (14:39 -0600)
committerKarl Williamson <khw@cpan.org>
Thu, 27 Jun 2019 15:36:35 +0000 (09:36 -0600)
Don't decrement the reference count of the element about to be stored
into.

Likely, this is an error in the caller, but doing this action blindly is
like shooting yourself in the foot.  The branch prediction also added
ensures this shouldn't slow things down.

See http://nntp.perl.org/group/perl.perl5.porters/254974

av.c

diff --git a/av.c b/av.c
index 918844c..f10f124 100644 (file)
--- a/av.c
+++ b/av.c
@@ -356,8 +356,8 @@ Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val)
        }
        AvFILLp(av) = key;
     }
-    else if (AvREAL(av))
-       SvREFCNT_dec(ary[key]);
+    else if (AvREAL(av) && LIKELY(ary[key] != val))
+        SvREFCNT_dec(ary[key]);
     ary[key] = val;
     if (SvSMAGICAL(av)) {
        const MAGIC *mg = SvMAGIC(av);