diff options
-rw-r--r-- | meta/recipes-devtools/pseudo/files/pseudo-fchmodat-permissions.patch | 169 |
1 files changed, 163 insertions, 6 deletions
diff --git a/meta/recipes-devtools/pseudo/files/pseudo-fchmodat-permissions.patch b/meta/recipes-devtools/pseudo/files/pseudo-fchmodat-permissions.patch index 2bd2289372..7b1f82d577 100644 --- a/meta/recipes-devtools/pseudo/files/pseudo-fchmodat-permissions.patch +++ b/meta/recipes-devtools/pseudo/files/pseudo-fchmodat-permissions.patch | |||
@@ -1,4 +1,4 @@ | |||
1 | commit 5a6f2896ed44029ced2a33ac64c962737c5171a0 | 1 | commit 7e67d082737b3df4788caf85fedd607b3acd9786 |
2 | Author: Peter Seebach <peter.seebach@windriver.com> | 2 | Author: Peter Seebach <peter.seebach@windriver.com> |
3 | Date: Fri May 16 15:53:06 2014 -0500 | 3 | Date: Fri May 16 15:53:06 2014 -0500 |
4 | 4 | ||
@@ -11,18 +11,27 @@ Date: Fri May 16 15:53:06 2014 -0500 | |||
11 | AT_SYMLINK_NOFOLLOW by rejecting it if the host system does, | 11 | AT_SYMLINK_NOFOLLOW by rejecting it if the host system does, |
12 | to make GNU tar happier), also mask out write bits from filesystem | 12 | to make GNU tar happier), also mask out write bits from filesystem |
13 | modes to avoid security problems. | 13 | modes to avoid security problems. |
14 | |||
15 | Also start tracking umask so we can use the right modes for | ||
16 | open, mkdir, and mknod. | ||
14 | 17 | ||
15 | The 1.6 patches are: | 18 | The 1.6 patches are: |
16 | 19 | ||
17 | 87c53ea58befef48677846693aab445df1850e16 | 20 | 87c53ea58befef48677846693aab445df1850e16 |
18 | 3c716e0bab4f0cfe4be84caa9ce5fd5e3f5e2a23 | 21 | 3c716e0bab4f0cfe4be84caa9ce5fd5e3f5e2a23 |
19 | c98e4f43b5d6499748a5057134408f4ba4854fb4 | 22 | c98e4f43b5d6499748a5057134408f4ba4854fb4 |
23 | 2f71a021b725c1aa415439209a89327f0b997d02 | ||
24 | 14925786b55202d8147b0af719038e8a23ef73c0 | ||
20 | 25 | ||
21 | diff --git a/ChangeLog.txt b/ChangeLog.txt | 26 | diff --git a/ChangeLog.txt b/ChangeLog.txt |
22 | index 113f675..fab1033 100644 | 27 | index 113f675..cc966ce 100644 |
23 | --- a/ChangeLog.txt | 28 | --- a/ChangeLog.txt |
24 | +++ b/ChangeLog.txt | 29 | +++ b/ChangeLog.txt |
25 | @@ -1,3 +1,14 @@ | 30 | @@ -1,3 +1,18 @@ |
31 | +2014-05-27: | ||
32 | + * (seebs) start noticing umask, mask it out from open or mkdir | ||
33 | + calls rather than relying on underlying open/mkdir to do it. | ||
34 | + | ||
26 | +2014-05-16: | 35 | +2014-05-16: |
27 | + * (seebs) fchmodat: don't drop flags, report failures, to improve | 36 | + * (seebs) fchmodat: don't drop flags, report failures, to improve |
28 | + compatibility/consistency. Cache the knowledge that | 37 | + compatibility/consistency. Cache the knowledge that |
@@ -37,6 +46,60 @@ index 113f675..fab1033 100644 | |||
37 | 2013-02-27: | 46 | 2013-02-27: |
38 | * (seebs) Oh, hey, what if I took out my debug messages? | 47 | * (seebs) Oh, hey, what if I took out my debug messages? |
39 | * (seebs) update docs a bit to reduce bitrot | 48 | * (seebs) update docs a bit to reduce bitrot |
49 | diff --git a/makewrappers b/makewrappers | ||
50 | index e87cc56..0127766 100755 | ||
51 | --- a/makewrappers | ||
52 | +++ b/makewrappers | ||
53 | @@ -204,6 +204,7 @@ class Function: | ||
54 | 'uid_t': '0', | ||
55 | 'int': '-1', | ||
56 | 'long': '-1', | ||
57 | + 'mode_t': '0', | ||
58 | 'ssize_t': '-1' | ||
59 | } | ||
60 | |||
61 | diff --git a/ports/darwin/guts/open.c b/ports/darwin/guts/open.c | ||
62 | index c66cc15..520bb70 100644 | ||
63 | --- a/ports/darwin/guts/open.c | ||
64 | +++ b/ports/darwin/guts/open.c | ||
65 | @@ -9,6 +9,9 @@ | ||
66 | struct stat buf = { }; | ||
67 | int existed = 1; | ||
68 | int save_errno; | ||
69 | + | ||
70 | + /* mask out mode bits appropriately */ | ||
71 | + mode = mode & ~pseudo_umask; | ||
72 | #ifdef PSEUDO_FORCE_ASYNCH | ||
73 | flags &= ~O_SYNC; | ||
74 | #endif | ||
75 | diff --git a/ports/linux/guts/__xmknodat.c b/ports/linux/guts/__xmknodat.c | ||
76 | index 59b4f2f..0888b8a 100644 | ||
77 | --- a/ports/linux/guts/__xmknodat.c | ||
78 | +++ b/ports/linux/guts/__xmknodat.c | ||
79 | @@ -9,6 +9,9 @@ | ||
80 | pseudo_msg_t *msg; | ||
81 | struct stat64 buf; | ||
82 | |||
83 | + /* mask out mode bits appropriately */ | ||
84 | + mode = mode & ~pseudo_umask; | ||
85 | + | ||
86 | /* we don't use underlying call, so _ver is irrelevant to us */ | ||
87 | (void) ver; | ||
88 | |||
89 | diff --git a/ports/linux/guts/openat.c b/ports/linux/guts/openat.c | ||
90 | index 8460073..4053549 100644 | ||
91 | --- a/ports/linux/guts/openat.c | ||
92 | +++ b/ports/linux/guts/openat.c | ||
93 | @@ -10,6 +10,9 @@ | ||
94 | int existed = 1; | ||
95 | int save_errno; | ||
96 | |||
97 | + /* mask out mode bits appropriately */ | ||
98 | + mode = mode & ~pseudo_umask; | ||
99 | + | ||
100 | #ifdef PSEUDO_NO_REAL_AT_FUNCTIONS | ||
101 | if (dirfd != AT_FDCWD) { | ||
102 | errno = ENOSYS; | ||
40 | diff --git a/ports/unix/guts/fchmodat.c b/ports/unix/guts/fchmodat.c | 103 | diff --git a/ports/unix/guts/fchmodat.c b/ports/unix/guts/fchmodat.c |
41 | index 59a92ce..69a953c 100644 | 104 | index 59a92ce..69a953c 100644 |
42 | --- a/ports/unix/guts/fchmodat.c | 105 | --- a/ports/unix/guts/fchmodat.c |
@@ -92,16 +155,110 @@ index 59a92ce..69a953c 100644 | |||
92 | * may believe you are permitted to change modes that the filesystem | 155 | * may believe you are permitted to change modes that the filesystem |
93 | * doesn't. Note that we also don't need to know whether the | 156 | * doesn't. Note that we also don't need to know whether the |
94 | * file might be a (pseudo) block device or some such; pseudo | 157 | * file might be a (pseudo) block device or some such; pseudo |
158 | diff --git a/ports/unix/guts/mkdirat.c b/ports/unix/guts/mkdirat.c | ||
159 | index e846b70..e0b6af9 100644 | ||
160 | --- a/ports/unix/guts/mkdirat.c | ||
161 | +++ b/ports/unix/guts/mkdirat.c | ||
162 | @@ -6,11 +6,14 @@ | ||
163 | * wrap_mkdirat(int dirfd, const char *path, mode_t mode) { | ||
164 | * int rc = -1; | ||
165 | */ | ||
166 | + /* mask out mode bits appropriately */ | ||
167 | + mode = mode & ~pseudo_umask; | ||
168 | #ifdef PSEUDO_NO_REAL_AT_FUNCTIONS | ||
169 | if (dirfd != AT_FDCWD) { | ||
170 | errno = ENOSYS; | ||
171 | return -1; | ||
172 | } | ||
173 | + | ||
174 | rc = real_mkdir(path, PSEUDO_FS_MODE(mode, 1)); | ||
175 | #else | ||
176 | rc = real_mkdirat(dirfd, path, PSEUDO_FS_MODE(mode, 1)); | ||
177 | diff --git a/ports/unix/guts/mknodat.c b/ports/unix/guts/mknodat.c | ||
178 | index 6fd5b42..5d8d47c 100644 | ||
179 | --- a/ports/unix/guts/mknodat.c | ||
180 | +++ b/ports/unix/guts/mknodat.c | ||
181 | @@ -10,6 +10,9 @@ | ||
182 | PSEUDO_STATBUF buf; | ||
183 | int save_errno = errno; | ||
184 | |||
185 | + /* mask out mode bits appropriately */ | ||
186 | + mode = mode & ~pseudo_umask; | ||
187 | + | ||
188 | #ifdef PSEUDO_NO_REAL_AT_FUNCTIONS | ||
189 | if (dirfd != AT_FDCWD) { | ||
190 | errno = ENOSYS; | ||
191 | diff --git a/ports/unix/guts/umask.c b/ports/unix/guts/umask.c | ||
192 | new file mode 100644 | ||
193 | index 0000000..6b060d3 | ||
194 | --- /dev/null | ||
195 | +++ b/ports/unix/guts/umask.c | ||
196 | @@ -0,0 +1,14 @@ | ||
197 | +/* | ||
198 | + * Copyright (c) 2014 Wind River Systems; see | ||
199 | + * guts/COPYRIGHT for information. | ||
200 | + * | ||
201 | + * mode_t umask(mode_t mask) | ||
202 | + * mode_t rc = 0; | ||
203 | + */ | ||
204 | + | ||
205 | + pseudo_umask = mask; | ||
206 | + rc = real_umask(mask); | ||
207 | + | ||
208 | +/* return rc; | ||
209 | + * } | ||
210 | + */ | ||
211 | diff --git a/ports/unix/wrapfuncs.in b/ports/unix/wrapfuncs.in | ||
212 | index 8460a65..e0e9739 100644 | ||
213 | --- a/ports/unix/wrapfuncs.in | ||
214 | +++ b/ports/unix/wrapfuncs.in | ||
215 | @@ -67,3 +67,4 @@ void sync(void); /* async_skip= */ | ||
216 | int syncfs(int fd); /* async_skip=0 */ | ||
217 | int sync_file_range(int fd, off64_t offset, off64_t nbytes, unsigned int flags); /* async_skip=0 */ | ||
218 | int msync(void *addr, size_t length, int flags); /* async_skip=0 */ | ||
219 | +mode_t umask(mode_t mask); | ||
220 | diff --git a/pseudo_client.c b/pseudo_client.c | ||
221 | index b6d11a6..535c810 100644 | ||
222 | --- a/pseudo_client.c | ||
223 | +++ b/pseudo_client.c | ||
224 | @@ -71,6 +71,8 @@ int pseudo_disabled = 0; | ||
225 | int pseudo_allow_fsync = 0; | ||
226 | static int pseudo_local_only = 0; | ||
227 | |||
228 | +int pseudo_umask = 022; | ||
229 | + | ||
230 | static char **fd_paths = NULL; | ||
231 | static int nfds = 0; | ||
232 | static int messages = 0; | ||
233 | @@ -219,6 +221,9 @@ pseudo_init_client(void) { | ||
234 | if (!pseudo_disabled && !pseudo_inited) { | ||
235 | char *pseudo_path = 0; | ||
236 | |||
237 | + pseudo_umask = umask(022); | ||
238 | + umask(pseudo_umask); | ||
239 | + | ||
240 | pseudo_path = pseudo_prefix_path(NULL); | ||
241 | if (pseudo_prefix_dir_fd == -1) { | ||
242 | if (pseudo_path) { | ||
95 | diff --git a/pseudo_client.h b/pseudo_client.h | 243 | diff --git a/pseudo_client.h b/pseudo_client.h |
96 | index f36a772..ecb13a6 100644 | 244 | index f36a772..5bf820e 100644 |
97 | --- a/pseudo_client.h | 245 | --- a/pseudo_client.h |
98 | +++ b/pseudo_client.h | 246 | +++ b/pseudo_client.h |
99 | @@ -85,6 +85,6 @@ extern int pseudo_nosymlinkexp; | 247 | @@ -72,6 +72,8 @@ extern char *pseudo_passwd; |
248 | extern size_t pseudo_chroot_len; | ||
249 | extern int pseudo_nosymlinkexp; | ||
250 | |||
251 | +extern int pseudo_umask; | ||
252 | + | ||
253 | /* Root can read and write files, and enter directories which have no | ||
254 | * read, write, or execute permissions. (But can't execute files without | ||
255 | * execute permissions!) | ||
256 | @@ -85,6 +87,6 @@ extern int pseudo_nosymlinkexp; | ||
100 | * None of this will behave very sensibly if umask has 0700 bits in it; | 257 | * None of this will behave very sensibly if umask has 0700 bits in it; |
101 | * this is a known limitation. | 258 | * this is a known limitation. |
102 | */ | 259 | */ |
103 | -#define PSEUDO_FS_MODE(mode, isdir) ((mode) | S_IRUSR | S_IWUSR | ((isdir) ? S_IXUSR : 0)) | 260 | -#define PSEUDO_FS_MODE(mode, isdir) ((mode) | S_IRUSR | S_IWUSR | ((isdir) ? S_IXUSR : 0)) |
104 | -#define PSEUDO_DB_MODE(fs_mode, user_mode) (((fs_mode) & ~0700) | ((user_mode & 0700))) | 261 | -#define PSEUDO_DB_MODE(fs_mode, user_mode) (((fs_mode) & ~0700) | ((user_mode & 0700))) |
105 | +#define PSEUDO_FS_MODE(mode, isdir) ((((mode) | S_IRUSR | S_IWUSR | ((isdir) ? S_IXUSR : 0)) & ~(S_IWGRP | S_IWOTH)) & ~(S_IWOTH | S_IWGRP)) | 262 | +#define PSEUDO_FS_MODE(mode, isdir) (((mode) | S_IRUSR | S_IWUSR | ((isdir) ? S_IXUSR : 0)) & ~(S_IWGRP | S_IWOTH)) |
106 | +#define PSEUDO_DB_MODE(fs_mode, user_mode) (((fs_mode) & ~0722) | ((user_mode & 0722))) | 263 | +#define PSEUDO_DB_MODE(fs_mode, user_mode) (((fs_mode) & ~0722) | ((user_mode & 0722))) |
107 | 264 | ||