diff options
author | John Q. Linux <jql@accessone.com> | 1997-01-10 19:47:16 -0800 |
---|---|---|
committer | Chip Salzenberg <chip@atlantic.net> | 1997-01-16 07:24:00 +1200 |
commit | 74c80e585086695d5428ab316ca82fd6931aeabd (patch) | |
tree | 0c8ee1e82e2b411b4516bf1e6d2d186861b2e273 | |
parent | 49e60db318dafe6977e7332fc64c4fac32f5eb2c (diff) | |
download | perl-74c80e585086695d5428ab316ca82fd6931aeabd.tar.gz |
Forbid ++ and -- on readonly values
Subject: You can ++ and -- readonly integer scalars? (patch included)
I managed to find an illustration of the bug in a perl one-liner:
perl -e '*a = \100; $a++; print "$a\n"'
101
Perhaps that's been fixed in one of the beta releases which I'm not
running; or perhaps I'm the only one who finds that slightly incorrect.
If so, ignore the rest of this message.
You can modify readonly scalars using any of the pre/post
increment/decrement operators. Apparently, the only readonly checking is
done for cases like '100++'.
I managed to find the relevant code and add some SvREADONLY checks. It
now dies on the inc/dec of readonly scalars with the appropriate nasty
message. I just thought I'd share my patch.
Ashley Winters
p5p-msgid: <Pine.LNX.3.95.970110193330.11249D-100000@jql.accessone.com>
-rw-r--r-- | pp.c | 6 | ||||
-rw-r--r-- | pp_hot.c | 2 |
2 files changed, 8 insertions, 0 deletions
@@ -575,6 +575,8 @@ PP(pp_undef) PP(pp_predec) { dSP; + if (SvREADONLY(TOPs)) + croak(no_modify); if (SvIOK(TOPs)) { if (SvIVX(TOPs) == IV_MIN) { sv_setnv(TOPs, (double)SvIVX(TOPs) - 1.0); @@ -593,6 +595,8 @@ PP(pp_predec) PP(pp_postinc) { dSP; dTARGET; + if (SvREADONLY(TOPs)) + croak(no_modify); sv_setsv(TARG, TOPs); if (SvIOK(TOPs)) { if (SvIVX(TOPs) == IV_MAX) { @@ -615,6 +619,8 @@ PP(pp_postinc) PP(pp_postdec) { dSP; dTARGET; + if(SvREADONLY(TOPs)) + croak(no_modify); sv_setsv(TARG, TOPs); if (SvIOK(TOPs)) { if (SvIVX(TOPs) == IV_MIN) { @@ -251,6 +251,8 @@ PP(pp_eq) PP(pp_preinc) { dSP; + if (SvREADONLY(TOPs)) + croak(no_modify); if (SvIOK(TOPs)) { if (SvIVX(TOPs) == IV_MAX) { sv_setnv(TOPs, (double)(SvIVX(TOPs)) + 1.0 ); |