]> git.vpit.fr Git - perl/modules/Scope-Upper.git/commitdiff
Fix segfault when localizing array elements with an invalid negative index
authorVincent Pit <vince@profvince.com>
Sun, 4 Jan 2009 13:32:32 +0000 (14:32 +0100)
committerVincent Pit <vince@profvince.com>
Sun, 4 Jan 2009 13:32:32 +0000 (14:32 +0100)
Upper.xs
t/39-localize_elem-target.t

index b2344b9804c0be57573c894ad2080a60e9981cb3..657f01ce9637e05769478ccde15d90547bb192b1 100644 (file)
--- a/Upper.xs
+++ b/Upper.xs
@@ -115,7 +115,7 @@ STATIC void su_save_aelem(pTHX_ AV *av, SV *key, SV *val) {
   preeminent = av_exists(av, idx);
 
  svp = av_fetch(av, idx, 1);
- if (!*svp || *svp == &PL_sv_undef) croak(PL_no_aelem, idx);
+ if (!svp || *svp == &PL_sv_undef) croak(PL_no_aelem, idx);
 
  if (preeminent)
   save_aelem(av, idx, svp);
index ecff42bb2ab765847e25e74b89561ac4075cef50..fe538e40ddb7ff92cfb6be93982f0cfcee2d114f 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 17;
+use Test::More tests => 21;
 
 use Scope::Upper qw/localize_elem/;
 
@@ -29,6 +29,24 @@ our @a;
  is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 4, 8, 0 [end]';
 }
 
+{
+ local @a = (4 .. 6);
+ {
+  localize_elem '@main::a', -2, 8, 0;
+  is_deeply \@a, [ 4, 8, 6 ], 'localize_elem "@a", -2, 8, 0 [ok]';
+ }
+ is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", -2, 8, 0 [end]';
+}
+
+{
+ local @a = (4 .. 6);
+ {
+  eval { localize_elem '@main::a', -4, 8, 0 };
+  like $@, qr/Modification of non-creatable array value attempted, subscript -4/, 'localize_elem "@a", -4, 8, 0 [ok]';
+ }
+ is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", -4, 8, 0 [end]';
+}
+
 {
  local @a = (4 .. 6);
  {