]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/debug: avoid overflow in SetMaxThreads
authorAlberto Donizetti <alb.donizetti@gmail.com>
Thu, 20 Oct 2016 09:24:51 +0000 (11:24 +0200)
committerIan Lance Taylor <iant@golang.org>
Thu, 20 Oct 2016 21:08:18 +0000 (21:08 +0000)
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>
src/runtime/debug/garbage_test.go
src/runtime/proc.go

index d1fa7db23a477590c8fc841be024b947ed25cd00..6b03455cf903a96d7234f05892325288cf5a4036 100644 (file)
@@ -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
+}
index f68a189997c0c1aa14a6b4638620ee7aba246dbe..9fc24e3ae33ab67501b73b18ca38ecbe27400551 100644 (file)
@@ -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