aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/big.c
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2018-12-13 10:22:36 +0100
committerGitHub <[email protected]>2018-12-13 10:22:36 +0100
commit2bf2b7009905a880f514621e8912508055df437e (patch)
treea8af26e339a45dbd5d6658d46c119078175c9ae6 /erts/emulator/beam/big.c
parent3825199794da28d79b21052a2e69e2335921d55e (diff)
parentc5bb52143bd28c8ce34e427dbf7f024b6e6a65e1 (diff)
downloadotp-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.c12
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);