summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Q. Linux <jql@accessone.com>1997-01-10 19:47:16 -0800
committerChip Salzenberg <chip@atlantic.net>1997-01-16 07:24:00 +1200
commit74c80e585086695d5428ab316ca82fd6931aeabd (patch)
tree0c8ee1e82e2b411b4516bf1e6d2d186861b2e273
parent49e60db318dafe6977e7332fc64c4fac32f5eb2c (diff)
downloadperl-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.c6
-rw-r--r--pp_hot.c2
2 files changed, 8 insertions, 0 deletions
diff --git a/pp.c b/pp.c
index 48e332198b..f4cdc2dd63 100644
--- a/pp.c
+++ b/pp.c
@@ -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) {
diff --git a/pp_hot.c b/pp_hot.c
index 150afe27f0..f1ee8f2c84 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -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 );