summaryrefslogtreecommitdiff
path: root/sv.c
diff options
context:
space:
mode:
authorPaul "LeoNerd" Evans <leonerd@leonerd.org.uk>2023-02-09 14:45:20 +0000
committerPaul "LeoNerd" Evans <leonerd@leonerd.org.uk>2023-02-10 12:07:02 +0000
commitca8d92cfddc9cc3d4904712f7e0dfc3b2598561d (patch)
tree7cd889ad35d1adc69805fd67c19d0c066af7f54d /sv.c
parent24c33697796a1556af3f58e15fc4fb6b0d1538dc (diff)
downloadperl-ca8d92cfddc9cc3d4904712f7e0dfc3b2598561d.tar.gz
Disallow bless hackery around classes and instances
Diffstat (limited to 'sv.c')
-rw-r--r--sv.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/sv.c b/sv.c
index 8f11e9778f..800377ba0e 100644
--- a/sv.c
+++ b/sv.c
@@ -10772,10 +10772,15 @@ Perl_sv_bless(pTHX_ SV *const sv, HV *const stash)
SvGETMAGIC(sv);
if (!SvROK(sv))
Perl_croak(aTHX_ "Can't bless non-reference value");
+ if (HvSTASH_IS_CLASS(stash))
+ Perl_croak(aTHX_ "Attempt to bless into a class");
+
tmpRef = SvRV(sv);
if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY|SVf_PROTECT)) {
if (SvREADONLY(tmpRef))
Perl_croak_no_modify();
+ if (SvTYPE(tmpRef) == SVt_PVOBJ)
+ Perl_croak(aTHX_ "Can't bless an object reference");
if (SvOBJECT(tmpRef)) {
oldstash = SvSTASH(tmpRef);
}