]> Cypherpunks repositories - gostls13.git/commit
runtime: don't use (addrRange).subtract in removeGreaterEqual
authorMichael Anthony Knyszek <mknyszek@google.com>
Mon, 18 May 2020 16:06:11 +0000 (16:06 +0000)
committerMichael Knyszek <mknyszek@google.com>
Wed, 20 May 2020 15:15:16 +0000 (15:15 +0000)
commitdfd613e0e4fd93ef945e9fbd6d42b79bcaf73905
tree6e32f5f5f747a5eab4eea0e59d673ff1a36173c7
parent4ec4a792f6e60c9c4f40a928650c66419ee0e446
runtime: don't use (addrRange).subtract in removeGreaterEqual

Currently in (*addrRanges).removeGreaterEqual we use
(addrRange).subtract with a range from specified address to "infinity"
which is supposed to be maxOffAddr. However, maxOffAddr is necessarily
an inclusive bound on the address space, because on many platforms an
exclusive bound would overflow back to 0.

On some platforms like mips and mipsle, the address space is smaller
than what's representable in a pointer, so if there's a range which hits
the top of the address space (such as in the pageAlloc tests), the limit
doesn't overflow, but maxOffAddr is inclusive, so any attempt to prune
this range with (*addrRange).removeGreaterEqual causes a failure, since
the range passed to subtract is contained within the address range which
touches the top of the address space.

Another problem with using subtract here is that addr and
maxOffAddr.addr() may not be in the same segment which could cause
makeAddrRange to panic. While this unlikely to happen, on some platforms
such as Solaris it is possible.

Fix these issues by not using subtract at all. Create a specific
implementation of (addrRange).removeGreaterEqual which side-steps all of
this by not having to worry about the top of the address space at all.

Fixes #39128.

Change-Id: Icd5b587b1a3d32a5681fb76cec4c001401f5756f
Reviewed-on: https://go-review.googlesource.com/c/go/+/234457
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/runtime/mranges.go