diff options
author | Björn Gustavsson <[email protected]> | 2018-12-13 10:22:36 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2018-12-13 10:22:36 +0100 |
commit | 2bf2b7009905a880f514621e8912508055df437e (patch) | |
tree | a8af26e339a45dbd5d6658d46c119078175c9ae6 /erts/emulator/beam/big.c | |
parent | 3825199794da28d79b21052a2e69e2335921d55e (diff) | |
parent | c5bb52143bd28c8ce34e427dbf7f024b6e6a65e1 (diff) | |
download | otp-2bf2b7009905a880f514621e8912508055df437e.tar.gz otp-2bf2b7009905a880f514621e8912508055df437e.tar.bz2 otp-2bf2b7009905a880f514621e8912508055df437e.zip |
Merge pull request #2051 from bjorng/bjorn/erts/bignum/OTP-15484
Fix reading beyond end of bignum in integer squaring
Diffstat (limited to 'erts/emulator/beam/big.c')
-rw-r--r-- | erts/emulator/beam/big.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/erts/emulator/beam/big.c b/erts/emulator/beam/big.c index 84338769e0..dac9574fa5 100644 --- a/erts/emulator/beam/big.c +++ b/erts/emulator/beam/big.c @@ -668,27 +668,25 @@ static dsize_t I_mul(ErtsDigit* x, dsize_t xl, ErtsDigit* y, dsize_t yl, ErtsDig static dsize_t I_sqr(ErtsDigit* x, dsize_t xl, ErtsDigit* r) { - ErtsDigit d_next = *x; ErtsDigit d; ErtsDigit* r0 = r; ErtsDigit* s = r; if ((r + xl) == x) /* "Inline" operation */ *x = 0; - x++; while(xl--) { - ErtsDigit* y = x; + ErtsDigit* y; ErtsDigit y_0 = 0, y_1 = 0, y_2 = 0, y_3 = 0; ErtsDigit b0, b1; ErtsDigit z0, z1, z2; ErtsDigit t; dsize_t y_l = xl; - + + d = *x; + x++; + y = x; s = r; - d = d_next; - d_next = *x; - x++; DMUL(d, d, b1, b0); DSUMc(*s, b0, y_3, t); |