aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Honnef <dominik@honnef.co>2015-06-21 20:07:29 +0200
committerBrad Fitzpatrick <bradfitz@golang.org>2015-08-21 04:23:15 +0000
commitcb867d2fd64adc851f82be3c6eb6e38ec008930b (patch)
treeb6da6b194773ac4dcd019e7265994881eba59cc8
parent7fb7f53232def3bcd2e0f0dddac7c3ffc47bc5aa (diff)
downloadgo-cb867d2fd64adc851f82be3c6eb6e38ec008930b.tar.xz
os/user: don't depend on _SC_GETPW_R_SIZE_MAX on Linux
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>
-rw-r--r--src/os/user/lookup_unix.go19
1 files changed, 8 insertions, 11 deletions
diff --git a/src/os/user/lookup_unix.go b/src/os/user/lookup_unix.go
index f4f603ea87..e8a1eb1bbf 100644
--- a/src/os/user/lookup_unix.go
+++ b/src/os/user/lookup_unix.go
@@ -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)