aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/fix-remaining-direct-use-of-stat-syscalls-outside.patch
blob: 12c68fd015b66a003fb35c25fb36b68c6edcae89 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
From c9ebff4736128186121424364c1c62224b02aee3 Mon Sep 17 00:00:00 2001
From: Rich Felker <dalias@aerifal.cx>
Date: Wed, 12 Feb 2020 17:23:29 -0500
Subject: 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.
---
 src/stat/fchmodat.c   | 3 ++-
 src/stdio/tempnam.c   | 5 +++--
 src/stdio/tmpnam.c    | 5 +++--
 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;
-- 
cgit v1.2.1