You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
2.2 KiB
62 lines
2.2 KiB
commit 52d0119743180164d1664b6773ac5d873f224608 |
|
Author: Jiaxun Yang <jiaxun.yang@flygoat.com> |
|
Date: Tue Sep 7 13:31:42 2021 +0800 |
|
|
|
MIPS: Setup errno for {f,l,}xstat |
|
|
|
{f,l,}xstat stub for MIPS is using INTERNAL_SYSCALL |
|
to do xstat syscall for glibc ver, However it leaves |
|
errno untouched and thus giving bad errno output. |
|
|
|
Setup errno properly when syscall returns non-zero. |
|
|
|
Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com> |
|
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> |
|
|
|
(cherry picked from commit 66016ec8aeefd40e016d7040d966484c764b0e9c) |
|
|
|
diff --git a/sysdeps/unix/sysv/linux/mips/fxstat.c b/sysdeps/unix/sysv/linux/mips/fxstat.c |
|
index 11511d30b38708ce..4a6016ff123e8dd9 100644 |
|
--- a/sysdeps/unix/sysv/linux/mips/fxstat.c |
|
+++ b/sysdeps/unix/sysv/linux/mips/fxstat.c |
|
@@ -35,7 +35,9 @@ __fxstat (int vers, int fd, struct stat *buf) |
|
{ |
|
struct kernel_stat kbuf; |
|
int r = INTERNAL_SYSCALL_CALL (fstat, fd, &kbuf); |
|
- return r ?: __xstat_conv (vers, &kbuf, buf); |
|
+ if (r == 0) |
|
+ return __xstat_conv (vers, &kbuf, buf); |
|
+ return INLINE_SYSCALL_ERROR_RETURN_VALUE (-r); |
|
} |
|
} |
|
} |
|
diff --git a/sysdeps/unix/sysv/linux/mips/lxstat.c b/sysdeps/unix/sysv/linux/mips/lxstat.c |
|
index 871fb6c6c5886665..54f990a250677091 100644 |
|
--- a/sysdeps/unix/sysv/linux/mips/lxstat.c |
|
+++ b/sysdeps/unix/sysv/linux/mips/lxstat.c |
|
@@ -35,7 +35,9 @@ __lxstat (int vers, const char *name, struct stat *buf) |
|
{ |
|
struct kernel_stat kbuf; |
|
int r = INTERNAL_SYSCALL_CALL (lstat, name, &kbuf); |
|
- return r ?: __xstat_conv (vers, &kbuf, buf); |
|
+ if (r == 0) |
|
+ return __xstat_conv (vers, &kbuf, buf); |
|
+ return INLINE_SYSCALL_ERROR_RETURN_VALUE (-r); |
|
} |
|
} |
|
} |
|
diff --git a/sysdeps/unix/sysv/linux/mips/xstat.c b/sysdeps/unix/sysv/linux/mips/xstat.c |
|
index 9d810b6f653b964b..86f4dc31a82ff1bb 100644 |
|
--- a/sysdeps/unix/sysv/linux/mips/xstat.c |
|
+++ b/sysdeps/unix/sysv/linux/mips/xstat.c |
|
@@ -35,7 +35,9 @@ __xstat (int vers, const char *name, struct stat *buf) |
|
{ |
|
struct kernel_stat kbuf; |
|
int r = INTERNAL_SYSCALL_CALL (stat, name, &kbuf); |
|
- return r ?: __xstat_conv (vers, &kbuf, buf); |
|
+ if (r == 0) |
|
+ return __xstat_conv (vers, &kbuf, buf); |
|
+ return INLINE_SYSCALL_ERROR_RETURN_VALUE (-r); |
|
} |
|
} |
|
}
|
|
|