summaryrefslogtreecommitdiff
path: root/src/stdio
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2020-02-12 17:23:29 -0500
committerRich Felker <dalias@aerifal.cx>2020-02-12 17:34:17 -0500
commitc9ebff4736128186121424364c1c62224b02aee3 (patch)
treeb139c394ce0831b1e933ae51f89c0ab33582fb22 /src/stdio
parenta662220df547e5c2446518e74440a7d834f9ebe6 (diff)
downloadmusl-c9ebff4736128186121424364c1c62224b02aee3.tar.gz
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.
Diffstat (limited to 'src/stdio')
-rw-r--r--src/stdio/tempnam.c5
-rw-r--r--src/stdio/tmpnam.c5
2 files changed, 6 insertions, 4 deletions
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 <string.h>
#include <stdlib.h>
#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<MAXTRIES; try++) {
__randname(s+l-6);
#ifdef SYS_lstat
- r = __syscall(SYS_lstat, s, &(struct stat){0});
+ r = __syscall(SYS_lstat, s, &(struct kstat){0});
#else
r = __syscall(SYS_fstatat, AT_FDCWD, s,
- &(struct stat){0}, AT_SYMLINK_NOFOLLOW);
+ &(struct kstat){0}, AT_SYMLINK_NOFOLLOW);
#endif
if (r == -ENOENT) return strdup(s);
}
diff --git a/src/stdio/tmpnam.c b/src/stdio/tmpnam.c
index 6c7c253a..d667a836 100644
--- a/src/stdio/tmpnam.c
+++ b/src/stdio/tmpnam.c
@@ -5,6 +5,7 @@
#include <string.h>
#include <stdlib.h>
#include "syscall.h"
+#include "kstat.h"
#define MAXTRIES 100
@@ -17,10 +18,10 @@ char *tmpnam(char *buf)
for (try=0; try<MAXTRIES; try++) {
__randname(s+12);
#ifdef SYS_lstat
- r = __syscall(SYS_lstat, s, &(struct stat){0});
+ r = __syscall(SYS_lstat, s, &(struct kstat){0});
#else
r = __syscall(SYS_fstatat, AT_FDCWD, s,
- &(struct stat){0}, AT_SYMLINK_NOFOLLOW);
+ &(struct kstat){0}, AT_SYMLINK_NOFOLLOW);
#endif
if (r == -ENOENT) return strcpy(buf ? buf : internal, s);
}