summaryrefslogtreecommitdiff
path: root/op.c
diff options
context:
space:
mode:
authorTony Cook <tony@develop-help.com>2023-02-01 14:50:22 +1100
committerTony Cook <tony@develop-help.com>2023-02-08 14:33:26 +1100
commitdd3d299fefbbff9efe55eb16af5bb9aa0410d606 (patch)
treeac88916374f4d66e6dd5b95d19d093bc51785a80 /op.c
parentb1414dcb98d72036e17cb9d4c8aae9d7ad65113e (diff)
downloadperl-dd3d299fefbbff9efe55eb16af5bb9aa0410d606.tar.gz
newATTRSUB_x: don't try to sv_cmp() an AV*
newATTRSUB_x() does it's own constant sub redefinition checks, but if you tried to redefine a constant.pm defined constant list sub with an old style constant sub C<< sub foo() { CONSTANT } >> it would cause an assertion failure trying to SvPV() an SV inside sv_cmp(): $ ~/perl/v5.36.0-dbg-san/bin/perl -Mconstant=x,1,2 -e 'sub x() { 1 }' perl: sv.c:2820: char *Perl_sv_2pv_flags(SV *const, STRLEN *const, const U32): Assertion `SvTYPE(sv) != SVt_PVAV && SvTYPE(sv) != SVt_PVHV && SvTYPE(sv) != SVt_PVFM' failed. Aborted
Diffstat (limited to 'op.c')
-rw-r--r--op.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/op.c b/op.c
index 2be77d063f..d807c6f8b2 100644
--- a/op.c
+++ b/op.c
@@ -10661,7 +10661,9 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
if (ckWARN(WARN_REDEFINE)
|| ( ckWARN_d(WARN_REDEFINE)
&& ( !const_sv || SvRV(gv) == const_sv
- || sv_cmp(SvRV(gv), const_sv) ))) {
+ || SvTYPE(const_sv) == SVt_PVAV
+ || SvTYPE(SvRV(gv)) == SVt_PVAV
+ || sv_cmp(SvRV(gv), const_sv) ))) {
assert(cSVOPo);
Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
"Constant subroutine %" SVf " redefined",