提交 c9ebff47 编写于 作者: R Rich Felker

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 94938920 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.
上级 a662220d
......@@ -2,6 +2,7 @@
#include <fcntl.h>
#include <errno.h>
#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)];
......
......@@ -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);
}
......
......@@ -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);
}
......
......@@ -2,10 +2,11 @@
#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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册