]> Cypherpunks repositories - gostls13.git/commit
math/big: protect against aliasing in nat.divLarge
authorAlberto Donizetti <alb.donizetti@gmail.com>
Tue, 21 Nov 2017 13:16:04 +0000 (14:16 +0100)
committerRobert Griesemer <gri@golang.org>
Thu, 30 Nov 2017 20:36:54 +0000 (20:36 +0000)
commitff534e2130f4ab0f297bb08d66b082878483bfc1
tree5eab1e0feb628f7ebb1ed049d219517d175d8e23
parent5bd66e5e1e815f25b1a3973220ba803cfeeb98e4
math/big: protect against aliasing in nat.divLarge

In nat.divLarge (having signature (z nat).divLarge(u, uIn, v nat)),
we check whether z aliases uIn or v, but aliasing is currently not
checked for the u parameter.

Unfortunately, z and u aliasing each other can in some cases cause
errors in the computation.

The q return parameter (which will hold the result's quotient), is
unconditionally initialized as

    q = z.make(m + 1)

When cap(z) ≥ m+1, z.make() will reuse z's backing array, causing q
and z to share the same backing array. If then z aliases u, setting q
during the quotient computation will then corrupt u, which at that
point already holds computation state.

To fix this, we add an alias(z, u) check at the beginning of the
function, taking care of aliasing the same way we already do for uIn
and v.

Fixes #22830

Change-Id: I3ab81120d5af6db7772a062bb1dfc011de91f7ad
Reviewed-on: https://go-review.googlesource.com/78995
Run-TryBot: Alberto Donizetti <alb.donizetti@gmail.com>
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/math/big/int_test.go
src/math/big/nat.go