diff options
| author | Rich Felker <dalias@aerifal.cx> | 2020-02-12 17:23:29 -0500 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2020-02-12 17:34:17 -0500 | 
| commit | c9ebff4736128186121424364c1c62224b02aee3 (patch) | |
| tree | b139c394ce0831b1e933ae51f89c0ab33582fb22 /src | |
| parent | a662220df547e5c2446518e74440a7d834f9ebe6 (diff) | |
| download | musl-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')
| -rw-r--r-- | src/stat/fchmodat.c | 3 | ||||
| -rw-r--r-- | src/stdio/tempnam.c | 5 | ||||
| -rw-r--r-- | src/stdio/tmpnam.c | 5 | ||||
| -rw-r--r-- | 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 <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)]; 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);  	} diff --git a/src/time/__map_file.c b/src/time/__map_file.c index 9d376222..d3cefa82 100644 --- a/src/time/__map_file.c +++ b/src/time/__map_file.c @@ -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;  | 
