diff options
author | Tony Cook <tony@develop-help.com> | 2023-02-01 14:50:22 +1100 |
---|---|---|
committer | Tony Cook <tony@develop-help.com> | 2023-02-08 14:33:26 +1100 |
commit | dd3d299fefbbff9efe55eb16af5bb9aa0410d606 (patch) | |
tree | ac88916374f4d66e6dd5b95d19d093bc51785a80 /op.c | |
parent | b1414dcb98d72036e17cb9d4c8aae9d7ad65113e (diff) | |
download | perl-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.c | 4 |
1 files changed, 3 insertions, 1 deletions
@@ -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", |