cvs commit: ponie/perl av.c gv.c hv.c sv.c sv.h
[email protected] (Nicholas Clark) 7 Apr 2004 13:52:00 -0000
| Newsgroups | perl.ponie.changes |
|---|---|
| Message-ID | <[email protected]> |
cvsuser 04/04/07 06:51:59
Modified: perl av.c gv.c hv.c sv.c sv.h
Log:
Invert the bits on any sv_any pointer used to point to a PMC.
Instant flaming SEGV death for any part of perl that assumes that it
points straight to a perl struct, and accidentally tries to access it.
Catches writes that would corrupt parrot's state before the corruption.
Revision Changes Path
1.5 +6 -6 ponie/perl/av.c
Index: av.c
===================================================================
RCS file: /cvs/public/ponie/perl/av.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -w -r1.4 -r1.5
--- av.c 2 Mar 2004 12:03:02 -0000 1.4
+++ av.c 7 Apr 2004 13:51:58 -0000 1.5
@@ -23,32 +23,32 @@
#include "parrot/extend.h"
SV*** Perl_macro_AvARRAY (pTHX_ AV *av) {
- XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(av));
+ XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
return (SV***)&(data->xav_array);
}
U8* Perl_macro_AvFLAGS (pTHX_ AV *av) {
- XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(av));
+ XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
return &(data->xav_flags);
}
SSize_t* Perl_macro_AvMAX (pTHX_ AV *av) {
- XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(av));
+ XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
return &(data->xav_max);
}
SV*** Perl_macro_AvALLOC (pTHX_ AV *av) {
- XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(av));
+ XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
return &(data->xav_alloc);
}
SV** Perl_macro_AvARYLEN (pTHX_ AV *av) {
- XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(av));
+ XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
return &(data->xav_arylen);
}
SSize_t* Perl_macro_AvFILLp (pTHX_ AV *av) {
- XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(av));
+ XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
return &(data->xav_fill);
}
1.5 +5 -5 ponie/perl/gv.c
Index: gv.c
===================================================================
RCS file: /cvs/public/ponie/perl/gv.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -w -r1.4 -r1.5
--- gv.c 7 Apr 2004 10:37:27 -0000 1.4
+++ gv.c 7 Apr 2004 13:51:58 -0000 1.5
@@ -28,7 +28,7 @@
GP** Perl_macro_GvGP (pTHX_ GV *sv) {
if(SvPMC(sv)) {
- XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xgv_gp);
}
return &((XPVGV*)SvANY(sv))->xgv_gp;
@@ -36,7 +36,7 @@
char** Perl_macro_GvNAME (pTHX_ GV *sv) {
if(SvPMC(sv)) {
- XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xgv_name);
}
return &((XPVGV*)SvANY(sv))->xgv_name;
@@ -44,7 +44,7 @@
STRLEN* Perl_macro_GvNAMELEN (pTHX_ GV *sv) {
if(SvPMC(sv)) {
- XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xgv_namelen);
}
return &((XPVGV*)SvANY(sv))->xgv_namelen;
@@ -52,7 +52,7 @@
HV** Perl_macro_GvSTASH (pTHX_ GV *sv) {
if(SvPMC(sv)) {
- XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xgv_stash);
}
return &((XPVGV*)SvANY(sv))->xgv_stash;
@@ -60,7 +60,7 @@
U8* Perl_macro_GvFLAGS (pTHX_ GV *sv) {
if(SvPMC(sv)) {
- XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xgv_flags);
}
return &((XPVGV*)SvANY(sv))->xgv_flags;
1.8 +10 -10 ponie/perl/hv.c
Index: hv.c
===================================================================
RCS file: /cvs/public/ponie/perl/hv.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -w -r1.7 -r1.8
--- hv.c 7 Apr 2004 10:37:27 -0000 1.7
+++ hv.c 7 Apr 2004 13:51:58 -0000 1.8
@@ -25,52 +25,52 @@
#define HV_MAX_LENGTH_BEFORE_SPLIT 14
HE*** Perl_macro_HvARRAY (pTHX_ HV *hv) {
- XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
+ XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
return (HE***)&data->xhv_array;
}
XPVHV* Perl_macro_HvDATA (pTHX_ HV *hv) {
- return (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
+ return (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
}
STRLEN* Perl_macro_HvFILL (pTHX_ HV *hv) {
- XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
+ XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
return &(data->xhv_fill);
}
STRLEN* Perl_macro_HvMAX (pTHX_ HV *hv) {
- XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
+ XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
return &(data->xhv_max);
}
I32* Perl_macro_HvRITER (pTHX_ HV *hv) {
- XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
+ XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
return &(data->xhv_riter);
}
HE** Perl_macro_HvEITER (pTHX_ HV *hv) {
- XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
+ XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
return &(data->xhv_eiter);
}
PMOP** Perl_macro_HvPMROOT (pTHX_ HV *hv) {
- XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
+ XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
return &(data->xhv_pmroot);
}
char** Perl_macro_HvNAME (pTHX_ HV *hv) {
- XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
+ XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
return &(data->xhv_name);
}
IV* Perl_macro_XHvTOTALKEYS (pTHX_ HV *hv) {
- XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
+ XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
return &(data->xhv_keys);
}
NV* Perl_macro_XHvPLACEHOLDERS (pTHX_ HV *hv) {
- XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
+ XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
return &(data->xhv_placeholders);
}
1.20 +37 -37 ponie/perl/sv.c
Index: sv.c
===================================================================
RCS file: /cvs/public/ponie/perl/sv.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -w -r1.19 -r1.20
--- sv.c 7 Apr 2004 10:37:28 -0000 1.19
+++ sv.c 7 Apr 2004 13:51:58 -0000 1.20
@@ -1004,7 +1004,7 @@
hv = Parrot_PMC_new(PL_Parrot, type);
Parrot_register_pmc(PL_Parrot, hv);
- return hv;
+ return MUMBLE(hv);
}
/* return a struct xpvhv to the free list */
@@ -1095,7 +1095,7 @@
av = Parrot_PMC_new(PL_Parrot, type);
Parrot_register_pmc(PL_Parrot, av);
- return av;
+ return MUMBLE(av);
}
@@ -1118,7 +1118,7 @@
*/
Parrot_register_pmc(PL_Parrot, lval);
- return lval;
+ return MUMBLE(lval);
}
/* return a struct xpvlv to the free list */
@@ -1287,7 +1287,7 @@
MAGIC** Perl_macro_SvMAGIC (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVMG* data = (XPVMG*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVMG* data = (XPVMG*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xmg_magic);
}
return &((XPVMG*)SvANY(sv))->xmg_magic;
@@ -1295,7 +1295,7 @@
HV** Perl_macro_SvSTASH (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVMG* data = (XPVMG*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVMG* data = (XPVMG*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xmg_stash);
}
return &((XPVMG*)SvANY(sv))->xmg_stash;
@@ -1304,7 +1304,7 @@
SV** Perl_macro_SvRV (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XRV* data = (XRV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XRV* data = (XRV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xrv_rv);
}
return &((XRV*)SvANY(sv))->xrv_rv;
@@ -1314,7 +1314,7 @@
UV* Perl_macro_SvUVX (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVUV* data = (XPVUV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVUV* data = (XPVUV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xuv_uv);
}
return &((XPVUV*)SvANY(sv))->xuv_uv;
@@ -1323,7 +1323,7 @@
NV* Perl_macro_SvNVX (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVNV* data = (XPVNV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVNV* data = (XPVNV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xnv_nv);
}
return &((XPVNV*)SvANY(sv))->xnv_nv;
@@ -1332,7 +1332,7 @@
IV* Perl_macro_SvIVX (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIV* data = (XPVIV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIV* data = (XPVIV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xiv_iv);
}
return &((XPVIV*)SvANY(sv))->xiv_iv;
@@ -1341,7 +1341,7 @@
char** Perl_macro_SvPVX (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPV* data = (XPV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPV* data = (XPV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xpv_pv);
}
return &((XPV*)SvANY(sv))->xpv_pv;
@@ -1350,7 +1350,7 @@
STRLEN* Perl_macro_SvLEN (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPV* data = (XPV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPV* data = (XPV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xpv_len);
}
return &((XPV*)SvANY(sv))->xpv_len;
@@ -1359,7 +1359,7 @@
STRLEN* Perl_macro_SvCUR (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPV* data = (XPV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPV* data = (XPV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xpv_cur);
}
return &((XPV*)SvANY(sv))->xpv_cur;
@@ -1368,7 +1368,7 @@
U8* Perl_macro_BmRARE (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVBM* data = (XPVBM*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVBM* data = (XPVBM*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xbm_rare);
}
return &((XPVBM*)SvANY(sv))->xbm_rare;
@@ -1376,7 +1376,7 @@
I32* Perl_macro_BmUSEFUL (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVBM* data = (XPVBM*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVBM* data = (XPVBM*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xbm_useful);
}
return &((XPVBM*)SvANY(sv))->xbm_useful;
@@ -1384,7 +1384,7 @@
U16* Perl_macro_BmPREVIOUS (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVBM* data = (XPVBM*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVBM* data = (XPVBM*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xbm_previous);
}
return &((XPVBM*)SvANY(sv))->xbm_previous;
@@ -1392,7 +1392,7 @@
IV* Perl_macro_FmLINES (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVFM* data = (XPVFM*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVFM* data = (XPVFM*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xfm_lines);
}
return &((XPVFM*)SvANY(sv))->xfm_lines;
@@ -1402,7 +1402,7 @@
XPVLV* data;
if(!SvPMC(sv))
abort();
- data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xlv_type);
}
@@ -1410,7 +1410,7 @@
XPVLV* data;
if(!SvPMC(sv))
abort();
- data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xlv_targ);
}
@@ -1418,7 +1418,7 @@
XPVLV* data;
if(!SvPMC(sv))
abort();
- data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xlv_targoff);
}
@@ -1426,13 +1426,13 @@
XPVLV* data;
if(!SvPMC(sv))
abort();
- data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xlv_targlen);
}
PerlIO** Perl_macro_IoIFP (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_ifp);
}
return &((XPVIO*)SvANY(sv))->xio_ifp;
@@ -1440,7 +1440,7 @@
PerlIO** Perl_macro_IoOFP (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_ofp);
}
return &((XPVIO*)SvANY(sv))->xio_ofp;
@@ -1448,7 +1448,7 @@
DIR** Perl_macro_IoDIRP (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_dirp);
}
return &((XPVIO*)SvANY(sv))->xio_dirp;
@@ -1456,7 +1456,7 @@
void** Perl_macro_IoANY (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_any);
}
return &((XPVIO*)SvANY(sv))->xio_any;
@@ -1464,7 +1464,7 @@
IV* Perl_macro_IoLINES (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_lines);
}
return &((XPVIO*)SvANY(sv))->xio_lines;
@@ -1472,7 +1472,7 @@
IV* Perl_macro_IoPAGE (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_page);
}
return &((XPVIO*)SvANY(sv))->xio_page;
@@ -1480,7 +1480,7 @@
IV* Perl_macro_IoPAGE_LEN (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_page_len);
}
return &((XPVIO*)SvANY(sv))->xio_page_len;
@@ -1488,7 +1488,7 @@
IV* Perl_macro_IoLINES_LEFT (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_lines_left);
}
return &((XPVIO*)SvANY(sv))->xio_lines_left;
@@ -1496,7 +1496,7 @@
char** Perl_macro_IoTOP_NAME (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_top_name);
}
return &((XPVIO*)SvANY(sv))->xio_top_name;
@@ -1504,7 +1504,7 @@
GV** Perl_macro_IoTOP_GV (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_top_gv);
}
return &((XPVIO*)SvANY(sv))->xio_top_gv;
@@ -1512,7 +1512,7 @@
char** Perl_macro_IoFMT_NAME (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_fmt_name);
}
return &((XPVIO*)SvANY(sv))->xio_fmt_name;
@@ -1520,7 +1520,7 @@
GV** Perl_macro_IoFMT_GV (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_fmt_gv);
}
return &((XPVIO*)SvANY(sv))->xio_fmt_gv;
@@ -1528,7 +1528,7 @@
char** Perl_macro_IoBOTTOM_NAME (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_bottom_name);
}
return &((XPVIO*)SvANY(sv))->xio_bottom_name;
@@ -1536,7 +1536,7 @@
GV** Perl_macro_IoBOTTOM_GV (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_bottom_gv);
}
return &((XPVIO*)SvANY(sv))->xio_bottom_gv;
@@ -1544,7 +1544,7 @@
short* Perl_macro_IoSUBPROCESS (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_subprocess);
}
return &((XPVIO*)SvANY(sv))->xio_subprocess;
@@ -1552,7 +1552,7 @@
char* Perl_macro_IoTYPE (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_type);
}
return &((XPVIO*)SvANY(sv))->xio_type;
@@ -1560,7 +1560,7 @@
char* Perl_macro_IoFLAGS (pTHX_ SV *sv) {
if(SvPMC(sv)) {
- XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
+ XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
return &(data->xio_flags);
}
return &((XPVIO*)SvANY(sv))->xio_flags;
1.15 +11 -0 ponie/perl/sv.h
Index: sv.h
===================================================================
RCS file: /cvs/public/ponie/perl/sv.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -w -r1.14 -r1.15
--- sv.h 7 Apr 2004 10:37:28 -0000 1.14
+++ sv.h 7 Apr 2004 13:51:58 -0000 1.15
@@ -1292,3 +1292,14 @@
UV flags;
PerlInterpreter *proto_perl;
};
+
+#if 1
+/* Invert the bits on any sv_any pointer used to point to a PMC.
+ Instant flaming SEGV death for any part of perl that assumes that it
+ points straight to a perl struct, and accidentally tries to access it.
+ Catches writes that would corrupt parrot's state before the corruption.
+*/
+#define MUMBLE(p) ((void *)((p)?~(UV)(p):0))
+#else
+#define MUMBLE(p) p
+#endif