Skip to content

Commit 241b958

Browse files
Elias Naursteeve
Elias Naur
authored andcommitted
syscall: replace lstat, lchown, stat to please Android O
Implement Lstat with fstatat and Lchown with Fchownat on linux/amd64, linux/arm and linux/386. Furthermore, implement Stat with fstatat on linux/arm and linux/386. Linux/arm64 already had similar replacements. The fstatat and fchownat system calls were added in kernel 2.6.16, which is before the Go minimum, 2.6.23. The three syscalls then match the android bionic implementation and avoids the Android O seccomp filter. Fixes #27797 Change-Id: I07fd5506955d454a1a660fef5af0e1ac1ecb0959 Reviewed-on: https://go-review.googlesource.com/136795 TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Brad Fitzpatrick <[email protected]>
1 parent 93e5322 commit 241b958

6 files changed

+32
-128
lines changed

src/syscall/syscall_linux_386.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,6 @@ func Pipe2(p []int, flags int) (err error) {
6262
//sysnb InotifyInit() (fd int, err error)
6363
//sys Ioperm(from int, num int, on int) (err error)
6464
//sys Iopl(level int) (err error)
65-
//sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32
66-
//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
6765
//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
6866
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
6967
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
@@ -74,7 +72,6 @@ func Pipe2(p []int, flags int) (err error) {
7472
//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
7573
//sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32
7674
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
77-
//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
7875
//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error)
7976
//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
8077
//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32
@@ -84,6 +81,18 @@ func Pipe2(p []int, flags int) (err error) {
8481
//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)
8582
//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
8683

84+
func Stat(path string, stat *Stat_t) (err error) {
85+
return fstatat(_AT_FDCWD, path, stat, 0)
86+
}
87+
88+
func Lchown(path string, uid int, gid int) (err error) {
89+
return Fchownat(_AT_FDCWD, path, uid, gid, _AT_SYMLINK_NOFOLLOW)
90+
}
91+
92+
func Lstat(path string, stat *Stat_t) (err error) {
93+
return fstatat(_AT_FDCWD, path, stat, _AT_SYMLINK_NOFOLLOW)
94+
}
95+
8796
func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
8897
page := uintptr(offset / 4096)
8998
if offset != int64(page)*4096 {

src/syscall/syscall_linux_amd64.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@ const (
2222
//sysnb InotifyInit() (fd int, err error)
2323
//sys Ioperm(from int, num int, on int) (err error)
2424
//sys Iopl(level int) (err error)
25-
//sys Lchown(path string, uid int, gid int) (err error)
2625
//sys Listen(s int, n int) (err error)
27-
//sys Lstat(path string, stat *Stat_t) (err error)
2826
//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
2927
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
3028
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
@@ -66,6 +64,14 @@ func Stat(path string, stat *Stat_t) (err error) {
6664
return fstatat(_AT_FDCWD, path, stat, 0)
6765
}
6866

67+
func Lchown(path string, uid int, gid int) (err error) {
68+
return Fchownat(_AT_FDCWD, path, uid, gid, _AT_SYMLINK_NOFOLLOW)
69+
}
70+
71+
func Lstat(path string, stat *Stat_t) (err error) {
72+
return fstatat(_AT_FDCWD, path, stat, _AT_SYMLINK_NOFOLLOW)
73+
}
74+
6975
//go:noescape
7076
func gettimeofday(tv *Timeval) (err Errno)
7177

src/syscall/syscall_linux_arm.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,7 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
8383
//sysnb Getgid() (gid int) = SYS_GETGID32
8484
//sysnb Getuid() (uid int) = SYS_GETUID32
8585
//sysnb InotifyInit() (fd int, err error)
86-
//sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32
8786
//sys Listen(s int, n int) (err error)
88-
//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
8987
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
9088
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
9189
//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32
@@ -96,7 +94,6 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
9694
//sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32
9795
//sys Shutdown(fd int, how int) (err error)
9896
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
99-
//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
10097

10198
// Vsyscalls on amd64.
10299
//sysnb Gettimeofday(tv *Timeval) (err error)
@@ -110,6 +107,18 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
110107
//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)
111108
//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
112109

110+
func Stat(path string, stat *Stat_t) (err error) {
111+
return fstatat(_AT_FDCWD, path, stat, 0)
112+
}
113+
114+
func Lchown(path string, uid int, gid int) (err error) {
115+
return Fchownat(_AT_FDCWD, path, uid, gid, _AT_SYMLINK_NOFOLLOW)
116+
}
117+
118+
func Lstat(path string, stat *Stat_t) (err error) {
119+
return fstatat(_AT_FDCWD, path, stat, _AT_SYMLINK_NOFOLLOW)
120+
}
121+
113122
func Fstatfs(fd int, buf *Statfs_t) (err error) {
114123
_, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
115124
if e != 0 {

src/syscall/zsyscall_linux_386.go

Lines changed: 0 additions & 45 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_linux_amd64.go

Lines changed: 0 additions & 30 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_linux_arm.go

Lines changed: 0 additions & 45 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)