]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: don't mlock on Ubuntu 5.4 systems
authorIan Lance Taylor <iant@golang.org>
Wed, 22 Jul 2020 04:37:58 +0000 (21:37 -0700)
committerIan Lance Taylor <iant@golang.org>
Wed, 22 Jul 2020 21:31:19 +0000 (21:31 +0000)
For #35777
For #37436
Fixes #40184

Change-Id: I68561497d9258e994d1c6c48d4fb41ac6130ee3a
Reviewed-on: https://go-review.googlesource.com/c/go/+/244059
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
src/runtime/os_linux_x86.go

index d001e6ee59a505862784d8d86140e20622afb7cb..97f870707de7de08f4e28253f69442f007a98131 100644 (file)
@@ -7,7 +7,10 @@
 
 package runtime
 
-import "runtime/internal/atomic"
+import (
+       "runtime/internal/atomic"
+       "unsafe"
+)
 
 //go:noescape
 func uname(utsname *new_utsname) int
@@ -55,6 +58,36 @@ func osArchInit() {
                return
        }
 
+       if major == 5 && minor == 4 && patch < 2 {
+               // All 5.4 versions of Ubuntu are patched.
+               procVersion := []byte("/proc/version\000")
+               f := open(&procVersion[0], _O_RDONLY, 0)
+               if f >= 0 {
+                       var buf [512]byte
+                       p := noescape(unsafe.Pointer(&buf[0]))
+                       n := read(f, p, int32(len(buf)))
+                       closefd(f)
+
+                       needle := []byte("Ubuntu")
+               contains:
+                       for i, c := range buf[:n] {
+                               if c != needle[0] {
+                                       continue
+                               }
+                               if int(n)-i < len(needle) {
+                                       break
+                               }
+                               for j, c2 := range needle {
+                                       if c2 != buf[i+j] {
+                                               continue contains
+                                       }
+                               }
+                               // This is an Ubuntu system.
+                               return
+                       }
+               }
+       }
+
        if major == 5 && (minor == 2 || minor == 3 && patch < 15 || minor == 4 && patch < 2) {
                gsignalInitQuirk = mlockGsignal
                if m0.gsignal != nil {