Branch data Line data Source code
1 : : /*
2 : : * linux/fs/open.c
3 : : *
4 : : * Copyright (C) 1991, 1992 Linus Torvalds
5 : : */
6 : :
7 : : #include <linux/string.h>
8 : : #include <linux/mm.h>
9 : : #include <linux/file.h>
10 : : #include <linux/fdtable.h>
11 : : #include <linux/fsnotify.h>
12 : : #include <linux/module.h>
13 : : #include <linux/tty.h>
14 : : #include <linux/namei.h>
15 : : #include <linux/backing-dev.h>
16 : : #include <linux/capability.h>
17 : : #include <linux/securebits.h>
18 : : #include <linux/security.h>
19 : : #include <linux/mount.h>
20 : : #include <linux/fcntl.h>
21 : : #include <linux/slab.h>
22 : : #include <asm/uaccess.h>
23 : : #include <linux/fs.h>
24 : : #include <linux/personality.h>
25 : : #include <linux/pagemap.h>
26 : : #include <linux/syscalls.h>
27 : : #include <linux/rcupdate.h>
28 : : #include <linux/audit.h>
29 : : #include <linux/falloc.h>
30 : : #include <linux/fs_struct.h>
31 : : #include <linux/ima.h>
32 : : #include <linux/dnotify.h>
33 : : #include <linux/compat.h>
34 : :
35 : : #include "internal.h"
36 : :
37 : 0 : int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
38 : : struct file *filp)
39 : : {
40 : : int ret;
41 : : struct iattr newattrs;
42 : :
43 : : /* Not pretty: "inode->i_size" shouldn't really be signed. But it is. */
44 [ + - ]: 35597 : if (length < 0)
45 : : return -EINVAL;
46 : :
47 : 35597 : newattrs.ia_size = length;
48 : 35597 : newattrs.ia_valid = ATTR_SIZE | time_attrs;
49 [ + + ]: 35597 : if (filp) {
50 : 33907 : newattrs.ia_file = filp;
51 : 33907 : newattrs.ia_valid |= ATTR_FILE;
52 : : }
53 : :
54 : : /* Remove suid/sgid on truncate too */
55 : 35597 : ret = should_remove_suid(dentry);
56 [ - + ]: 35597 : if (ret)
57 : 0 : newattrs.ia_valid |= ret | ATTR_FORCE;
58 : :
59 : 35597 : mutex_lock(&dentry->d_inode->i_mutex);
60 : : /* Note any delegations or leases have already been broken: */
61 : 35598 : ret = notify_change(dentry, &newattrs, NULL);
62 : 35598 : mutex_unlock(&dentry->d_inode->i_mutex);
63 : 35599 : return ret;
64 : : }
65 : :
66 : 0 : long vfs_truncate(struct path *path, loff_t length)
67 : : {
68 : : struct inode *inode;
69 : : long error;
70 : :
71 : 1695 : inode = path->dentry->d_inode;
72 : :
73 : : /* For directories it's -EISDIR, for other non-regulars - -EINVAL */
74 [ + + ]: 1695 : if (S_ISDIR(inode->i_mode))
75 : : return -EISDIR;
76 [ + + ]: 1694 : if (!S_ISREG(inode->i_mode))
77 : : return -EINVAL;
78 : :
79 : 1693 : error = mnt_want_write(path->mnt);
80 [ + + ]: 1694 : if (error)
81 : : goto out;
82 : :
83 : 1692 : error = inode_permission(inode, MAY_WRITE);
84 [ + + ]: 1694 : if (error)
85 : : goto mnt_drop_write_and_out;
86 : :
87 : : error = -EPERM;
88 [ + + ]: 1692 : if (IS_APPEND(inode))
89 : : goto mnt_drop_write_and_out;
90 : :
91 : : error = get_write_access(inode);
92 [ + ]: 1689 : if (error)
93 : : goto mnt_drop_write_and_out;
94 : :
95 : : /*
96 : : * Make sure that there are no leases. get_write_access() protects
97 : : * against the truncate racing with a lease-granting setlease().
98 : : */
99 : : error = break_lease(inode, O_WRONLY);
100 [ + - ]: 1692 : if (error)
101 : : goto put_write_and_out;
102 : :
103 : : error = locks_verify_truncate(inode, NULL, length);
104 [ + - ]: 1692 : if (!error)
105 : 1692 : error = security_path_truncate(path);
106 [ + - ]: 1692 : if (!error)
107 : 1692 : error = do_truncate(path->dentry, length, 0, NULL);
108 : :
109 : : put_write_and_out:
110 : : put_write_access(inode);
111 : : mnt_drop_write_and_out:
112 : 1693 : mnt_drop_write(path->mnt);
113 : : out:
114 : 1694 : return error;
115 : : }
116 : : EXPORT_SYMBOL_GPL(vfs_truncate);
117 : :
118 : 0 : static long do_sys_truncate(const char __user *pathname, loff_t length)
119 : : {
120 : : unsigned int lookup_flags = LOOKUP_FOLLOW;
121 : : struct path path;
122 : : int error;
123 : :
124 [ + ]: 1705 : if (length < 0) /* sorry, but loff_t says... */
125 : : return -EINVAL;
126 : :
127 : : retry:
128 : 1706 : error = user_path_at(AT_FDCWD, pathname, lookup_flags, &path);
129 [ + + ]: 1706 : if (!error) {
130 : 1696 : error = vfs_truncate(&path, length);
131 : 1696 : path_put(&path);
132 : : }
133 [ - + ]: 1706 : if (retry_estale(error, lookup_flags)) {
134 : : lookup_flags |= LOOKUP_REVAL;
135 : : goto retry;
136 : : }
137 : : return error;
138 : : }
139 : :
140 : 0 : SYSCALL_DEFINE2(truncate, const char __user *, path, long, length)
141 : : {
142 : 1686 : return do_sys_truncate(path, length);
143 : : }
144 : :
145 : : #ifdef CONFIG_COMPAT
146 : : COMPAT_SYSCALL_DEFINE2(truncate, const char __user *, path, compat_off_t, length)
147 : : {
148 : : return do_sys_truncate(path, length);
149 : : }
150 : : #endif
151 : :
152 : 0 : static long do_sys_ftruncate(unsigned int fd, loff_t length, int small)
153 : : {
154 : : struct inode *inode;
155 : : struct dentry *dentry;
156 : : struct fd f;
157 : : int error;
158 : :
159 : : error = -EINVAL;
160 [ + - ]: 28968 : if (length < 0)
161 : : goto out;
162 : : error = -EBADF;
163 : : f = fdget(fd);
164 [ + + ]: 28967 : if (!f.file)
165 : : goto out;
166 : :
167 : : /* explicitly opened as large or we are on 64-bit box */
168 [ + + ]: 28965 : if (f.file->f_flags & O_LARGEFILE)
169 : : small = 0;
170 : :
171 : 28965 : dentry = f.file->f_path.dentry;
172 : 28965 : inode = dentry->d_inode;
173 : : error = -EINVAL;
174 [ + + ][ + + ]: 28965 : if (!S_ISREG(inode->i_mode) || !(f.file->f_mode & FMODE_WRITE))
175 : : goto out_putf;
176 : :
177 : : error = -EINVAL;
178 : : /* Cannot ftruncate over 2^31 bytes without large file support */
179 [ + + ]: 28962 : if (small && length > MAX_NON_LFS)
180 : : goto out_putf;
181 : :
182 : : error = -EPERM;
183 [ + ]: 28960 : if (IS_APPEND(inode))
184 : : goto out_putf;
185 : :
186 : 28962 : sb_start_write(inode->i_sb);
187 : : error = locks_verify_truncate(inode, f.file, length);
188 [ + + ]: 57929 : if (!error)
189 : 28940 : error = security_path_truncate(&f.file->f_path);
190 [ + + ]: 28960 : if (!error)
191 : 28940 : error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, f.file);
192 : 28961 : sb_end_write(inode->i_sb);
193 : : out_putf:
194 : : fdput(f);
195 : : out:
196 : 28968 : return error;
197 : : }
198 : :
199 : 0 : SYSCALL_DEFINE2(ftruncate, unsigned int, fd, unsigned long, length)
200 : : {
201 : 28811 : return do_sys_ftruncate(fd, length, 1);
202 : : }
203 : :
204 : : #ifdef CONFIG_COMPAT
205 : : COMPAT_SYSCALL_DEFINE2(ftruncate, unsigned int, fd, compat_ulong_t, length)
206 : : {
207 : : return do_sys_ftruncate(fd, length, 1);
208 : : }
209 : : #endif
210 : :
211 : : /* LFS versions of truncate are only needed on 32 bit machines */
212 : : #if BITS_PER_LONG == 32
213 : 0 : SYSCALL_DEFINE2(truncate64, const char __user *, path, loff_t, length)
214 : : {
215 : 20 : return do_sys_truncate(path, length);
216 : : }
217 : :
218 : 0 : SYSCALL_DEFINE2(ftruncate64, unsigned int, fd, loff_t, length)
219 : : {
220 : 157 : return do_sys_ftruncate(fd, length, 0);
221 : : }
222 : : #endif /* BITS_PER_LONG == 32 */
223 : :
224 : :
225 : 0 : int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
226 : : {
227 : : struct inode *inode = file_inode(file);
228 : : long ret;
229 : :
230 [ + + ]: 22 : if (offset < 0 || len <= 0)
231 : : return -EINVAL;
232 : :
233 : : /* Return error if mode is not supported */
234 [ + - ]: 17 : if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE))
235 : : return -EOPNOTSUPP;
236 : :
237 : : /* Punch hole must have keep size set */
238 [ + - ]: 17 : if ((mode & FALLOC_FL_PUNCH_HOLE) &&
239 : : !(mode & FALLOC_FL_KEEP_SIZE))
240 : : return -EOPNOTSUPP;
241 : :
242 [ + + ]: 17 : if (!(file->f_mode & FMODE_WRITE))
243 : : return -EBADF;
244 : :
245 : : /* It's not possible punch hole on append only file */
246 [ + + ][ + - ]: 16 : if (mode & FALLOC_FL_PUNCH_HOLE && IS_APPEND(inode))
247 : : return -EPERM;
248 : :
249 [ + - ]: 16 : if (IS_IMMUTABLE(inode))
250 : : return -EPERM;
251 : :
252 : : /*
253 : : * Revalidate the write permissions, in case security policy has
254 : : * changed since the files were opened.
255 : : */
256 : 16 : ret = security_file_permission(file, MAY_WRITE);
257 [ + - ]: 16 : if (ret)
258 : : return ret;
259 : :
260 [ + - ]: 16 : if (S_ISFIFO(inode->i_mode))
261 : : return -ESPIPE;
262 : :
263 : : /*
264 : : * Let individual file system decide if it supports preallocation
265 : : * for directories or not.
266 : : */
267 [ + - ]: 16 : if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode))
268 : : return -ENODEV;
269 : :
270 : : /* Check for wrap through zero too */
271 [ + - ][ + + ]: 16 : if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0))
272 : : return -EFBIG;
273 : :
274 [ + - ]: 14 : if (!file->f_op->fallocate)
275 : : return -EOPNOTSUPP;
276 : :
277 : : sb_start_write(inode->i_sb);
278 : 14 : ret = file->f_op->fallocate(file, mode, offset, len);
279 : 14 : sb_end_write(inode->i_sb);
280 : 14 : return ret;
281 : : }
282 : :
283 : 0 : SYSCALL_DEFINE4(fallocate, int, fd, int, mode, loff_t, offset, loff_t, len)
284 : : {
285 : 21 : struct fd f = fdget(fd);
286 : : int error = -EBADF;
287 : :
288 [ + - ]: 21 : if (f.file) {
289 : 21 : error = do_fallocate(f.file, mode, offset, len);
290 : : fdput(f);
291 : : }
292 : : return error;
293 : : }
294 : :
295 : : /*
296 : : * access() needs to use the real uid/gid, not the effective uid/gid.
297 : : * We do this by temporarily clearing all FS-related capabilities and
298 : : * switching the fsuid/fsgid around to the real ones.
299 : : */
300 : 0 : SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode)
301 : : {
302 : : const struct cred *old_cred;
303 : : struct cred *override_cred;
304 : : struct path path;
305 : : struct inode *inode;
306 : : int res;
307 : : unsigned int lookup_flags = LOOKUP_FOLLOW;
308 : :
309 [ + + ]: 290728 : if (mode & ~S_IRWXO) /* where's F_OK, X_OK, W_OK, R_OK? */
310 : : return -EINVAL;
311 : :
312 : 290727 : override_cred = prepare_creds();
313 [ + ]: 290729 : if (!override_cred)
314 : : return -ENOMEM;
315 : :
316 : 290731 : override_cred->fsuid = override_cred->uid;
317 : 290731 : override_cred->fsgid = override_cred->gid;
318 : :
319 [ + + ]: 290731 : if (!issecure(SECURE_NO_SETUID_FIXUP)) {
320 : : /* Clear the capabilities if we switch to a non-root user */
321 : : kuid_t root_uid = make_kuid(override_cred->user_ns, 0);
322 [ + + ]: 290728 : if (!uid_eq(override_cred->uid, root_uid))
323 : 1135 : cap_clear(override_cred->cap_effective);
324 : : else
325 : 289593 : override_cred->cap_effective =
326 : : override_cred->cap_permitted;
327 : : }
328 : :
329 : 290731 : old_cred = override_creds(override_cred);
330 : : retry:
331 : 290731 : res = user_path_at(dfd, filename, lookup_flags, &path);
332 [ + + ]: 290733 : if (res)
333 : : goto out;
334 : :
335 : 40569 : inode = path.dentry->d_inode;
336 : :
337 [ + + ][ + + ]: 40569 : if ((mode & MAY_EXEC) && S_ISREG(inode->i_mode)) {
338 : : /*
339 : : * MAY_EXEC on regular files is denied if the fs is mounted
340 : : * with the "noexec" flag.
341 : : */
342 : : res = -EACCES;
343 [ + - ]: 18253 : if (path.mnt->mnt_flags & MNT_NOEXEC)
344 : : goto out_path_release;
345 : : }
346 : :
347 : 40569 : res = inode_permission(inode, mode | MAY_ACCESS);
348 : : /* SuS v2 requires we report a read only fs too */
349 [ + + ][ + + ]: 40569 : if (res || !(mode & S_IWOTH) || special_file(inode->i_mode))
[ + + ][ + - ]
[ + - ]
350 : : goto out_path_release;
351 : : /*
352 : : * This is a rare case where using __mnt_is_readonly()
353 : : * is OK without a mnt_want/drop_write() pair. Since
354 : : * no actual write to the fs is performed here, we do
355 : : * not need to telegraph to that to anyone.
356 : : *
357 : : * By doing this, we accept that this access is
358 : : * inherently racy and know that the fs may change
359 : : * state before we even see this result.
360 : : */
361 [ - + ]: 1568 : if (__mnt_is_readonly(path.mnt))
362 : : res = -EROFS;
363 : :
364 : : out_path_release:
365 : 40569 : path_put(&path);
366 [ - + ]: 40569 : if (retry_estale(res, lookup_flags)) {
367 : : lookup_flags |= LOOKUP_REVAL;
368 : : goto retry;
369 : : }
370 : : out:
371 : 290733 : revert_creds(old_cred);
372 : : put_cred(override_cred);
373 : : return res;
374 : : }
375 : :
376 : 0 : SYSCALL_DEFINE2(access, const char __user *, filename, int, mode)
377 : : {
378 : 289797 : return sys_faccessat(AT_FDCWD, filename, mode);
379 : : }
380 : :
381 : 13175 : SYSCALL_DEFINE1(chdir, const char __user *, filename)
382 : : {
383 : : struct path path;
384 : : int error;
385 : : unsigned int lookup_flags = LOOKUP_FOLLOW | LOOKUP_DIRECTORY;
386 : : retry:
387 : 13175 : error = user_path_at(AT_FDCWD, filename, lookup_flags, &path);
388 [ + + ]: 13175 : if (error)
389 : : goto out;
390 : :
391 : 13115 : error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR);
392 [ + + ]: 13115 : if (error)
393 : : goto dput_and_out;
394 : :
395 : 13114 : set_fs_pwd(current->fs, &path);
396 : :
397 : : dput_and_out:
398 : 13115 : path_put(&path);
399 [ - + ]: 13114 : if (retry_estale(error, lookup_flags)) {
400 : : lookup_flags |= LOOKUP_REVAL;
401 : : goto retry;
402 : : }
403 : : out:
404 : : return error;
405 : : }
406 : :
407 : 0 : SYSCALL_DEFINE1(fchdir, unsigned int, fd)
408 : : {
409 : : struct fd f = fdget_raw(fd);
410 : : struct inode *inode;
411 : : int error = -EBADF;
412 : :
413 : : error = -EBADF;
414 [ + + ]: 23742 : if (!f.file)
415 : : goto out;
416 : :
417 : : inode = file_inode(f.file);
418 : :
419 : : error = -ENOTDIR;
420 [ + - ]: 23741 : if (!S_ISDIR(inode->i_mode))
421 : : goto out_putf;
422 : :
423 : 23741 : error = inode_permission(inode, MAY_EXEC | MAY_CHDIR);
424 [ + + ]: 23741 : if (!error)
425 : 23740 : set_fs_pwd(current->fs, &f.file->f_path);
426 : : out_putf:
427 : : fdput(f);
428 : : out:
429 : : return error;
430 : : }
431 : :
432 : 11 : SYSCALL_DEFINE1(chroot, const char __user *, filename)
433 : : {
434 : : struct path path;
435 : : int error;
436 : : unsigned int lookup_flags = LOOKUP_FOLLOW | LOOKUP_DIRECTORY;
437 : : retry:
438 : 11 : error = user_path_at(AT_FDCWD, filename, lookup_flags, &path);
439 [ + + ]: 11 : if (error)
440 : : goto out;
441 : :
442 : 6 : error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR);
443 [ + + ]: 6 : if (error)
444 : : goto dput_and_out;
445 : :
446 : : error = -EPERM;
447 [ + + ]: 5 : if (!ns_capable(current_user_ns(), CAP_SYS_CHROOT))
448 : : goto dput_and_out;
449 : 4 : error = security_path_chroot(&path);
450 [ + - ]: 4 : if (error)
451 : : goto dput_and_out;
452 : :
453 : 4 : set_fs_root(current->fs, &path);
454 : : error = 0;
455 : : dput_and_out:
456 : 6 : path_put(&path);
457 [ - + ]: 6 : if (retry_estale(error, lookup_flags)) {
458 : : lookup_flags |= LOOKUP_REVAL;
459 : : goto retry;
460 : : }
461 : : out:
462 : : return error;
463 : : }
464 : :
465 : 0 : static int chmod_common(struct path *path, umode_t mode)
466 : : {
467 : 12884 : struct inode *inode = path->dentry->d_inode;
468 : 12884 : struct inode *delegated_inode = NULL;
469 : : struct iattr newattrs;
470 : : int error;
471 : :
472 : 12884 : error = mnt_want_write(path->mnt);
473 [ + - ]: 12884 : if (error)
474 : : return error;
475 : : retry_deleg:
476 : 12884 : mutex_lock(&inode->i_mutex);
477 : 12884 : error = security_path_chmod(path, mode);
478 [ + - ]: 12884 : if (error)
479 : : goto out_unlock;
480 : 12884 : newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
481 : 12884 : newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
482 : 12884 : error = notify_change(path->dentry, &newattrs, &delegated_inode);
483 : : out_unlock:
484 : 12884 : mutex_unlock(&inode->i_mutex);
485 [ - + ]: 12884 : if (delegated_inode) {
486 : : error = break_deleg_wait(&delegated_inode);
487 [ # # ]: 0 : if (!error)
488 : : goto retry_deleg;
489 : : }
490 : 12884 : mnt_drop_write(path->mnt);
491 : 12884 : return error;
492 : : }
493 : :
494 : 0 : SYSCALL_DEFINE2(fchmod, unsigned int, fd, umode_t, mode)
495 : : {
496 : : struct fd f = fdget(fd);
497 : : int err = -EBADF;
498 : :
499 [ + - ]: 5804 : if (f.file) {
500 : 5804 : audit_inode(NULL, f.file->f_path.dentry, 0);
501 : 5804 : err = chmod_common(&f.file->f_path, mode);
502 : : fdput(f);
503 : : }
504 : : return err;
505 : : }
506 : :
507 : 7125 : SYSCALL_DEFINE3(fchmodat, int, dfd, const char __user *, filename, umode_t, mode)
508 : : {
509 : : struct path path;
510 : : int error;
511 : : unsigned int lookup_flags = LOOKUP_FOLLOW;
512 : : retry:
513 : 7125 : error = user_path_at(dfd, filename, lookup_flags, &path);
514 [ + + ]: 7125 : if (!error) {
515 : 7080 : error = chmod_common(&path, mode);
516 : 7080 : path_put(&path);
517 [ - ]: 7080 : if (retry_estale(error, lookup_flags)) {
518 : : lookup_flags |= LOOKUP_REVAL;
519 : : goto retry;
520 : : }
521 : : }
522 : : return error;
523 : : }
524 : :
525 : 0 : SYSCALL_DEFINE2(chmod, const char __user *, filename, umode_t, mode)
526 : : {
527 : 6826 : return sys_fchmodat(AT_FDCWD, filename, mode);
528 : : }
529 : :
530 : 0 : static int chown_common(struct path *path, uid_t user, gid_t group)
531 : : {
532 : 6267 : struct inode *inode = path->dentry->d_inode;
533 : 6267 : struct inode *delegated_inode = NULL;
534 : : int error;
535 : : struct iattr newattrs;
536 : : kuid_t uid;
537 : : kgid_t gid;
538 : :
539 : : uid = make_kuid(current_user_ns(), user);
540 : : gid = make_kgid(current_user_ns(), group);
541 : :
542 : 6267 : newattrs.ia_valid = ATTR_CTIME;
543 [ + + ]: 6267 : if (user != (uid_t) -1) {
544 [ + - ]: 5509 : if (!uid_valid(uid))
545 : : return -EINVAL;
546 : 5509 : newattrs.ia_valid |= ATTR_UID;
547 : 5509 : newattrs.ia_uid = uid;
548 : : }
549 [ + + ]: 6267 : if (group != (gid_t) -1) {
550 [ + - ]: 6229 : if (!gid_valid(gid))
551 : : return -EINVAL;
552 : 6229 : newattrs.ia_valid |= ATTR_GID;
553 : 6229 : newattrs.ia_gid = gid;
554 : : }
555 [ + + ]: 6267 : if (!S_ISDIR(inode->i_mode))
556 : 6267 : newattrs.ia_valid |=
557 : : ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV;
558 : : retry_deleg:
559 : 6267 : mutex_lock(&inode->i_mutex);
560 : 6267 : error = security_path_chown(path, uid, gid);
561 [ + ]: 6266 : if (!error)
562 : 6267 : error = notify_change(path->dentry, &newattrs, &delegated_inode);
563 : 6266 : mutex_unlock(&inode->i_mutex);
564 [ - + ]: 12534 : if (delegated_inode) {
565 : : error = break_deleg_wait(&delegated_inode);
566 [ # # ]: 0 : if (!error)
567 : : goto retry_deleg;
568 : : }
569 : 6267 : return error;
570 : : }
571 : :
572 : 0 : SYSCALL_DEFINE5(fchownat, int, dfd, const char __user *, filename, uid_t, user,
573 : : gid_t, group, int, flag)
574 : : {
575 : : struct path path;
576 : : int error = -EINVAL;
577 : : int lookup_flags;
578 : :
579 [ + + ]: 1572 : if ((flag & ~(AT_SYMLINK_NOFOLLOW | AT_EMPTY_PATH)) != 0)
580 : : goto out;
581 : :
582 : 1571 : lookup_flags = (flag & AT_SYMLINK_NOFOLLOW) ? 0 : LOOKUP_FOLLOW;
583 [ - + ]: 1571 : if (flag & AT_EMPTY_PATH)
584 : 1571 : lookup_flags |= LOOKUP_EMPTY;
585 : : retry:
586 : 1571 : error = user_path_at(dfd, filename, lookup_flags, &path);
587 [ + + ]: 1571 : if (error)
588 : : goto out;
589 : 1518 : error = mnt_want_write(path.mnt);
590 [ + - ]: 1518 : if (error)
591 : : goto out_release;
592 : 1518 : error = chown_common(&path, user, group);
593 : 1518 : mnt_drop_write(path.mnt);
594 : : out_release:
595 : 1518 : path_put(&path);
596 [ - + ]: 1518 : if (retry_estale(error, lookup_flags)) {
597 : 0 : lookup_flags |= LOOKUP_REVAL;
598 : : goto retry;
599 : : }
600 : : out:
601 : : return error;
602 : : }
603 : :
604 : 0 : SYSCALL_DEFINE3(chown, const char __user *, filename, uid_t, user, gid_t, group)
605 : : {
606 : 1291 : return sys_fchownat(AT_FDCWD, filename, user, group, 0);
607 : : }
608 : :
609 : 0 : SYSCALL_DEFINE3(lchown, const char __user *, filename, uid_t, user, gid_t, group)
610 : : {
611 : 55 : return sys_fchownat(AT_FDCWD, filename, user, group,
612 : : AT_SYMLINK_NOFOLLOW);
613 : : }
614 : :
615 : 0 : SYSCALL_DEFINE3(fchown, unsigned int, fd, uid_t, user, gid_t, group)
616 : : {
617 : : struct fd f = fdget(fd);
618 : : int error = -EBADF;
619 : :
620 [ + + ]: 4751 : if (!f.file)
621 : : goto out;
622 : :
623 : 4749 : error = mnt_want_write_file(f.file);
624 [ + - ]: 4749 : if (error)
625 : : goto out_fput;
626 : 4749 : audit_inode(NULL, f.file->f_path.dentry, 0);
627 : 4749 : error = chown_common(&f.file->f_path, user, group);
628 : 4749 : mnt_drop_write_file(f.file);
629 : : out_fput:
630 : : fdput(f);
631 : : out:
632 : : return error;
633 : : }
634 : :
635 : : /*
636 : : * You have to be very careful that these write
637 : : * counts get cleaned up in error cases and
638 : : * upon __fput(). This should probably never
639 : : * be called outside of __dentry_open().
640 : : */
641 : : static inline int __get_file_write_access(struct inode *inode,
642 : : struct vfsmount *mnt)
643 : : {
644 : : int error;
645 : : error = get_write_access(inode);
646 [ + + ]: 1864277 : if (error)
647 : : return error;
648 : : /*
649 : : * Do not take mount writer counts on
650 : : * special files since no writes to
651 : : * the mount itself will occur.
652 : : */
653 [ + + ][ + + ]: 1864250 : if (!special_file(inode->i_mode)) {
[ + + ]
654 : : /*
655 : : * Balanced in __fput()
656 : : */
657 : 1395789 : error = __mnt_want_write(mnt);
658 [ - + ]: 1395830 : if (error)
659 : : put_write_access(inode);
660 : : }
661 : : return error;
662 : : }
663 : :
664 : 0 : int open_check_o_direct(struct file *f)
665 : : {
666 : : /* NB: we're sure to have correct a_ops only after f_op->open */
667 [ - + ][ + + ]: 2863346 : if (f->f_flags & O_DIRECT) {
668 [ # # ][ # # ]: 146 : if (!f->f_mapping->a_ops ||
[ + - ][ + + ]
669 [ # # ][ + ]: 35 : ((!f->f_mapping->a_ops->direct_IO) &&
670 : 2 : (!f->f_mapping->a_ops->get_xip_mem))) {
671 : : return -EINVAL;
672 : : }
673 : : }
674 : 2863322 : return 0;
675 : : }
676 : :
677 : 0 : static int do_dentry_open(struct file *f,
678 : : int (*open)(struct inode *, struct file *),
679 : : const struct cred *cred)
680 : : {
681 : : static const struct file_operations empty_fops = {};
682 : : struct inode *inode;
683 : : int error;
684 : :
685 : 5726906 : f->f_mode = OPEN_FMODE(f->f_flags) | FMODE_LSEEK |
686 : 2863453 : FMODE_PREAD | FMODE_PWRITE;
687 : :
688 [ - + ]: 2863453 : if (unlikely(f->f_flags & O_PATH))
689 : 0 : f->f_mode = FMODE_PATH;
690 : :
691 : 2863453 : path_get(&f->f_path);
692 : 2863486 : inode = f->f_inode = f->f_path.dentry->d_inode;
693 [ + + ]: 2863486 : if (f->f_mode & FMODE_WRITE) {
694 : 1864251 : error = __get_file_write_access(inode, f->f_path.mnt);
695 [ + + ]: 1864163 : if (error)
696 : : goto cleanup_file;
697 : : if (!special_file(inode->i_mode))
698 : : file_take_write(f);
699 : : }
700 : :
701 : 2863397 : f->f_mapping = inode->i_mapping;
702 : :
703 [ - + ]: 2863397 : if (unlikely(f->f_mode & FMODE_PATH)) {
704 : 0 : f->f_op = &empty_fops;
705 : 0 : return 0;
706 : : }
707 : :
708 [ + ][ + ]: 2863397 : f->f_op = fops_get(inode->i_fop);
709 [ - + ][ + + ]: 2863380 : if (unlikely(WARN_ON(!f->f_op))) {
710 : : error = -ENODEV;
711 : : goto cleanup_all;
712 : : }
713 : :
714 : 2863411 : error = security_file_open(f, cred);
715 [ + ]: 2863485 : if (error)
716 : : goto cleanup_all;
717 : :
718 : 2863487 : error = break_lease(inode, f->f_flags);
719 [ + - ]: 2863483 : if (error)
720 : : goto cleanup_all;
721 : :
722 [ + + ]: 2863483 : if (!open)
723 : 2863473 : open = f->f_op->open;
724 [ + + ]: 2863483 : if (open) {
725 : 2793591 : error = open(inode, f);
726 [ + + ]: 2793569 : if (error)
727 : : goto cleanup_all;
728 : : }
729 : : if ((f->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ)
730 : : i_readcount_inc(inode);
731 : :
732 : 2863422 : f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
733 : :
734 : 2863422 : file_ra_state_init(&f->f_ra, f->f_mapping->host->i_mapping);
735 : :
736 : 2863357 : return 0;
737 : :
738 : : cleanup_all:
739 [ + - ]: 46 : fops_put(f->f_op);
740 [ + - ]: 46 : if (f->f_mode & FMODE_WRITE) {
741 : : put_write_access(inode);
742 [ + + ][ - + ]: 46 : if (!special_file(inode->i_mode)) {
[ # # ]
743 : : /*
744 : : * We don't consider this a real
745 : : * mnt_want/drop_write() pair
746 : : * because it all happenend right
747 : : * here, so just reset the state.
748 : : */
749 : : file_reset_write(f);
750 : 0 : __mnt_drop_write(f->f_path.mnt);
751 : : }
752 : : }
753 : : cleanup_file:
754 : 47 : path_put(&f->f_path);
755 : 47 : f->f_path.mnt = NULL;
756 : 47 : f->f_path.dentry = NULL;
757 : 47 : f->f_inode = NULL;
758 : 47 : return error;
759 : : }
760 : :
761 : : /**
762 : : * finish_open - finish opening a file
763 : : * @file: file pointer
764 : : * @dentry: pointer to dentry
765 : : * @open: open callback
766 : : * @opened: state of open
767 : : *
768 : : * This can be used to finish opening a file passed to i_op->atomic_open().
769 : : *
770 : : * If the open callback is set to NULL, then the standard f_op->open()
771 : : * filesystem callback is substituted.
772 : : *
773 : : * NB: the dentry reference is _not_ consumed. If, for example, the dentry is
774 : : * the return value of d_splice_alias(), then the caller needs to perform dput()
775 : : * on it after finish_open().
776 : : *
777 : : * On successful return @file is a fully instantiated open file. After this, if
778 : : * an error occurs in ->atomic_open(), it needs to clean up with fput().
779 : : *
780 : : * Returns zero on success or -errno if the open failed.
781 : : */
782 : 0 : int finish_open(struct file *file, struct dentry *dentry,
783 : : int (*open)(struct inode *, struct file *),
784 : : int *opened)
785 : : {
786 : : int error;
787 [ - + ]: 2863416 : BUG_ON(*opened & FILE_OPENED); /* once it's opened, it's opened */
788 : :
789 : 2863416 : file->f_path.dentry = dentry;
790 : 2863416 : error = do_dentry_open(file, open, current_cred());
791 [ + + ]: 2863388 : if (!error)
792 : 2863337 : *opened |= FILE_OPENED;
793 : :
794 : 0 : return error;
795 : : }
796 : : EXPORT_SYMBOL(finish_open);
797 : :
798 : : /**
799 : : * finish_no_open - finish ->atomic_open() without opening the file
800 : : *
801 : : * @file: file pointer
802 : : * @dentry: dentry or NULL (as returned from ->lookup())
803 : : *
804 : : * This can be used to set the result of a successful lookup in ->atomic_open().
805 : : *
806 : : * NB: unlike finish_open() this function does consume the dentry reference and
807 : : * the caller need not dput() it.
808 : : *
809 : : * Returns "1" which must be the return value of ->atomic_open() after having
810 : : * called this function.
811 : : */
812 : 0 : int finish_no_open(struct file *file, struct dentry *dentry)
813 : : {
814 : 0 : file->f_path.dentry = dentry;
815 : 0 : return 1;
816 : : }
817 : : EXPORT_SYMBOL(finish_no_open);
818 : :
819 : 0 : struct file *dentry_open(const struct path *path, int flags,
820 : : const struct cred *cred)
821 : : {
822 : : int error;
823 : : struct file *f;
824 : :
825 : : validate_creds(cred);
826 : :
827 : : /* We must always pass in a valid mount pointer. */
828 [ - + ]: 33 : BUG_ON(!path->mnt);
829 : :
830 : 33 : f = get_empty_filp();
831 [ + - ]: 33 : if (!IS_ERR(f)) {
832 : 33 : f->f_flags = flags;
833 : 33 : f->f_path = *path;
834 : 33 : error = do_dentry_open(f, NULL, cred);
835 [ + - ]: 33 : if (!error) {
836 : : /* from now on we need fput() to dispose of f */
837 : : error = open_check_o_direct(f);
838 [ - + ]: 33 : if (error) {
839 : 0 : fput(f);
840 : : f = ERR_PTR(error);
841 : : }
842 : : } else {
843 : 0 : put_filp(f);
844 : : f = ERR_PTR(error);
845 : : }
846 : : }
847 : 0 : return f;
848 : : }
849 : : EXPORT_SYMBOL(dentry_open);
850 : :
851 : : static inline int build_open_flags(int flags, umode_t mode, struct open_flags *op)
852 : : {
853 : : int lookup_flags = 0;
854 : : int acc_mode;
855 : :
856 [ + + ][ # # ]: 5537454 : if (flags & (O_CREAT | __O_TMPFILE))
[ + + ]
857 : 1824071 : op->mode = (mode & S_IALLUGO) | S_IFREG;
858 : : else
859 : 3713383 : op->mode = 0;
860 : :
861 : : /* Must never be set by userspace */
862 : 5537454 : flags &= ~FMODE_NONOTIFY & ~O_CLOEXEC;
863 : :
864 : : /*
865 : : * O_SYNC is implemented as __O_SYNC|O_DSYNC. As many places only
866 : : * check for O_DSYNC if the need any syncing at all we enforce it's
867 : : * always set instead of having to deal with possibly weird behaviour
868 : : * for malicious applications setting only __O_SYNC.
869 : : */
870 [ + + ][ # # ]: 5537454 : if (flags & __O_SYNC)
[ - + ]
871 : 59 : flags |= O_DSYNC;
872 : :
873 [ - + ][ # # ]: 5537454 : if (flags & __O_TMPFILE) {
[ - + ]
874 [ # # ][ # # ]: 0 : if ((flags & O_TMPFILE_MASK) != O_TMPFILE)
[ # # ]
875 : : return -EINVAL;
876 : 0 : acc_mode = MAY_OPEN | ACC_MODE(flags);
877 [ # # ][ # # ]: 0 : if (!(acc_mode & MAY_WRITE))
[ # # ]
878 : : return -EINVAL;
879 [ - + ][ # # ]: 5537454 : } else if (flags & O_PATH) {
[ - + ]
880 : : /*
881 : : * If we have O_PATH in the open flag. Then we
882 : : * cannot have anything other than the below set of flags
883 : : */
884 : 0 : flags &= O_DIRECTORY | O_NOFOLLOW | O_PATH;
885 : : acc_mode = 0;
886 : : } else {
887 : 5537454 : acc_mode = MAY_OPEN | ACC_MODE(flags);
888 : : }
889 : :
890 : 11074889 : op->open_flag = flags;
891 : :
892 : : /* O_TRUNC implies we need access checks for write permissions */
893 [ + + ][ # # ]: 11074889 : if (flags & O_TRUNC)
[ - + ]
894 : 244749 : acc_mode |= MAY_WRITE;
895 : :
896 : : /* Allow the LSM permission hook to distinguish append
897 : : access from general write access. */
898 [ + + ][ # # ]: 11074889 : if (flags & O_APPEND)
[ + + ]
899 : 4343 : acc_mode |= MAY_APPEND;
900 : :
901 : 5537527 : op->acc_mode = acc_mode;
902 : :
903 [ + ][ # # ]: 5537527 : op->intent = flags & O_PATH ? 0 : LOOKUP_OPEN;
[ + - ]
904 : :
905 [ + + ][ # # ]: 5537527 : if (flags & O_CREAT) {
[ + + ]
906 : 1824193 : op->intent |= LOOKUP_CREATE;
907 [ + + ][ # # ]: 1824193 : if (flags & O_EXCL)
[ - + ]
908 : 8069 : op->intent |= LOOKUP_EXCL;
909 : : }
910 : :
911 [ + + ][ # # ]: 5537527 : if (flags & O_DIRECTORY)
[ - + ]
912 : : lookup_flags |= LOOKUP_DIRECTORY;
913 [ + + ][ # # ]: 5537527 : if (!(flags & O_NOFOLLOW))
[ + + ]
914 : 5516879 : lookup_flags |= LOOKUP_FOLLOW;
915 : 5537527 : op->lookup_flags = lookup_flags;
916 : : return 0;
917 : : }
918 : :
919 : : /**
920 : : * file_open_name - open file and return file pointer
921 : : *
922 : : * @name: struct filename containing path to open
923 : : * @flags: open flags as per the open(2) second argument
924 : : * @mode: mode for the new file if O_CREAT is set, else ignored
925 : : *
926 : : * This is the helper to open a file from kernelspace if you really
927 : : * have to. But in generally you should not do this, so please move
928 : : * along, nothing to see here..
929 : : */
930 : 0 : struct file *file_open_name(struct filename *name, int flags, umode_t mode)
931 : : {
932 : : struct open_flags op;
933 : : int err = build_open_flags(flags, mode, &op);
934 [ - + ]: 92 : return err ? ERR_PTR(err) : do_filp_open(AT_FDCWD, name, &op);
935 : : }
936 : :
937 : : /**
938 : : * filp_open - open file and return file pointer
939 : : *
940 : : * @filename: path to open
941 : : * @flags: open flags as per the open(2) second argument
942 : : * @mode: mode for the new file if O_CREAT is set, else ignored
943 : : *
944 : : * This is the helper to open a file from kernelspace if you really
945 : : * have to. But in generally you should not do this, so please move
946 : : * along, nothing to see here..
947 : : */
948 : 0 : struct file *filp_open(const char *filename, int flags, umode_t mode)
949 : : {
950 : 18 : struct filename name = {.name = filename};
951 : 18 : return file_open_name(&name, flags, mode);
952 : : }
953 : : EXPORT_SYMBOL(filp_open);
954 : :
955 : 0 : struct file *file_open_root(struct dentry *dentry, struct vfsmount *mnt,
956 : : const char *filename, int flags)
957 : : {
958 : : struct open_flags op;
959 : : int err = build_open_flags(flags, 0, &op);
960 [ # # ]: 0 : if (err)
961 : 0 : return ERR_PTR(err);
962 [ # # ]: 0 : if (flags & O_CREAT)
963 : : return ERR_PTR(-EINVAL);
964 [ # # ][ # # ]: 0 : if (!filename && (flags & O_DIRECTORY))
965 [ # # ]: 0 : if (!dentry->d_inode->i_op->lookup)
966 : : return ERR_PTR(-ENOTDIR);
967 : 0 : return do_file_open_root(dentry, mnt, filename, &op);
968 : : }
969 : : EXPORT_SYMBOL(file_open_root);
970 : :
971 : 0 : long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
972 : : {
973 : : struct open_flags op;
974 : : int fd = build_open_flags(flags, mode, &op);
975 : : struct filename *tmp;
976 : :
977 [ # # ]: 0 : if (fd)
978 : : return fd;
979 : :
980 : 5537460 : tmp = getname(filename);
981 [ + + ]: 5537384 : if (IS_ERR(tmp))
982 : 1 : return PTR_ERR(tmp);
983 : :
984 : 5537383 : fd = get_unused_fd_flags(flags);
985 [ + + ]: 5537504 : if (fd >= 0) {
986 : 5537492 : struct file *f = do_filp_open(dfd, tmp, &op);
987 [ + + ]: 5537479 : if (IS_ERR(f)) {
988 : 2756896 : put_unused_fd(fd);
989 : : fd = PTR_ERR(f);
990 : : } else {
991 : : fsnotify_open(f);
992 : 2780615 : fd_install(fd, f);
993 : : }
994 : : }
995 : 5537551 : putname(tmp);
996 : 5537474 : return fd;
997 : : }
998 : :
999 : 0 : SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
1000 : : {
1001 : : if (force_o_largefile())
1002 : : flags |= O_LARGEFILE;
1003 : :
1004 : 5503198 : return do_sys_open(AT_FDCWD, filename, flags, mode);
1005 : : }
1006 : :
1007 : 0 : SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags,
1008 : : umode_t, mode)
1009 : : {
1010 : : if (force_o_largefile())
1011 : : flags |= O_LARGEFILE;
1012 : :
1013 : 34225 : return do_sys_open(dfd, filename, flags, mode);
1014 : : }
1015 : :
1016 : : #ifndef __alpha__
1017 : :
1018 : : /*
1019 : : * For backward compatibility? Maybe this should be moved
1020 : : * into arch/i386 instead?
1021 : : */
1022 : 0 : SYSCALL_DEFINE2(creat, const char __user *, pathname, umode_t, mode)
1023 : : {
1024 : 199843 : return sys_open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);
1025 : : }
1026 : :
1027 : : #endif
1028 : :
1029 : : /*
1030 : : * "id" is the POSIX thread ID. We use the
1031 : : * files pointer for this..
1032 : : */
1033 : 0 : int filp_close(struct file *filp, fl_owner_t id)
1034 : : {
1035 : : int retval = 0;
1036 : :
1037 [ - + ]: 10021456 : if (!file_count(filp)) {
1038 : 0 : printk(KERN_ERR "VFS: Close: file count is 0\n");
1039 : 0 : return 0;
1040 : : }
1041 : :
1042 [ + + ]: 10021456 : if (filp->f_op->flush)
1043 : 35 : retval = filp->f_op->flush(filp, id);
1044 : :
1045 [ + - ]: 10021087 : if (likely(!(filp->f_mode & FMODE_PATH))) {
1046 : 10021087 : dnotify_flush(filp, id);
1047 : 10023225 : locks_remove_posix(filp, id);
1048 : : }
1049 : 10025467 : fput(filp);
1050 : 10025819 : return retval;
1051 : : }
1052 : :
1053 : : EXPORT_SYMBOL(filp_close);
1054 : :
1055 : : /*
1056 : : * Careful here! We test whether the file pointer is NULL before
1057 : : * releasing the fd. This ensures that one clone task can't release
1058 : : * an fd while another clone is opening it.
1059 : : */
1060 : 0 : SYSCALL_DEFINE1(close, unsigned int, fd)
1061 : : {
1062 : 3437870 : int retval = __close_fd(current->files, fd);
1063 : :
1064 : : /* can't restart close syscall because file table entry was cleared */
1065 [ + ][ + + ]: 3434535 : if (unlikely(retval == -ERESTARTSYS ||
1066 : : retval == -ERESTARTNOINTR ||
1067 : : retval == -ERESTARTNOHAND ||
1068 : : retval == -ERESTART_RESTARTBLOCK))
1069 : : retval = -EINTR;
1070 : :
1071 : : return retval;
1072 : : }
1073 : : EXPORT_SYMBOL(sys_close);
1074 : :
1075 : : /*
1076 : : * This routine simulates a hangup on the tty, to arrange that users
1077 : : * are given clean terminals at login time.
1078 : : */
1079 : 0 : SYSCALL_DEFINE0(vhangup)
1080 : : {
1081 [ + + ]: 4 : if (capable(CAP_SYS_TTY_CONFIG)) {
1082 : 3 : tty_vhangup_self();
1083 : 3 : return 0;
1084 : : }
1085 : : return -EPERM;
1086 : : }
1087 : :
1088 : : /*
1089 : : * Called when an inode is about to be open.
1090 : : * We use this to disallow opening large files on 32bit systems if
1091 : : * the caller didn't specify O_LARGEFILE. On 64bit systems we force
1092 : : * on this flag in sys_open.
1093 : : */
1094 : 0 : int generic_file_open(struct inode * inode, struct file * filp)
1095 : : {
1096 [ + + ][ + + ]: 3054279 : if (!(filp->f_flags & O_LARGEFILE) && i_size_read(inode) > MAX_NON_LFS)
1097 : : return -EOVERFLOW;
1098 : : return 0;
1099 : : }
1100 : :
1101 : : EXPORT_SYMBOL(generic_file_open);
1102 : :
1103 : : /*
1104 : : * This is used by subsystems that don't want seekable
1105 : : * file descriptors. The function is not supposed to ever fail, the only
1106 : : * reason it returns an 'int' and not 'void' is so that it can be plugged
1107 : : * directly into file_operations structure.
1108 : : */
1109 : 0 : int nonseekable_open(struct inode *inode, struct file *filp)
1110 : : {
1111 : 3398 : filp->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE);
1112 : 3398 : return 0;
1113 : : }
1114 : :
1115 : : EXPORT_SYMBOL(nonseekable_open);
|