This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix integer overflows in Perl_do_vecget()/set
authorDavid Mitchell <davem@iabyn.com>
Thu, 16 Mar 2017 12:29:03 +0000 (12:29 +0000)
committerDavid Mitchell <davem@iabyn.com>
Fri, 17 Mar 2017 14:13:40 +0000 (14:13 +0000)
commit67dd6f35b05c5d28609af9237e6f509a8bb91383
tree42a4e6a88f1c215e19c9ed0b678ff59224969f1f
parentd69c43040e4967294b1195ecfdc4acf0f74b5958
fix integer overflows in Perl_do_vecget()/set

RT #130915

In something like

    vec($str, $bignum, 16)

(i.e. where $str is treated as a series of 16-bit words), Perl_do_vecget()
and Perl_do_vecset() end up doing calculations equivalent to:

    $start = $bignum*2;
    $end = $start + 2;

Currently both these calculations can wrap if $bignum is near the maximum
value of a STRLEN (the previous commit already fixed cases for $bignum >
max(STRLEN)).

So this commit makes them check for potential overflow before doing such
calculations.

It also takes account of the fact that the previous commit changed the
type of offset from signed to unsigned.

Finally, it also adds some tests to t/op/vec.t for where the 'word'
overlaps the end of the string, for example

    $x = vec("ab", 0, 64)

should behave the same as:

    $x = vec("ab\0\0\0\0\0\0", 0, 64)

This uses a separate code path, and I couldn't see any tests for it.

This commit is based on an earlier proposed fix by Aaron Crane.
doop.c
t/op/vec.t