golang / go

The Go programming language
https://go.dev
BSD 3-Clause "New" or "Revised" License
124.07k stars 17.68k forks source link

x/mobile: os.Hostname() fails on Android 0 (possibly earlier version as well). #24701

Closed halseth closed 6 years ago

halseth commented 6 years ago

Please answer these questions before submitting your issue. Thanks!

What version of Go are you using (go version)?

go version go1.10.1 darwin/amd64

Does this issue reproduce with the latest release?

Yes

What operating system and processor architecture are you using (go env)?

GOARCH="amd64" GOBIN="" GOCACHE="/Users/johan/Library/Caches/go-build" GOEXE="" GOHOSTARCH="amd64" GOHOSTOS="darwin" GOOS="darwin" GOPATH="/Users/johan/golang" GORACE="" GOROOT="/usr/local/Cellar/go/1.10.1/libexec" GOTMPDIR="" GOTOOLDIR="/usr/local/Cellar/go/1.10.1/libexec/pkg/tool/darwin_amd64" GCCGO="gccgo" CC="clang" CXX="clang++" CGO_ENABLED="1" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/kq/3436m_v11sg0l7zqtmv2r1gw0000gn/T/go-build866177725=/tmp/go-build -gno-record-gcc-switches -fno-common"

What did you do?

Building a golang library for Android using gomobile bind:

"$GOPATH/bin/gomobile" bind -target=android -tags="android" -v -o "$android_dest" "$package"

When the library is, calling os.Hostname(), the call fails with error open /proc/sys/kernel/hostname: permission denied run on Android O (8.1.0). Also tested on Marshmallow (6.0) where the problem didn't occur.

EDIT: Exact messsage is

04-05 15:43:10.178 5585-5585/? W/Thread-4: type=1400 audit(0.0:4585): avc: denied { read } for name="hostname" dev="proc" ino=3489882 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:proc:s0 tclass=file permissive=0

Looks like access to /proc has been restricted? https://issuetracker.google.com/issues/37140047

What did you expect to see?

Call not failing.

What did you see instead?

App stopping with error

04-05 15:52:53.295 6990-6990/? W/Thread-4: type=1400 audit(0.0:4592): avc: denied { read } for name="hostname" dev="proc" ino=3515836 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:proc:s0 tclass=file permissive=0
04-05 15:52:53.313 1130-1570/? W/InputDispatcher: channel 'ee0d04c com.example.johan.lndtestapp2/com.example.johan.lndtestapp2.MainActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
04-05 15:52:53.313 1130-1570/? E/InputDispatcher: channel 'ee0d04c com.example.johan.lndtestapp2/com.example.johan.lndtestapp2.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
04-05 15:52:53.313 1130-2774/? I/ActivityManager: Process com.example.johan.lndtestapp2 (pid 6990) has died: fore TOP 
04-05 15:52:53.313 1130-1170/? W/zygote64: kill(-6990, 9) failed: No such process
04-05 15:52:53.313 1130-1170/? I/zygote64: Successfully killed process cgroup uid 10179 pid 6990 in 0ms
04-05 15:52:53.314 1130-2774/? W/ActivityManager: Force removing ActivityRecord{2ba77ef u0 com.example.johan.lndtestapp2/.MainActivity t1949}: app died, no saved state

EDIT: my library wasn't handling the error case properly, so it is not actually crashing, just that the call to os.Hostname() is failing.

bradfitz commented 6 years ago

It looks like 04e6ae6bc3ac9739568b0f1225ee5e2d53cba919 was included in go1.10.1: 67b695627005fbd66183e00036450b5c639427a8 and 8d90bb4b199261000c0011348eeac5e4ad642f1d and 1188eb9c5bc67fa7d8dc97f01905e9e364eeb793

Maybe you need to recompile something?

/cc @eliasnaur @tklauser @zx2c4

eliasnaur commented 6 years ago

On my Android O device and emulator, os.Hostname returns an error: open /proc/sys/kernel/hostname: permission denied. That's not a crash. Perhaps some code in your program depends on os.Hostname not to fail.

If you don't see a crash from the standard library either, please change this issue title to be about making os.Hostname not fail on Android O and later. I don't know how to do that, though.

halseth commented 6 years ago

@bradfitz Just tried reinstalling go from golang.org (go1.10.1 darwin/amd64), and compiling gomobile and gobind at commit https://github.com/golang/mobile/commit/f16143114e76e7064ca84d392bb01d5ed876dd52 (newest commit that would actually build my project). Same issue.

halseth commented 6 years ago

@eliasnaur You are absolutely right! App was crashing because the go library was not handling the error properly. Updated title and description to reflect that.

eliasnaur commented 6 years ago

Perhaps the __system_property_get function as mentioned in https://github.com/golang/go/issues/20455#issuecomment-379377568 could be used as a replacement on GOOS=android.

bradfitz commented 6 years ago

SGTM.

gopherbot commented 6 years ago

Change https://golang.org/cl/110295 mentions this issue: os: return fake hostname on Android to avoid being killed

mdcnz commented 6 years ago

Apologies for commenting on a closed issue, but in the commit 3c7456c should there be a break after name = string(buf[:i]) ?

+   var buf [512]byte // Enough for a DNS name.
+   for i, b := range un.Nodename[:] {
+       buf[i] = uint8(b)
+       if b == 0 {
+           name = string(buf[:i])
+       }
+   }
gopherbot commented 6 years ago

Change https://golang.org/cl/110436 mentions this issue: os: fix missing break bug in earlier CL 110295's use of Uname

bradfitz commented 6 years ago

@mdcnz, whoops. Fixed. Thanks!