mirror of
https://git.musl-libc.org/git/musl
synced 2025-01-10 08:42:02 +03:00
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 9493892021
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.
This commit is contained in:
parent
a662220df5
commit
c9ebff4736
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user