]> Cypherpunks repositories - gostls13.git/commitdiff
os/user: don't depend on _SC_GETPW_R_SIZE_MAX on Linux
authorDominik Honnef <dominik@honnef.co>
Sun, 21 Jun 2015 18:07:29 +0000 (20:07 +0200)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 21 Aug 2015 04:23:15 +0000 (04:23 +0000)
Even Linux systems may not have _SC_GETPW_R_SIZE_MAX if using a
different libc than glibc (e.g. musl). Instead of having special-cases
for the BSDs, handle -1 correctly by always using a default buffer size.

Fixes #11319.

Change-Id: I8b1b260eb9830e6dbe7667f3f33d115ae4de4ce8
Reviewed-on: https://go-review.googlesource.com/13772
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>

src/os/user/lookup_unix.go

index f4f603ea8716057df599f81acb1c5feaa52dad2c..e8a1eb1bbf97f74ee3d950151878d32f1e2330a6 100644 (file)
@@ -9,7 +9,6 @@ package user
 
 import (
        "fmt"
-       "runtime"
        "strconv"
        "strings"
        "syscall"
@@ -55,17 +54,15 @@ func lookupUnix(uid int, username string, lookupByName bool) (*User, error) {
        var pwd C.struct_passwd
        var result *C.struct_passwd
 
-       var bufSize C.long
-       if runtime.GOOS == "dragonfly" || runtime.GOOS == "freebsd" {
-               // DragonFly and FreeBSD do not have _SC_GETPW_R_SIZE_MAX
-               // and just return -1.  So just use the same
-               // size that Linux returns.
+       bufSize := C.sysconf(C._SC_GETPW_R_SIZE_MAX)
+       if bufSize == -1 {
+               // DragonFly and FreeBSD do not have _SC_GETPW_R_SIZE_MAX.
+               // Additionally, not all Linux systems have it, either. For
+               // example, the musl libc returns -1.
                bufSize = 1024
-       } else {
-               bufSize = C.sysconf(C._SC_GETPW_R_SIZE_MAX)
-               if bufSize <= 0 || bufSize > 1<<20 {
-                       return nil, fmt.Errorf("user: unreasonable _SC_GETPW_R_SIZE_MAX of %d", bufSize)
-               }
+       }
+       if bufSize <= 0 || bufSize > 1<<20 {
+               return nil, fmt.Errorf("user: unreasonable _SC_GETPW_R_SIZE_MAX of %d", bufSize)
        }
        buf := C.malloc(C.size_t(bufSize))
        defer C.free(buf)