mirror of
https://github.com/golang/go
synced 2024-11-18 08:04:40 -07:00
runtime/debug: avoid overflow in SetMaxThreads
Fixes #16076 Change-Id: I91fa87b642592ee4604537dd8c3197cd61ec8b31 Reviewed-on: https://go-review.googlesource.com/31516 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
f6f3aef53f
commit
10560afb54
@ -114,3 +114,16 @@ func TestSetGCPercent(t *testing.T) {
|
||||
t.Errorf("SetGCPercent(123); SetGCPercent(x) = %d, want 123", new)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSetMaxThreadsOvf(t *testing.T) {
|
||||
// Verify that a big threads count will not overflow the int32
|
||||
// maxmcount variable, causing a panic (see Issue 16076).
|
||||
//
|
||||
// This can only happen when ints are 64 bits, since on platforms
|
||||
// with 32 bit ints SetMaxThreads (which takes an int parameter)
|
||||
// cannot be given anything that will overflow an int32.
|
||||
//
|
||||
// Call SetMaxThreads with 1<<31, but only on 64 bit systems.
|
||||
nt := SetMaxThreads(1 << (30 + ^uint(0)>>63))
|
||||
SetMaxThreads(nt) // restore previous value
|
||||
}
|
||||
|
@ -4294,7 +4294,11 @@ func runqsteal(_p_, p2 *p, stealRunNextG bool) *g {
|
||||
func setMaxThreads(in int) (out int) {
|
||||
lock(&sched.lock)
|
||||
out = int(sched.maxmcount)
|
||||
sched.maxmcount = int32(in)
|
||||
if in > 0x7fffffff { // MaxInt32
|
||||
sched.maxmcount = 0x7fffffff
|
||||
} else {
|
||||
sched.maxmcount = int32(in)
|
||||
}
|
||||
checkmcount()
|
||||
unlock(&sched.lock)
|
||||
return
|
||||
|
Loading…
Reference in New Issue
Block a user