mirror of
https://github.com/golang/go
synced 2024-11-18 10:04:43 -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)
|
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) {
|
func setMaxThreads(in int) (out int) {
|
||||||
lock(&sched.lock)
|
lock(&sched.lock)
|
||||||
out = int(sched.maxmcount)
|
out = int(sched.maxmcount)
|
||||||
|
if in > 0x7fffffff { // MaxInt32
|
||||||
|
sched.maxmcount = 0x7fffffff
|
||||||
|
} else {
|
||||||
sched.maxmcount = int32(in)
|
sched.maxmcount = int32(in)
|
||||||
|
}
|
||||||
checkmcount()
|
checkmcount()
|
||||||
unlock(&sched.lock)
|
unlock(&sched.lock)
|
||||||
return
|
return
|
||||||
|
Loading…
Reference in New Issue
Block a user