diff options
| author | Dominik Honnef <dominik@honnef.co> | 2015-06-21 20:07:29 +0200 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2015-08-21 04:23:15 +0000 |
| commit | cb867d2fd64adc851f82be3c6eb6e38ec008930b (patch) | |
| tree | b6da6b194773ac4dcd019e7265994881eba59cc8 /src | |
| parent | 7fb7f53232def3bcd2e0f0dddac7c3ffc47bc5aa (diff) | |
| download | go-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>
Diffstat (limited to 'src')
| -rw-r--r-- | src/os/user/lookup_unix.go | 19 |
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) |
