From: Rémy Oudompheng Date: Tue, 19 Mar 2013 06:08:26 +0000 (+0100) Subject: runtime: fix erroneous overflow protection on netbsd/openbsd semasleep. X-Git-Tag: go1.1rc2~452 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=51f14a9fe285cbc5579ae59fc7f72082c29ce266;p=gostls13.git runtime: fix erroneous overflow protection on netbsd/openbsd semasleep. On NetBSD tv_sec is already an int64 so no need for a test. On OpenBSD, semasleep expects a Unix time as argument, and 1<<30 is in 2004. R=golang-dev, iant CC=golang-dev https://golang.org/cl/7810044 --- diff --git a/src/pkg/runtime/os_netbsd.c b/src/pkg/runtime/os_netbsd.c index 6cf57d6564..d4b874f4c2 100644 --- a/src/pkg/runtime/os_netbsd.c +++ b/src/pkg/runtime/os_netbsd.c @@ -65,7 +65,6 @@ int32 runtime·semasleep(int64 ns) { Timespec ts; - int64 secs; // spin-mutex lock while(runtime·xchg(&m->waitsemalock, 1)) @@ -94,11 +93,7 @@ runtime·semasleep(int64 ns) runtime·lwp_park(nil, 0, &m->waitsemacount, nil); } else { ns += runtime·nanotime(); - secs = ns/1000000000LL; - // Avoid overflow - if(secs > 1LL<<30) - secs = 1LL<<30; - ts.tv_sec = secs; + ts.tv_sec = ns/1000000000LL; ts.tv_nsec = ns%1000000000LL; // TODO(jsing) - potential deadlock! // See above for details. diff --git a/src/pkg/runtime/os_openbsd.c b/src/pkg/runtime/os_openbsd.c index c3f562e0a2..2c34f0ef99 100644 --- a/src/pkg/runtime/os_openbsd.c +++ b/src/pkg/runtime/os_openbsd.c @@ -79,8 +79,8 @@ runtime·semasleep(int64 ns) ns += runtime·nanotime(); secs = ns/1000000000LL; // Avoid overflow - if(secs > 1LL<<30) - secs = 1LL<<30; + if(secs >= 1LL<<31) + secs = (1LL<<31) - 1; ts.tv_sec = secs; ts.tv_nsec = ns%1000000000LL; runtime·thrsleep(&m->waitsemacount, CLOCK_REALTIME, &ts, &m->waitsemalock, nil);