From c9ebff4736128186121424364c1c62224b02aee3 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Wed, 12 Feb 2020 17:23:29 -0500 Subject: [PATCH] fix remaining direct use of stat syscalls outside fstatat.c because struct stat is no longer assumed to correspond to the structure used by the stat-family syscalls, it's not valid to make any of these syscalls directly using a buffer of type struct stat. commit 9493892021eac4edf1776d945bcdd3f7a96f6978 moved all logic around this change for stat-family functions into fstatat.c, making the others wrappers for it. but a few other direct uses of the syscall were overlooked. the ones in tmpnam/tempnam are harmless since the syscalls are just used to test for file existence. however, the uses in fchmodat and __map_file depend on getting accurate file properties, and these functions may actually have been broken one or more mips variants due to removal of conversion hacks from syscall_arch.h. as a low-risk fix, simply use struct kstat in place of struct stat in the affected places. --- src/stat/fchmodat.c | 3 ++- src/stdio/tempnam.c | 5 +++-- src/stdio/tmpnam.c | 5 +++-- src/time/__map_file.c | 3 ++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/stat/fchmodat.c b/src/stat/fchmodat.c index be61bdf3..4ee00b0a 100644 --- a/src/stat/fchmodat.c +++ b/src/stat/fchmodat.c @@ -2,6 +2,7 @@ #include #include #include "syscall.h" +#include "kstat.h" int fchmodat(int fd, const char *path, mode_t mode, int flag) { @@ -10,7 +11,7 @@ int fchmodat(int fd, const char *path, mode_t mode, int flag) if (flag != AT_SYMLINK_NOFOLLOW) return __syscall_ret(-EINVAL); - struct stat st; + struct kstat st; int ret, fd2; char proc[15+3*sizeof(int)]; diff --git a/src/stdio/tempnam.c b/src/stdio/tempnam.c index 84f91978..565df6b6 100644 --- a/src/stdio/tempnam.c +++ b/src/stdio/tempnam.c @@ -6,6 +6,7 @@ #include #include #include "syscall.h" +#include "kstat.h" #define MAXTRIES 100 @@ -37,10 +38,10 @@ char *tempnam(const char *dir, const char *pfx) for (try=0; try #include #include "syscall.h" +#include "kstat.h" #define MAXTRIES 100 @@ -17,10 +18,10 @@ char *tmpnam(char *buf) for (try=0; try #include #include "syscall.h" +#include "kstat.h" const char unsigned *__map_file(const char *pathname, size_t *size) { - struct stat st; + struct kstat st; const unsigned char *map = MAP_FAILED; int fd = sys_open(pathname, O_RDONLY|O_CLOEXEC|O_NONBLOCK); if (fd < 0) return 0; -- 2.25.1