unix: fix Fstatat by using fillStat_t on linux/mips64x
authorAnthony Fok <foka@debian.org>
Fri, 28 Dec 2018 13:18:00 +0000 (06:18 -0700)
committerMichael Stapelberg <stapelberg@debian.org>
Thu, 24 Jan 2019 07:23:06 +0000 (07:23 +0000)
The stat structure on linux/mips64x differ between C library and the kernel,
as described in the stat(2) man page.

Fstat, Lstat and Stat on linux/mips64x already converts the stat structure
using a fillStat_t function, very similar to __xstat_conv in GLIBC.
Doing the same for Fstatat before calling SYS_NEWFSTATAT fixes the
"Fstatat: returned stat does not match Stat/Lstat" error in TestFstatat.

Fixes golang/go#29401

Change-Id: I0b2a7b274acc3c7c9fc7ae2afe722dd6225da383
Reviewed-on: https://go-review.googlesource.com/c/155747
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com>
Gbp-Pq: Name 0004-fix-Fstatat-by-using-fillStat_t-on-linux-mips64x.patch

src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go

index ad991031c7e0738403614624895ce6cb6d81d605..18541dc5730bc797f8838e1e76d9a9c5e46479d7 100644 (file)
@@ -12,7 +12,6 @@ package unix
 //sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 //sys  Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64
 //sys  Fchown(fd int, uid int, gid int) (err error)
-//sys  Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT
 //sys  Fstatfs(fd int, buf *Statfs_t) (err error)
 //sys  Ftruncate(fd int, length int64) (err error)
 //sysnb        Getegid() (egid int)
@@ -148,6 +147,7 @@ type stat_t struct {
 }
 
 //sys  fstat(fd int, st *stat_t) (err error)
+//sys  fstatat(dirfd int, path string, st *stat_t, flags int) (err error) = SYS_NEWFSTATAT
 //sys  lstat(path string, st *stat_t) (err error)
 //sys  stat(path string, st *stat_t) (err error)
 
@@ -158,6 +158,13 @@ func Fstat(fd int, s *Stat_t) (err error) {
        return
 }
 
+func Fstatat(dirfd int, path string, s *Stat_t, flags int) (err error) {
+       st := &stat_t{}
+       err = fstatat(dirfd, path, st, flags)
+       fillStat_t(s, st)
+       return
+}
+
 func Lstat(path string, s *Stat_t) (err error) {
        st := &stat_t{}
        err = lstat(path, st)
index 382e072f5e552ffb46cbd9b5596bdd1836d83aca..9edc1f4172fc6157a762f4178efd6fcf70cdb8a9 100644 (file)
@@ -1547,21 +1547,6 @@ func Fchown(fd int, uid int, gid int) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) {
-       var _p0 *byte
-       _p0, err = BytePtrFromString(path)
-       if err != nil {
-               return
-       }
-       _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fstatfs(fd int, buf *Statfs_t) (err error) {
        _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)
        if e1 != 0 {
@@ -2121,6 +2106,21 @@ func fstat(fd int, st *stat_t) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func fstatat(dirfd int, path string, st *stat_t, flags int) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(path)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), uintptr(flags), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func lstat(path string, st *stat_t) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index da33eb12b072b6b1f5e1dd8f3bf84ae1c7796437..9e657762d1d1ff07fd88c23cffc2d64f9cada1cb 100644 (file)
@@ -1547,21 +1547,6 @@ func Fchown(fd int, uid int, gid int) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) {
-       var _p0 *byte
-       _p0, err = BytePtrFromString(path)
-       if err != nil {
-               return
-       }
-       _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fstatfs(fd int, buf *Statfs_t) (err error) {
        _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)
        if e1 != 0 {
@@ -2121,6 +2106,21 @@ func fstat(fd int, st *stat_t) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func fstatat(dirfd int, path string, st *stat_t, flags int) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(path)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), uintptr(flags), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func lstat(path string, st *stat_t) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)