i found some strange behaviour in perlarray.pmc Consider this code:
new P0, .PerlArray, 2 # P0[2] set P0, 2, 1 # P0[2] = 1 set P0, -4, 1 # P0[-4] = 1 # Above runs some strange code: # ix += SELF->cache.int_val # where ix is our key # in our case: # ix = -4 + 2 , ix is now -2 # lets se if we have anything at key -2 set I0, P0, -2 print I0 print "\n" end output: 1 This behaviour could be exploitable since it's easy to overflow the heap I've included a fast hack to stop this leakage.. /josef
--- perlarray.pmc.orig Tue Jun 25 11:23:40 2002 +++ perlarray.pmc Tue Jun 25 11:23:14 2002 @@ -100,7 +100,7 @@ resize_array(interpreter, SELF, ix+1); } if (ix < 0) { - ix += SELF->cache.int_val; + ix = SELF->cache.int_val; } array = ((Buffer *) SELF->data)->bufstart; @@ -128,7 +128,7 @@ resize_array(interpreter, SELF, ix+1); } if (ix < 0) { - ix += SELF->cache.int_val; + ix = SELF->cache.int_val; } array = ((Buffer *) SELF->data)->bufstart; @@ -156,7 +156,7 @@ resize_array(interpreter, SELF, ix+1); } else if (ix < 0) { - ix += SELF->cache.int_val; + ix = SELF->cache.int_val; } array = ((Buffer *) SELF->data)->bufstart; @@ -180,7 +180,7 @@ resize_array(interpreter, SELF, ix+1); } else if (ix < 0) { - ix += SELF->cache.int_val; + ix = SELF->cache.int_val; } array = ((Buffer *) SELF->data)->bufstart; @@ -236,10 +236,10 @@ if (ix >= SELF->cache.int_val) { resize_array(interpreter, SELF, ix+1); - } + } else if (ix < 0) { - ix += SELF->cache.int_val; - } + ix = SELF->cache.int_val; + } array = ((Buffer *) SELF->data)->bufstart; element = array[ix]; @@ -284,7 +284,7 @@ resize_array(interpreter, SELF, ix+1); } else if (ix < 0) { - ix += SELF->cache.int_val; + ix = SELF->cache.int_val; } array = ((Buffer *) SELF->data)->bufstart; @@ -328,7 +328,7 @@ resize_array(interpreter, SELF, ix+1); } else if (ix < 0) { - ix += SELF->cache.int_val; + ix = SELF->cache.int_val; } array = ((Buffer *) SELF->data)->bufstart; @@ -356,7 +356,7 @@ resize_array(interpreter, SELF, ix+1); } else if (ix < 0) { - ix += SELF->cache.int_val; + ix = SELF->cache.int_val; } if (src_key) src = src->vtable->get_pmc_keyed(INTERP, src, src_key);