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.
#include <fcntl.h>
#include <errno.h>
#include "syscall.h"
+#include "kstat.h"
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)];
#include <string.h>
#include <stdlib.h>
#include "syscall.h"
+#include "kstat.h"
#define MAXTRIES 100
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);
}
#include <string.h>
#include <stdlib.h>
#include "syscall.h"
+#include "kstat.h"
#define MAXTRIES 100
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);
}
#include <fcntl.h>
#include <sys/stat.h>
#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;