PATCH: [perl #133121] Fix crash in gv_fetchmeth_sv
authorSergey Aleynikov <sergey.aleynikov@gmail.com>
Thu, 19 Apr 2018 00:44:46 +0000 (03:44 +0300)
committerKarl Williamson <khw@cpan.org>
Thu, 19 Apr 2018 17:30:43 +0000 (11:30 -0600)
S_gv_fetchmeth_internal supports its arguments being either an SV or
a (name, len) pair. But when performing an ISA traversal to get method from
a parent class, it accounted only for the latter.

ext/XS-APItest/t/gv_fetchmeth.t
gv.c

index 22e8b14..9ba1650 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 43;
+use Test::More tests => 44;
 
 use_ok('XS::APItest');
 
@@ -70,3 +70,10 @@ ok !XS::APItest::gv_fetchmeth_type(\%::, "method\0not quite!", 3, $level, 0), "g
         }
     }
 }
+
+{
+    @Foo::ISA = qw/Bar/;
+    @Bar::ISA = qw//;
+
+    is(XS::APItest::gv_fetchmeth_type(\%Foo::, "nomethod", 1, -1, 0), undef, 'gv_fetchmeth_sv survives @ISA traversal');
+}
diff --git a/gv.c b/gv.c
index 0dcbabc..085bf74 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -804,7 +804,9 @@ S_gv_fetchmeth_internal(pTHX_ HV* stash, SV* meth, const char* name, STRLEN len,
 
         assert(cstash);
 
-        gvp = (GV**)hv_fetch(cstash, name, is_utf8 ? -(I32)len : (I32)len, 0);
+        gvp = (GV**)hv_common(
+            cstash, meth, name, len, is_utf8 ? HVhek_UTF8 : 0, HV_FETCH_JUST_SV, NULL, 0
+        );
         if (!gvp) {
             if (len > 1 && HvNAMELEN_get(cstash) == 4) {
                 const char *hvname = HvNAME(cstash); assert(hvname);