LCOV - code coverage report
Current view: top level - fs - open.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 493 665 74.1 %
Date: 2021-04-22 12:43:58 Functions: 46 88 52.3 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0-only
       2             : /*
       3             :  *  linux/fs/open.c
       4             :  *
       5             :  *  Copyright (C) 1991, 1992  Linus Torvalds
       6             :  */
       7             : 
       8             : #include <linux/string.h>
       9             : #include <linux/mm.h>
      10             : #include <linux/file.h>
      11             : #include <linux/fdtable.h>
      12             : #include <linux/fsnotify.h>
      13             : #include <linux/module.h>
      14             : #include <linux/tty.h>
      15             : #include <linux/namei.h>
      16             : #include <linux/backing-dev.h>
      17             : #include <linux/capability.h>
      18             : #include <linux/securebits.h>
      19             : #include <linux/security.h>
      20             : #include <linux/mount.h>
      21             : #include <linux/fcntl.h>
      22             : #include <linux/slab.h>
      23             : #include <linux/uaccess.h>
      24             : #include <linux/fs.h>
      25             : #include <linux/personality.h>
      26             : #include <linux/pagemap.h>
      27             : #include <linux/syscalls.h>
      28             : #include <linux/rcupdate.h>
      29             : #include <linux/audit.h>
      30             : #include <linux/falloc.h>
      31             : #include <linux/fs_struct.h>
      32             : #include <linux/ima.h>
      33             : #include <linux/dnotify.h>
      34             : #include <linux/compat.h>
      35             : 
      36             : #include "internal.h"
      37             : 
      38          61 : int do_truncate(struct user_namespace *mnt_userns, struct dentry *dentry,
      39             :                 loff_t length, unsigned int time_attrs, struct file *filp)
      40             : {
      41          61 :         int ret;
      42          61 :         struct iattr newattrs;
      43             : 
      44             :         /* Not pretty: "inode->i_size" shouldn't really be signed. But it is. */
      45          61 :         if (length < 0)
      46             :                 return -EINVAL;
      47             : 
      48          61 :         newattrs.ia_size = length;
      49          61 :         newattrs.ia_valid = ATTR_SIZE | time_attrs;
      50          61 :         if (filp) {
      51          61 :                 newattrs.ia_file = filp;
      52          61 :                 newattrs.ia_valid |= ATTR_FILE;
      53             :         }
      54             : 
      55             :         /* Remove suid, sgid, and file capabilities on truncate too */
      56          61 :         ret = dentry_needs_remove_privs(dentry);
      57          61 :         if (ret < 0)
      58             :                 return ret;
      59          61 :         if (ret)
      60           0 :                 newattrs.ia_valid |= ret | ATTR_FORCE;
      61             : 
      62          61 :         inode_lock(dentry->d_inode);
      63             :         /* Note any delegations or leases have already been broken: */
      64          61 :         ret = notify_change(mnt_userns, dentry, &newattrs, NULL);
      65          61 :         inode_unlock(dentry->d_inode);
      66          61 :         return ret;
      67             : }
      68             : 
      69           0 : long vfs_truncate(const struct path *path, loff_t length)
      70             : {
      71           0 :         struct user_namespace *mnt_userns;
      72           0 :         struct inode *inode;
      73           0 :         long error;
      74             : 
      75           0 :         inode = path->dentry->d_inode;
      76             : 
      77             :         /* For directories it's -EISDIR, for other non-regulars - -EINVAL */
      78           0 :         if (S_ISDIR(inode->i_mode))
      79             :                 return -EISDIR;
      80           0 :         if (!S_ISREG(inode->i_mode))
      81             :                 return -EINVAL;
      82             : 
      83           0 :         error = mnt_want_write(path->mnt);
      84           0 :         if (error)
      85           0 :                 goto out;
      86             : 
      87           0 :         mnt_userns = mnt_user_ns(path->mnt);
      88           0 :         error = inode_permission(mnt_userns, inode, MAY_WRITE);
      89           0 :         if (error)
      90           0 :                 goto mnt_drop_write_and_out;
      91             : 
      92           0 :         error = -EPERM;
      93           0 :         if (IS_APPEND(inode))
      94           0 :                 goto mnt_drop_write_and_out;
      95             : 
      96           0 :         error = get_write_access(inode);
      97           0 :         if (error)
      98           0 :                 goto mnt_drop_write_and_out;
      99             : 
     100             :         /*
     101             :          * Make sure that there are no leases.  get_write_access() protects
     102             :          * against the truncate racing with a lease-granting setlease().
     103             :          */
     104           0 :         error = break_lease(inode, O_WRONLY);
     105           0 :         if (error)
     106           0 :                 goto put_write_and_out;
     107             : 
     108           0 :         error = locks_verify_truncate(inode, NULL, length);
     109           0 :         if (!error)
     110           0 :                 error = security_path_truncate(path);
     111           0 :         if (!error)
     112           0 :                 error = do_truncate(mnt_userns, path->dentry, length, 0, NULL);
     113             : 
     114           0 : put_write_and_out:
     115           0 :         put_write_access(inode);
     116           0 : mnt_drop_write_and_out:
     117           0 :         mnt_drop_write(path->mnt);
     118             : out:
     119             :         return error;
     120             : }
     121             : EXPORT_SYMBOL_GPL(vfs_truncate);
     122             : 
     123           0 : long do_sys_truncate(const char __user *pathname, loff_t length)
     124             : {
     125           0 :         unsigned int lookup_flags = LOOKUP_FOLLOW;
     126           0 :         struct path path;
     127           0 :         int error;
     128             : 
     129           0 :         if (length < 0)      /* sorry, but loff_t says... */
     130             :                 return -EINVAL;
     131             : 
     132           0 : retry:
     133           0 :         error = user_path_at(AT_FDCWD, pathname, lookup_flags, &path);
     134           0 :         if (!error) {
     135           0 :                 error = vfs_truncate(&path, length);
     136           0 :                 path_put(&path);
     137             :         }
     138           0 :         if (retry_estale(error, lookup_flags)) {
     139           0 :                 lookup_flags |= LOOKUP_REVAL;
     140           0 :                 goto retry;
     141             :         }
     142             :         return error;
     143             : }
     144             : 
     145           0 : SYSCALL_DEFINE2(truncate, const char __user *, path, long, length)
     146             : {
     147           0 :         return do_sys_truncate(path, length);
     148             : }
     149             : 
     150             : #ifdef CONFIG_COMPAT
     151           0 : COMPAT_SYSCALL_DEFINE2(truncate, const char __user *, path, compat_off_t, length)
     152             : {
     153           0 :         return do_sys_truncate(path, length);
     154             : }
     155             : #endif
     156             : 
     157          51 : long do_sys_ftruncate(unsigned int fd, loff_t length, int small)
     158             : {
     159          51 :         struct inode *inode;
     160          51 :         struct dentry *dentry;
     161          51 :         struct fd f;
     162          51 :         int error;
     163             : 
     164          51 :         error = -EINVAL;
     165          51 :         if (length < 0)
     166           0 :                 goto out;
     167          51 :         error = -EBADF;
     168          51 :         f = fdget(fd);
     169          51 :         if (!f.file)
     170           0 :                 goto out;
     171             : 
     172             :         /* explicitly opened as large or we are on 64-bit box */
     173          51 :         if (f.file->f_flags & O_LARGEFILE)
     174          51 :                 small = 0;
     175             : 
     176          51 :         dentry = f.file->f_path.dentry;
     177          51 :         inode = dentry->d_inode;
     178          51 :         error = -EINVAL;
     179          51 :         if (!S_ISREG(inode->i_mode) || !(f.file->f_mode & FMODE_WRITE))
     180           0 :                 goto out_putf;
     181             : 
     182          51 :         error = -EINVAL;
     183             :         /* Cannot ftruncate over 2^31 bytes without large file support */
     184          51 :         if (small && length > MAX_NON_LFS)
     185           0 :                 goto out_putf;
     186             : 
     187          51 :         error = -EPERM;
     188             :         /* Check IS_APPEND on real upper inode */
     189          51 :         if (IS_APPEND(file_inode(f.file)))
     190           0 :                 goto out_putf;
     191          51 :         sb_start_write(inode->i_sb);
     192          51 :         error = locks_verify_truncate(inode, f.file, length);
     193          51 :         if (!error)
     194          51 :                 error = security_path_truncate(&f.file->f_path);
     195          51 :         if (!error)
     196          51 :                 error = do_truncate(file_mnt_user_ns(f.file), dentry, length,
     197             :                                     ATTR_MTIME | ATTR_CTIME, f.file);
     198          51 :         sb_end_write(inode->i_sb);
     199          51 : out_putf:
     200          51 :         fdput(f);
     201          51 : out:
     202          51 :         return error;
     203             : }
     204             : 
     205         102 : SYSCALL_DEFINE2(ftruncate, unsigned int, fd, unsigned long, length)
     206             : {
     207          51 :         return do_sys_ftruncate(fd, length, 1);
     208             : }
     209             : 
     210             : #ifdef CONFIG_COMPAT
     211           0 : COMPAT_SYSCALL_DEFINE2(ftruncate, unsigned int, fd, compat_ulong_t, length)
     212             : {
     213           0 :         return do_sys_ftruncate(fd, length, 1);
     214             : }
     215             : #endif
     216             : 
     217             : /* LFS versions of truncate are only needed on 32 bit machines */
     218             : #if BITS_PER_LONG == 32
     219             : SYSCALL_DEFINE2(truncate64, const char __user *, path, loff_t, length)
     220             : {
     221             :         return do_sys_truncate(path, length);
     222             : }
     223             : 
     224             : SYSCALL_DEFINE2(ftruncate64, unsigned int, fd, loff_t, length)
     225             : {
     226             :         return do_sys_ftruncate(fd, length, 0);
     227             : }
     228             : #endif /* BITS_PER_LONG == 32 */
     229             : 
     230             : 
     231           2 : int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
     232             : {
     233           2 :         struct inode *inode = file_inode(file);
     234           2 :         long ret;
     235             : 
     236           2 :         if (offset < 0 || len <= 0)
     237             :                 return -EINVAL;
     238             : 
     239             :         /* Return error if mode is not supported */
     240           2 :         if (mode & ~FALLOC_FL_SUPPORTED_MASK)
     241             :                 return -EOPNOTSUPP;
     242             : 
     243             :         /* Punch hole and zero range are mutually exclusive */
     244           2 :         if ((mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_ZERO_RANGE)) ==
     245             :             (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_ZERO_RANGE))
     246             :                 return -EOPNOTSUPP;
     247             : 
     248             :         /* Punch hole must have keep size set */
     249           2 :         if ((mode & FALLOC_FL_PUNCH_HOLE) &&
     250             :             !(mode & FALLOC_FL_KEEP_SIZE))
     251             :                 return -EOPNOTSUPP;
     252             : 
     253             :         /* Collapse range should only be used exclusively. */
     254           2 :         if ((mode & FALLOC_FL_COLLAPSE_RANGE) &&
     255           0 :             (mode & ~FALLOC_FL_COLLAPSE_RANGE))
     256             :                 return -EINVAL;
     257             : 
     258             :         /* Insert range should only be used exclusively. */
     259           2 :         if ((mode & FALLOC_FL_INSERT_RANGE) &&
     260           0 :             (mode & ~FALLOC_FL_INSERT_RANGE))
     261             :                 return -EINVAL;
     262             : 
     263             :         /* Unshare range should only be used with allocate mode. */
     264           2 :         if ((mode & FALLOC_FL_UNSHARE_RANGE) &&
     265           0 :             (mode & ~(FALLOC_FL_UNSHARE_RANGE | FALLOC_FL_KEEP_SIZE)))
     266             :                 return -EINVAL;
     267             : 
     268           2 :         if (!(file->f_mode & FMODE_WRITE))
     269             :                 return -EBADF;
     270             : 
     271             :         /*
     272             :          * We can only allow pure fallocate on append only files
     273             :          */
     274           2 :         if ((mode & ~FALLOC_FL_KEEP_SIZE) && IS_APPEND(inode))
     275             :                 return -EPERM;
     276             : 
     277           2 :         if (IS_IMMUTABLE(inode))
     278             :                 return -EPERM;
     279             : 
     280             :         /*
     281             :          * We cannot allow any fallocate operation on an active swapfile
     282             :          */
     283           2 :         if (IS_SWAPFILE(inode))
     284             :                 return -ETXTBSY;
     285             : 
     286             :         /*
     287             :          * Revalidate the write permissions, in case security policy has
     288             :          * changed since the files were opened.
     289             :          */
     290           2 :         ret = security_file_permission(file, MAY_WRITE);
     291           2 :         if (ret)
     292             :                 return ret;
     293             : 
     294           2 :         if (S_ISFIFO(inode->i_mode))
     295             :                 return -ESPIPE;
     296             : 
     297           2 :         if (S_ISDIR(inode->i_mode))
     298             :                 return -EISDIR;
     299             : 
     300           2 :         if (!S_ISREG(inode->i_mode) && !S_ISBLK(inode->i_mode))
     301             :                 return -ENODEV;
     302             : 
     303             :         /* Check for wrap through zero too */
     304           2 :         if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0))
     305             :                 return -EFBIG;
     306             : 
     307           2 :         if (!file->f_op->fallocate)
     308             :                 return -EOPNOTSUPP;
     309             : 
     310           2 :         file_start_write(file);
     311           2 :         ret = file->f_op->fallocate(file, mode, offset, len);
     312             : 
     313             :         /*
     314             :          * Create inotify and fanotify events.
     315             :          *
     316             :          * To keep the logic simple always create events if fallocate succeeds.
     317             :          * This implies that events are even created if the file size remains
     318             :          * unchanged, e.g. when using flag FALLOC_FL_KEEP_SIZE.
     319             :          */
     320           2 :         if (ret == 0)
     321           2 :                 fsnotify_modify(file);
     322             : 
     323           2 :         file_end_write(file);
     324           2 :         return ret;
     325             : }
     326             : EXPORT_SYMBOL_GPL(vfs_fallocate);
     327             : 
     328           2 : int ksys_fallocate(int fd, int mode, loff_t offset, loff_t len)
     329             : {
     330           2 :         struct fd f = fdget(fd);
     331           2 :         int error = -EBADF;
     332             : 
     333           2 :         if (f.file) {
     334           2 :                 error = vfs_fallocate(f.file, mode, offset, len);
     335           2 :                 fdput(f);
     336             :         }
     337           2 :         return error;
     338             : }
     339             : 
     340           4 : SYSCALL_DEFINE4(fallocate, int, fd, int, mode, loff_t, offset, loff_t, len)
     341             : {
     342           2 :         return ksys_fallocate(fd, mode, offset, len);
     343             : }
     344             : 
     345             : /*
     346             :  * access() needs to use the real uid/gid, not the effective uid/gid.
     347             :  * We do this by temporarily clearing all FS-related capabilities and
     348             :  * switching the fsuid/fsgid around to the real ones.
     349             :  */
     350        3381 : static const struct cred *access_override_creds(void)
     351             : {
     352        3381 :         const struct cred *old_cred;
     353        3381 :         struct cred *override_cred;
     354             : 
     355        3381 :         override_cred = prepare_creds();
     356        3381 :         if (!override_cred)
     357             :                 return NULL;
     358             : 
     359        3381 :         override_cred->fsuid = override_cred->uid;
     360        3381 :         override_cred->fsgid = override_cred->gid;
     361             : 
     362        3381 :         if (!issecure(SECURE_NO_SETUID_FIXUP)) {
     363             :                 /* Clear the capabilities if we switch to a non-root user */
     364        3381 :                 kuid_t root_uid = make_kuid(override_cred->user_ns, 0);
     365        3381 :                 if (!uid_eq(override_cred->uid, root_uid))
     366          31 :                         cap_clear(override_cred->cap_effective);
     367             :                 else
     368        3350 :                         override_cred->cap_effective =
     369             :                                 override_cred->cap_permitted;
     370             :         }
     371             : 
     372             :         /*
     373             :          * The new set of credentials can *only* be used in
     374             :          * task-synchronous circumstances, and does not need
     375             :          * RCU freeing, unless somebody then takes a separate
     376             :          * reference to it.
     377             :          *
     378             :          * NOTE! This is _only_ true because this credential
     379             :          * is used purely for override_creds() that installs
     380             :          * it as the subjective cred. Other threads will be
     381             :          * accessing ->real_cred, not the subjective cred.
     382             :          *
     383             :          * If somebody _does_ make a copy of this (using the
     384             :          * 'get_current_cred()' function), that will clear the
     385             :          * non_rcu field, because now that other user may be
     386             :          * expecting RCU freeing. But normal thread-synchronous
     387             :          * cred accesses will keep things non-RCY.
     388             :          */
     389        3381 :         override_cred->non_rcu = 1;
     390             : 
     391        3381 :         old_cred = override_creds(override_cred);
     392             : 
     393             :         /* override_cred() gets its own ref */
     394        3381 :         put_cred(override_cred);
     395             : 
     396        3381 :         return old_cred;
     397             : }
     398             : 
     399        3381 : static long do_faccessat(int dfd, const char __user *filename, int mode, int flags)
     400             : {
     401        3381 :         struct path path;
     402        3381 :         struct inode *inode;
     403        3381 :         int res;
     404        3381 :         unsigned int lookup_flags = LOOKUP_FOLLOW;
     405        3381 :         const struct cred *old_cred = NULL;
     406             : 
     407        3381 :         if (mode & ~S_IRWXO)        /* where's F_OK, X_OK, W_OK, R_OK? */
     408             :                 return -EINVAL;
     409             : 
     410        3381 :         if (flags & ~(AT_EACCESS | AT_SYMLINK_NOFOLLOW | AT_EMPTY_PATH))
     411             :                 return -EINVAL;
     412             : 
     413        3381 :         if (flags & AT_SYMLINK_NOFOLLOW)
     414           0 :                 lookup_flags &= ~LOOKUP_FOLLOW;
     415        3381 :         if (flags & AT_EMPTY_PATH)
     416           0 :                 lookup_flags |= LOOKUP_EMPTY;
     417             : 
     418        3381 :         if (!(flags & AT_EACCESS)) {
     419        3381 :                 old_cred = access_override_creds();
     420        3381 :                 if (!old_cred)
     421             :                         return -ENOMEM;
     422             :         }
     423             : 
     424        3381 : retry:
     425        3381 :         res = user_path_at(dfd, filename, lookup_flags, &path);
     426        3381 :         if (res)
     427        2129 :                 goto out;
     428             : 
     429        1252 :         inode = d_backing_inode(path.dentry);
     430             : 
     431        1252 :         if ((mode & MAY_EXEC) && S_ISREG(inode->i_mode)) {
     432             :                 /*
     433             :                  * MAY_EXEC on regular files is denied if the fs is mounted
     434             :                  * with the "noexec" flag.
     435             :                  */
     436          89 :                 res = -EACCES;
     437          89 :                 if (path_noexec(&path))
     438           0 :                         goto out_path_release;
     439             :         }
     440             : 
     441        1252 :         res = inode_permission(mnt_user_ns(path.mnt), inode, mode | MAY_ACCESS);
     442             :         /* SuS v2 requires we report a read only fs too */
     443        1252 :         if (res || !(mode & S_IWOTH) || special_file(inode->i_mode))
     444        1235 :                 goto out_path_release;
     445             :         /*
     446             :          * This is a rare case where using __mnt_is_readonly()
     447             :          * is OK without a mnt_want/drop_write() pair.  Since
     448             :          * no actual write to the fs is performed here, we do
     449             :          * not need to telegraph to that to anyone.
     450             :          *
     451             :          * By doing this, we accept that this access is
     452             :          * inherently racy and know that the fs may change
     453             :          * state before we even see this result.
     454             :          */
     455          17 :         if (__mnt_is_readonly(path.mnt))
     456           0 :                 res = -EROFS;
     457             : 
     458          17 : out_path_release:
     459        1252 :         path_put(&path);
     460        2504 :         if (retry_estale(res, lookup_flags)) {
     461           0 :                 lookup_flags |= LOOKUP_REVAL;
     462           0 :                 goto retry;
     463             :         }
     464        1252 : out:
     465        3381 :         if (old_cred)
     466        3381 :                 revert_creds(old_cred);
     467             : 
     468        3381 :         return res;
     469             : }
     470             : 
     471         122 : SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode)
     472             : {
     473          61 :         return do_faccessat(dfd, filename, mode, 0);
     474             : }
     475             : 
     476           0 : SYSCALL_DEFINE4(faccessat2, int, dfd, const char __user *, filename, int, mode,
     477             :                 int, flags)
     478             : {
     479           0 :         return do_faccessat(dfd, filename, mode, flags);
     480             : }
     481             : 
     482        6640 : SYSCALL_DEFINE2(access, const char __user *, filename, int, mode)
     483             : {
     484        3320 :         return do_faccessat(AT_FDCWD, filename, mode, 0);
     485             : }
     486             : 
     487        2716 : SYSCALL_DEFINE1(chdir, const char __user *, filename)
     488             : {
     489        1358 :         struct path path;
     490        1358 :         int error;
     491        1358 :         unsigned int lookup_flags = LOOKUP_FOLLOW | LOOKUP_DIRECTORY;
     492        1358 : retry:
     493        1358 :         error = user_path_at(AT_FDCWD, filename, lookup_flags, &path);
     494        1358 :         if (error)
     495           0 :                 goto out;
     496             : 
     497        1358 :         error = path_permission(&path, MAY_EXEC | MAY_CHDIR);
     498        1358 :         if (error)
     499           0 :                 goto dput_and_out;
     500             : 
     501        1358 :         set_fs_pwd(current->fs, &path);
     502             : 
     503        1358 : dput_and_out:
     504        1358 :         path_put(&path);
     505        2716 :         if (retry_estale(error, lookup_flags)) {
     506           0 :                 lookup_flags |= LOOKUP_REVAL;
     507           0 :                 goto retry;
     508             :         }
     509        1358 : out:
     510        1358 :         return error;
     511             : }
     512             : 
     513         688 : SYSCALL_DEFINE1(fchdir, unsigned int, fd)
     514             : {
     515         344 :         struct fd f = fdget_raw(fd);
     516         344 :         int error;
     517             : 
     518         344 :         error = -EBADF;
     519         344 :         if (!f.file)
     520           0 :                 goto out;
     521             : 
     522         344 :         error = -ENOTDIR;
     523         344 :         if (!d_can_lookup(f.file->f_path.dentry))
     524           0 :                 goto out_putf;
     525             : 
     526         344 :         error = file_permission(f.file, MAY_EXEC | MAY_CHDIR);
     527         344 :         if (!error)
     528         344 :                 set_fs_pwd(current->fs, &f.file->f_path);
     529           0 : out_putf:
     530         344 :         fdput(f);
     531         344 : out:
     532         344 :         return error;
     533             : }
     534             : 
     535          18 : SYSCALL_DEFINE1(chroot, const char __user *, filename)
     536             : {
     537           9 :         struct path path;
     538           9 :         int error;
     539           9 :         unsigned int lookup_flags = LOOKUP_FOLLOW | LOOKUP_DIRECTORY;
     540           9 : retry:
     541           9 :         error = user_path_at(AT_FDCWD, filename, lookup_flags, &path);
     542           9 :         if (error)
     543           0 :                 goto out;
     544             : 
     545           9 :         error = path_permission(&path, MAY_EXEC | MAY_CHDIR);
     546           9 :         if (error)
     547           0 :                 goto dput_and_out;
     548             : 
     549           9 :         error = -EPERM;
     550           9 :         if (!ns_capable(current_user_ns(), CAP_SYS_CHROOT))
     551           0 :                 goto dput_and_out;
     552           9 :         error = security_path_chroot(&path);
     553           9 :         if (error)
     554           0 :                 goto dput_and_out;
     555             : 
     556           9 :         set_fs_root(current->fs, &path);
     557           9 :         error = 0;
     558           9 : dput_and_out:
     559           9 :         path_put(&path);
     560          18 :         if (retry_estale(error, lookup_flags)) {
     561           0 :                 lookup_flags |= LOOKUP_REVAL;
     562           0 :                 goto retry;
     563             :         }
     564           9 : out:
     565           9 :         return error;
     566             : }
     567             : 
     568         447 : int chmod_common(const struct path *path, umode_t mode)
     569             : {
     570         447 :         struct inode *inode = path->dentry->d_inode;
     571         447 :         struct inode *delegated_inode = NULL;
     572         447 :         struct iattr newattrs;
     573         447 :         int error;
     574             : 
     575         447 :         error = mnt_want_write(path->mnt);
     576         447 :         if (error)
     577             :                 return error;
     578         447 : retry_deleg:
     579         447 :         inode_lock(inode);
     580         447 :         error = security_path_chmod(path, mode);
     581         447 :         if (error)
     582           0 :                 goto out_unlock;
     583         447 :         newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
     584         447 :         newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
     585         447 :         error = notify_change(mnt_user_ns(path->mnt), path->dentry,
     586             :                               &newattrs, &delegated_inode);
     587         447 : out_unlock:
     588         447 :         inode_unlock(inode);
     589         447 :         if (delegated_inode) {
     590           0 :                 error = break_deleg_wait(&delegated_inode);
     591           0 :                 if (!error)
     592           0 :                         goto retry_deleg;
     593             :         }
     594         447 :         mnt_drop_write(path->mnt);
     595         447 :         return error;
     596             : }
     597             : 
     598         256 : int vfs_fchmod(struct file *file, umode_t mode)
     599             : {
     600           0 :         audit_file(file);
     601         256 :         return chmod_common(&file->f_path, mode);
     602             : }
     603             : 
     604         512 : SYSCALL_DEFINE2(fchmod, unsigned int, fd, umode_t, mode)
     605             : {
     606         256 :         struct fd f = fdget(fd);
     607         256 :         int err = -EBADF;
     608             : 
     609         256 :         if (f.file) {
     610         256 :                 err = vfs_fchmod(f.file, mode);
     611         256 :                 fdput(f);
     612             :         }
     613         256 :         return err;
     614             : }
     615             : 
     616         188 : static int do_fchmodat(int dfd, const char __user *filename, umode_t mode)
     617             : {
     618         188 :         struct path path;
     619         188 :         int error;
     620         188 :         unsigned int lookup_flags = LOOKUP_FOLLOW;
     621         188 : retry:
     622         188 :         error = user_path_at(dfd, filename, lookup_flags, &path);
     623         188 :         if (!error) {
     624         188 :                 error = chmod_common(&path, mode);
     625         188 :                 path_put(&path);
     626         376 :                 if (retry_estale(error, lookup_flags)) {
     627           0 :                         lookup_flags |= LOOKUP_REVAL;
     628           0 :                         goto retry;
     629             :                 }
     630             :         }
     631         188 :         return error;
     632             : }
     633             : 
     634          10 : SYSCALL_DEFINE3(fchmodat, int, dfd, const char __user *, filename,
     635             :                 umode_t, mode)
     636             : {
     637           5 :         return do_fchmodat(dfd, filename, mode);
     638             : }
     639             : 
     640         366 : SYSCALL_DEFINE2(chmod, const char __user *, filename, umode_t, mode)
     641             : {
     642         183 :         return do_fchmodat(AT_FDCWD, filename, mode);
     643             : }
     644             : 
     645         194 : int chown_common(const struct path *path, uid_t user, gid_t group)
     646             : {
     647         194 :         struct user_namespace *mnt_userns;
     648         194 :         struct inode *inode = path->dentry->d_inode;
     649         194 :         struct inode *delegated_inode = NULL;
     650         194 :         int error;
     651         194 :         struct iattr newattrs;
     652         194 :         kuid_t uid;
     653         194 :         kgid_t gid;
     654             : 
     655         194 :         uid = make_kuid(current_user_ns(), user);
     656         194 :         gid = make_kgid(current_user_ns(), group);
     657             : 
     658         194 :         mnt_userns = mnt_user_ns(path->mnt);
     659         194 :         uid = kuid_from_mnt(mnt_userns, uid);
     660         194 :         gid = kgid_from_mnt(mnt_userns, gid);
     661             : 
     662         194 : retry_deleg:
     663         194 :         newattrs.ia_valid =  ATTR_CTIME;
     664         194 :         if (user != (uid_t) -1) {
     665         193 :                 if (!uid_valid(uid))
     666             :                         return -EINVAL;
     667         193 :                 newattrs.ia_valid |= ATTR_UID;
     668         193 :                 newattrs.ia_uid = uid;
     669             :         }
     670         194 :         if (group != (gid_t) -1) {
     671         193 :                 if (!gid_valid(gid))
     672             :                         return -EINVAL;
     673         193 :                 newattrs.ia_valid |= ATTR_GID;
     674         193 :                 newattrs.ia_gid = gid;
     675             :         }
     676         194 :         if (!S_ISDIR(inode->i_mode))
     677         179 :                 newattrs.ia_valid |=
     678             :                         ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV;
     679         194 :         inode_lock(inode);
     680         194 :         error = security_path_chown(path, uid, gid);
     681         194 :         if (!error)
     682         194 :                 error = notify_change(mnt_userns, path->dentry, &newattrs,
     683             :                                       &delegated_inode);
     684         194 :         inode_unlock(inode);
     685         194 :         if (delegated_inode) {
     686           0 :                 error = break_deleg_wait(&delegated_inode);
     687           0 :                 if (!error)
     688           0 :                         goto retry_deleg;
     689             :         }
     690         194 :         return error;
     691             : }
     692             : 
     693         125 : int do_fchownat(int dfd, const char __user *filename, uid_t user, gid_t group,
     694             :                 int flag)
     695             : {
     696         125 :         struct path path;
     697         125 :         int error = -EINVAL;
     698         125 :         int lookup_flags;
     699             : 
     700         125 :         if ((flag & ~(AT_SYMLINK_NOFOLLOW | AT_EMPTY_PATH)) != 0)
     701           0 :                 goto out;
     702             : 
     703         125 :         lookup_flags = (flag & AT_SYMLINK_NOFOLLOW) ? 0 : LOOKUP_FOLLOW;
     704         125 :         if (flag & AT_EMPTY_PATH)
     705           8 :                 lookup_flags |= LOOKUP_EMPTY;
     706         117 : retry:
     707         125 :         error = user_path_at(dfd, filename, lookup_flags, &path);
     708         125 :         if (error)
     709           0 :                 goto out;
     710         125 :         error = mnt_want_write(path.mnt);
     711         125 :         if (error)
     712           0 :                 goto out_release;
     713         125 :         error = chown_common(&path, user, group);
     714         125 :         mnt_drop_write(path.mnt);
     715         125 : out_release:
     716         125 :         path_put(&path);
     717         250 :         if (retry_estale(error, lookup_flags)) {
     718           0 :                 lookup_flags |= LOOKUP_REVAL;
     719           0 :                 goto retry;
     720             :         }
     721         125 : out:
     722         125 :         return error;
     723             : }
     724             : 
     725          28 : SYSCALL_DEFINE5(fchownat, int, dfd, const char __user *, filename, uid_t, user,
     726             :                 gid_t, group, int, flag)
     727             : {
     728          14 :         return do_fchownat(dfd, filename, user, group, flag);
     729             : }
     730             : 
     731         222 : SYSCALL_DEFINE3(chown, const char __user *, filename, uid_t, user, gid_t, group)
     732             : {
     733         111 :         return do_fchownat(AT_FDCWD, filename, user, group, 0);
     734             : }
     735             : 
     736           0 : SYSCALL_DEFINE3(lchown, const char __user *, filename, uid_t, user, gid_t, group)
     737             : {
     738           0 :         return do_fchownat(AT_FDCWD, filename, user, group,
     739             :                            AT_SYMLINK_NOFOLLOW);
     740             : }
     741             : 
     742          66 : int vfs_fchown(struct file *file, uid_t user, gid_t group)
     743             : {
     744          66 :         int error;
     745             : 
     746          66 :         error = mnt_want_write_file(file);
     747          66 :         if (error)
     748             :                 return error;
     749          66 :         audit_file(file);
     750          66 :         error = chown_common(&file->f_path, user, group);
     751          66 :         mnt_drop_write_file(file);
     752          66 :         return error;
     753             : }
     754             : 
     755          66 : int ksys_fchown(unsigned int fd, uid_t user, gid_t group)
     756             : {
     757          66 :         struct fd f = fdget(fd);
     758          66 :         int error = -EBADF;
     759             : 
     760          66 :         if (f.file) {
     761          66 :                 error = vfs_fchown(f.file, user, group);
     762          66 :                 fdput(f);
     763             :         }
     764          66 :         return error;
     765             : }
     766             : 
     767         132 : SYSCALL_DEFINE3(fchown, unsigned int, fd, uid_t, user, gid_t, group)
     768             : {
     769          66 :         return ksys_fchown(fd, user, group);
     770             : }
     771             : 
     772       45775 : static int do_dentry_open(struct file *f,
     773             :                           struct inode *inode,
     774             :                           int (*open)(struct inode *, struct file *))
     775             : {
     776       45775 :         static const struct file_operations empty_fops = {};
     777       45775 :         int error;
     778             : 
     779       45775 :         path_get(&f->f_path);
     780       45803 :         f->f_inode = inode;
     781       45803 :         f->f_mapping = inode->i_mapping;
     782       45803 :         f->f_wb_err = filemap_sample_wb_err(f->f_mapping);
     783       45803 :         f->f_sb_err = file_sample_sb_err(f);
     784             : 
     785       45803 :         if (unlikely(f->f_flags & O_PATH)) {
     786       30265 :                 f->f_mode = FMODE_PATH | FMODE_OPENED;
     787       30265 :                 f->f_op = &empty_fops;
     788       30265 :                 return 0;
     789             :         }
     790             : 
     791       15538 :         if (f->f_mode & FMODE_WRITE && !special_file(inode->i_mode)) {
     792        1234 :                 error = get_write_access(inode);
     793        1234 :                 if (unlikely(error))
     794           0 :                         goto cleanup_file;
     795        1234 :                 error = __mnt_want_write(f->f_path.mnt);
     796        1234 :                 if (unlikely(error)) {
     797           0 :                         put_write_access(inode);
     798           0 :                         goto cleanup_file;
     799             :                 }
     800        1234 :                 f->f_mode |= FMODE_WRITER;
     801             :         }
     802             : 
     803             :         /* POSIX.1-2008/SUSv4 Section XSI 2.9.7 */
     804       15538 :         if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode))
     805       15082 :                 f->f_mode |= FMODE_ATOMIC_POS;
     806             : 
     807       15538 :         f->f_op = fops_get(inode->i_fop);
     808       15538 :         if (WARN_ON(!f->f_op)) {
     809           0 :                 error = -ENODEV;
     810           0 :                 goto cleanup_all;
     811             :         }
     812             : 
     813       15538 :         error = security_file_open(f);
     814       15538 :         if (error)
     815         143 :                 goto cleanup_all;
     816             : 
     817       15395 :         error = break_lease(locks_inode(f), f->f_flags);
     818       15394 :         if (error)
     819           0 :                 goto cleanup_all;
     820             : 
     821             :         /* normally all 3 are set; ->open() can clear them if needed */
     822       15394 :         f->f_mode |= FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE;
     823       15394 :         if (!open)
     824       15394 :                 open = f->f_op->open;
     825       15394 :         if (open) {
     826       13604 :                 error = open(inode, f);
     827       13604 :                 if (error)
     828          76 :                         goto cleanup_all;
     829             :         }
     830       15318 :         f->f_mode |= FMODE_OPENED;
     831       15318 :         if ((f->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ)
     832       13859 :                 i_readcount_inc(inode);
     833       15319 :         if ((f->f_mode & FMODE_READ) &&
     834       14331 :              likely(f->f_op->read || f->f_op->read_iter))
     835       14329 :                 f->f_mode |= FMODE_CAN_READ;
     836       15319 :         if ((f->f_mode & FMODE_WRITE) &&
     837        1458 :              likely(f->f_op->write || f->f_op->write_iter))
     838        1458 :                 f->f_mode |= FMODE_CAN_WRITE;
     839             : 
     840       15319 :         f->f_write_hint = WRITE_LIFE_NOT_SET;
     841       15319 :         f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
     842             : 
     843       15319 :         file_ra_state_init(&f->f_ra, f->f_mapping->host->i_mapping);
     844             : 
     845             :         /* NB: we're sure to have correct a_ops only after f_op->open */
     846       15316 :         if (f->f_flags & O_DIRECT) {
     847           0 :                 if (!f->f_mapping->a_ops || !f->f_mapping->a_ops->direct_IO)
     848             :                         return -EINVAL;
     849             :         }
     850             : 
     851             :         /*
     852             :          * XXX: Huge page cache doesn't support writing yet. Drop all page
     853             :          * cache for this file before processing writes.
     854             :          */
     855       15316 :         if ((f->f_mode & FMODE_WRITE) && filemap_nr_thps(inode->i_mapping))
     856             :                 truncate_pagecache(inode, 0);
     857             : 
     858             :         return 0;
     859             : 
     860         219 : cleanup_all:
     861         219 :         if (WARN_ON_ONCE(error > 0))
     862           0 :                 error = -EINVAL;
     863         219 :         fops_put(f->f_op);
     864         219 :         if (f->f_mode & FMODE_WRITER) {
     865          62 :                 put_write_access(inode);
     866          62 :                 __mnt_drop_write(f->f_path.mnt);
     867             :         }
     868         157 : cleanup_file:
     869         219 :         path_put(&f->f_path);
     870         219 :         f->f_path.mnt = NULL;
     871         219 :         f->f_path.dentry = NULL;
     872         219 :         f->f_inode = NULL;
     873         219 :         return error;
     874             : }
     875             : 
     876             : /**
     877             :  * finish_open - finish opening a file
     878             :  * @file: file pointer
     879             :  * @dentry: pointer to dentry
     880             :  * @open: open callback
     881             :  * @opened: state of open
     882             :  *
     883             :  * This can be used to finish opening a file passed to i_op->atomic_open().
     884             :  *
     885             :  * If the open callback is set to NULL, then the standard f_op->open()
     886             :  * filesystem callback is substituted.
     887             :  *
     888             :  * NB: the dentry reference is _not_ consumed.  If, for example, the dentry is
     889             :  * the return value of d_splice_alias(), then the caller needs to perform dput()
     890             :  * on it after finish_open().
     891             :  *
     892             :  * Returns zero on success or -errno if the open failed.
     893             :  */
     894           0 : int finish_open(struct file *file, struct dentry *dentry,
     895             :                 int (*open)(struct inode *, struct file *))
     896             : {
     897           0 :         BUG_ON(file->f_mode & FMODE_OPENED); /* once it's opened, it's opened */
     898             : 
     899           0 :         file->f_path.dentry = dentry;
     900           0 :         return do_dentry_open(file, d_backing_inode(dentry), open);
     901             : }
     902             : EXPORT_SYMBOL(finish_open);
     903             : 
     904             : /**
     905             :  * finish_no_open - finish ->atomic_open() without opening the file
     906             :  *
     907             :  * @file: file pointer
     908             :  * @dentry: dentry or NULL (as returned from ->lookup())
     909             :  *
     910             :  * This can be used to set the result of a successful lookup in ->atomic_open().
     911             :  *
     912             :  * NB: unlike finish_open() this function does consume the dentry reference and
     913             :  * the caller need not dput() it.
     914             :  *
     915             :  * Returns "0" which must be the return value of ->atomic_open() after having
     916             :  * called this function.
     917             :  */
     918           0 : int finish_no_open(struct file *file, struct dentry *dentry)
     919             : {
     920           0 :         file->f_path.dentry = dentry;
     921           0 :         return 0;
     922             : }
     923             : EXPORT_SYMBOL(finish_no_open);
     924             : 
     925           0 : char *file_path(struct file *filp, char *buf, int buflen)
     926             : {
     927           0 :         return d_path(&filp->f_path, buf, buflen);
     928             : }
     929             : EXPORT_SYMBOL(file_path);
     930             : 
     931             : /**
     932             :  * vfs_open - open the file at the given path
     933             :  * @path: path to open
     934             :  * @file: newly allocated file with f_flag initialized
     935             :  * @cred: credentials to use
     936             :  */
     937       45745 : int vfs_open(const struct path *path, struct file *file)
     938             : {
     939       45745 :         file->f_path = *path;
     940       45745 :         return do_dentry_open(file, d_backing_inode(path->dentry), NULL);
     941             : }
     942             : 
     943          14 : struct file *dentry_open(const struct path *path, int flags,
     944             :                          const struct cred *cred)
     945             : {
     946          14 :         int error;
     947          14 :         struct file *f;
     948             : 
     949          14 :         validate_creds(cred);
     950             : 
     951             :         /* We must always pass in a valid mount pointer. */
     952          14 :         BUG_ON(!path->mnt);
     953             : 
     954          14 :         f = alloc_empty_file(flags, cred);
     955          14 :         if (!IS_ERR(f)) {
     956          14 :                 error = vfs_open(path, f);
     957          14 :                 if (error) {
     958           0 :                         fput(f);
     959           0 :                         f = ERR_PTR(error);
     960             :                 }
     961             :         }
     962          14 :         return f;
     963             : }
     964             : EXPORT_SYMBOL(dentry_open);
     965             : 
     966          39 : struct file *open_with_fake_path(const struct path *path, int flags,
     967             :                                 struct inode *inode, const struct cred *cred)
     968             : {
     969          39 :         struct file *f = alloc_empty_file_noaccount(flags, cred);
     970          39 :         if (!IS_ERR(f)) {
     971          39 :                 int error;
     972             : 
     973          39 :                 f->f_path = *path;
     974          39 :                 error = do_dentry_open(f, inode, NULL);
     975          39 :                 if (error) {
     976           0 :                         fput(f);
     977           0 :                         f = ERR_PTR(error);
     978             :                 }
     979             :         }
     980          39 :         return f;
     981             : }
     982             : EXPORT_SYMBOL(open_with_fake_path);
     983             : 
     984             : #define WILL_CREATE(flags)      (flags & (O_CREAT | __O_TMPFILE))
     985             : #define O_PATH_FLAGS            (O_DIRECTORY | O_NOFOLLOW | O_PATH | O_CLOEXEC)
     986             : 
     987       56199 : inline struct open_how build_open_how(int flags, umode_t mode)
     988             : {
     989       56199 :         struct open_how how = {
     990           0 :                 .flags = flags & VALID_OPEN_FLAGS,
     991             :                 .mode = mode & S_IALLUGO,
     992             :         };
     993             : 
     994             :         /* O_PATH beats everything else. */
     995           0 :         if (how.flags & O_PATH)
     996       36249 :                 how.flags &= O_PATH_FLAGS;
     997             :         /* Modes should only be set for create-like flags. */
     998       56199 :         if (!WILL_CREATE(how.flags))
     999       54832 :                 how.mode = 0;
    1000       56199 :         return how;
    1001             : }
    1002             : 
    1003       56200 : inline int build_open_flags(const struct open_how *how, struct open_flags *op)
    1004             : {
    1005       56200 :         int flags = how->flags;
    1006       56200 :         int lookup_flags = 0;
    1007       56200 :         int acc_mode = ACC_MODE(flags);
    1008             : 
    1009             :         /* Must never be set by userspace */
    1010       56200 :         flags &= ~(FMODE_NONOTIFY | O_CLOEXEC);
    1011             : 
    1012             :         /*
    1013             :          * Older syscalls implicitly clear all of the invalid flags or argument
    1014             :          * values before calling build_open_flags(), but openat2(2) checks all
    1015             :          * of its arguments.
    1016             :          */
    1017       56200 :         if (flags & ~VALID_OPEN_FLAGS)
    1018             :                 return -EINVAL;
    1019       56200 :         if (how->resolve & ~VALID_RESOLVE_FLAGS)
    1020             :                 return -EINVAL;
    1021             : 
    1022             :         /* Scoping flags are mutually exclusive. */
    1023       56200 :         if ((how->resolve & RESOLVE_BENEATH) && (how->resolve & RESOLVE_IN_ROOT))
    1024             :                 return -EINVAL;
    1025             : 
    1026             :         /* Deal with the mode. */
    1027       56200 :         if (WILL_CREATE(flags)) {
    1028        1388 :                 if (how->mode & ~S_IALLUGO)
    1029             :                         return -EINVAL;
    1030        1388 :                 op->mode = how->mode | S_IFREG;
    1031             :         } else {
    1032       54812 :                 if (how->mode != 0)
    1033             :                         return -EINVAL;
    1034       54812 :                 op->mode = 0;
    1035             :         }
    1036             : 
    1037             :         /*
    1038             :          * In order to ensure programs get explicit errors when trying to use
    1039             :          * O_TMPFILE on old kernels, O_TMPFILE is implemented such that it
    1040             :          * looks like (O_DIRECTORY|O_RDWR & ~O_CREAT) to old kernels. But we
    1041             :          * have to require userspace to explicitly set it.
    1042             :          */
    1043       56200 :         if (flags & __O_TMPFILE) {
    1044           0 :                 if ((flags & O_TMPFILE_MASK) != O_TMPFILE)
    1045             :                         return -EINVAL;
    1046           0 :                 if (!(acc_mode & MAY_WRITE))
    1047             :                         return -EINVAL;
    1048             :         }
    1049       56200 :         if (flags & O_PATH) {
    1050             :                 /* O_PATH only permits certain other flags to be set. */
    1051       36271 :                 if (flags & ~O_PATH_FLAGS)
    1052             :                         return -EINVAL;
    1053             :                 acc_mode = 0;
    1054             :         }
    1055             : 
    1056             :         /*
    1057             :          * O_SYNC is implemented as __O_SYNC|O_DSYNC.  As many places only
    1058             :          * check for O_DSYNC if the need any syncing at all we enforce it's
    1059             :          * always set instead of having to deal with possibly weird behaviour
    1060             :          * for malicious applications setting only __O_SYNC.
    1061             :          */
    1062       56200 :         if (flags & __O_SYNC)
    1063           0 :                 flags |= O_DSYNC;
    1064             : 
    1065       56200 :         op->open_flag = flags;
    1066             : 
    1067             :         /* O_TRUNC implies we need access checks for write permissions */
    1068       56200 :         if (flags & O_TRUNC)
    1069         370 :                 acc_mode |= MAY_WRITE;
    1070             : 
    1071             :         /* Allow the LSM permission hook to distinguish append
    1072             :            access from general write access. */
    1073       56200 :         if (flags & O_APPEND)
    1074          36 :                 acc_mode |= MAY_APPEND;
    1075             : 
    1076       56200 :         op->acc_mode = acc_mode;
    1077             : 
    1078       56200 :         op->intent = flags & O_PATH ? 0 : LOOKUP_OPEN;
    1079             : 
    1080       56200 :         if (flags & O_CREAT) {
    1081        1388 :                 op->intent |= LOOKUP_CREATE;
    1082        1388 :                 if (flags & O_EXCL) {
    1083         316 :                         op->intent |= LOOKUP_EXCL;
    1084         316 :                         flags |= O_NOFOLLOW;
    1085             :                 }
    1086             :         }
    1087             : 
    1088       56200 :         if (flags & O_DIRECTORY)
    1089        1606 :                 lookup_flags |= LOOKUP_DIRECTORY;
    1090       56200 :         if (!(flags & O_NOFOLLOW))
    1091       18059 :                 lookup_flags |= LOOKUP_FOLLOW;
    1092             : 
    1093       56200 :         if (how->resolve & RESOLVE_NO_XDEV)
    1094           0 :                 lookup_flags |= LOOKUP_NO_XDEV;
    1095       56200 :         if (how->resolve & RESOLVE_NO_MAGICLINKS)
    1096           0 :                 lookup_flags |= LOOKUP_NO_MAGICLINKS;
    1097       56200 :         if (how->resolve & RESOLVE_NO_SYMLINKS)
    1098           0 :                 lookup_flags |= LOOKUP_NO_SYMLINKS;
    1099       56200 :         if (how->resolve & RESOLVE_BENEATH)
    1100           0 :                 lookup_flags |= LOOKUP_BENEATH;
    1101       56200 :         if (how->resolve & RESOLVE_IN_ROOT)
    1102           0 :                 lookup_flags |= LOOKUP_IN_ROOT;
    1103       56200 :         if (how->resolve & RESOLVE_CACHED) {
    1104             :                 /* Don't bother even trying for create/truncate/tmpfile open */
    1105           0 :                 if (flags & (O_TRUNC | O_CREAT | O_TMPFILE))
    1106             :                         return -EAGAIN;
    1107           0 :                 lookup_flags |= LOOKUP_CACHED;
    1108             :         }
    1109             : 
    1110       56200 :         op->lookup_flags = lookup_flags;
    1111       56200 :         return 0;
    1112             : }
    1113             : 
    1114             : /**
    1115             :  * file_open_name - open file and return file pointer
    1116             :  *
    1117             :  * @name:       struct filename containing path to open
    1118             :  * @flags:      open flags as per the open(2) second argument
    1119             :  * @mode:       mode for the new file if O_CREAT is set, else ignored
    1120             :  *
    1121             :  * This is the helper to open a file from kernelspace if you really
    1122             :  * have to.  But in generally you should not do this, so please move
    1123             :  * along, nothing to see here..
    1124             :  */
    1125           1 : struct file *file_open_name(struct filename *name, int flags, umode_t mode)
    1126             : {
    1127           1 :         struct open_flags op;
    1128           1 :         struct open_how how = build_open_how(flags, mode);
    1129           1 :         int err = build_open_flags(&how, &op);
    1130           1 :         if (err)
    1131           0 :                 return ERR_PTR(err);
    1132           1 :         return do_filp_open(AT_FDCWD, name, &op);
    1133             : }
    1134             : 
    1135             : /**
    1136             :  * filp_open - open file and return file pointer
    1137             :  *
    1138             :  * @filename:   path to open
    1139             :  * @flags:      open flags as per the open(2) second argument
    1140             :  * @mode:       mode for the new file if O_CREAT is set, else ignored
    1141             :  *
    1142             :  * This is the helper to open a file from kernelspace if you really
    1143             :  * have to.  But in generally you should not do this, so please move
    1144             :  * along, nothing to see here..
    1145             :  */
    1146           1 : struct file *filp_open(const char *filename, int flags, umode_t mode)
    1147             : {
    1148           1 :         struct filename *name = getname_kernel(filename);
    1149           1 :         struct file *file = ERR_CAST(name);
    1150             :         
    1151           1 :         if (!IS_ERR(name)) {
    1152           1 :                 file = file_open_name(name, flags, mode);
    1153           1 :                 putname(name);
    1154             :         }
    1155           1 :         return file;
    1156             : }
    1157             : EXPORT_SYMBOL(filp_open);
    1158             : 
    1159           0 : struct file *file_open_root(struct dentry *dentry, struct vfsmount *mnt,
    1160             :                             const char *filename, int flags, umode_t mode)
    1161             : {
    1162           0 :         struct open_flags op;
    1163           0 :         struct open_how how = build_open_how(flags, mode);
    1164           0 :         int err = build_open_flags(&how, &op);
    1165           0 :         if (err)
    1166           0 :                 return ERR_PTR(err);
    1167           0 :         return do_file_open_root(dentry, mnt, filename, &op);
    1168             : }
    1169             : EXPORT_SYMBOL(file_open_root);
    1170             : 
    1171       56207 : static long do_sys_openat2(int dfd, const char __user *filename,
    1172             :                            struct open_how *how)
    1173             : {
    1174       56207 :         struct open_flags op;
    1175       56207 :         int fd = build_open_flags(how, &op);
    1176       56227 :         struct filename *tmp;
    1177             : 
    1178       56227 :         if (fd)
    1179           0 :                 return fd;
    1180             : 
    1181       56227 :         tmp = getname(filename);
    1182       56239 :         if (IS_ERR(tmp))
    1183           0 :                 return PTR_ERR(tmp);
    1184             : 
    1185       56239 :         fd = get_unused_fd_flags(how->flags);
    1186       56237 :         if (fd >= 0) {
    1187       56237 :                 struct file *f = do_filp_open(dfd, tmp, &op);
    1188       56230 :                 if (IS_ERR(f)) {
    1189       12770 :                         put_unused_fd(fd);
    1190       12770 :                         fd = PTR_ERR(f);
    1191             :                 } else {
    1192       43460 :                         fsnotify_open(f);
    1193       43466 :                         fd_install(fd, f);
    1194             :                 }
    1195             :         }
    1196       56230 :         putname(tmp);
    1197       56210 :         return fd;
    1198             : }
    1199             : 
    1200       56198 : long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
    1201             : {
    1202       56198 :         struct open_how how = build_open_how(flags, mode);
    1203       56198 :         return do_sys_openat2(dfd, filename, &how);
    1204             : }
    1205             : 
    1206             : 
    1207           0 : SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
    1208             : {
    1209           0 :         if (force_o_largefile())
    1210           0 :                 flags |= O_LARGEFILE;
    1211           0 :         return do_sys_open(AT_FDCWD, filename, flags, mode);
    1212             : }
    1213             : 
    1214      112418 : SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags,
    1215             :                 umode_t, mode)
    1216             : {
    1217       56214 :         if (force_o_largefile())
    1218       56214 :                 flags |= O_LARGEFILE;
    1219       56214 :         return do_sys_open(dfd, filename, flags, mode);
    1220             : }
    1221             : 
    1222           0 : SYSCALL_DEFINE4(openat2, int, dfd, const char __user *, filename,
    1223             :                 struct open_how __user *, how, size_t, usize)
    1224             : {
    1225           0 :         int err;
    1226           0 :         struct open_how tmp;
    1227             : 
    1228           0 :         BUILD_BUG_ON(sizeof(struct open_how) < OPEN_HOW_SIZE_VER0);
    1229           0 :         BUILD_BUG_ON(sizeof(struct open_how) != OPEN_HOW_SIZE_LATEST);
    1230             : 
    1231           0 :         if (unlikely(usize < OPEN_HOW_SIZE_VER0))
    1232             :                 return -EINVAL;
    1233             : 
    1234           0 :         err = copy_struct_from_user(&tmp, sizeof(tmp), how, usize);
    1235           0 :         if (err)
    1236           0 :                 return err;
    1237             : 
    1238             :         /* O_LARGEFILE is only allowed for non-O_PATH. */
    1239           0 :         if (!(tmp.flags & O_PATH) && force_o_largefile())
    1240           0 :                 tmp.flags |= O_LARGEFILE;
    1241             : 
    1242           0 :         return do_sys_openat2(dfd, filename, &tmp);
    1243             : }
    1244             : 
    1245             : #ifdef CONFIG_COMPAT
    1246             : /*
    1247             :  * Exactly like sys_open(), except that it doesn't set the
    1248             :  * O_LARGEFILE flag.
    1249             :  */
    1250           0 : COMPAT_SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
    1251             : {
    1252           0 :         return do_sys_open(AT_FDCWD, filename, flags, mode);
    1253             : }
    1254             : 
    1255             : /*
    1256             :  * Exactly like sys_openat(), except that it doesn't set the
    1257             :  * O_LARGEFILE flag.
    1258             :  */
    1259           0 : COMPAT_SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags, umode_t, mode)
    1260             : {
    1261           0 :         return do_sys_open(dfd, filename, flags, mode);
    1262             : }
    1263             : #endif
    1264             : 
    1265             : #ifndef __alpha__
    1266             : 
    1267             : /*
    1268             :  * For backward compatibility?  Maybe this should be moved
    1269             :  * into arch/i386 instead?
    1270             :  */
    1271           2 : SYSCALL_DEFINE2(creat, const char __user *, pathname, umode_t, mode)
    1272             : {
    1273           1 :         int flags = O_CREAT | O_WRONLY | O_TRUNC;
    1274             : 
    1275           1 :         if (force_o_largefile())
    1276           1 :                 flags |= O_LARGEFILE;
    1277           1 :         return do_sys_open(AT_FDCWD, pathname, flags, mode);
    1278             : }
    1279             : #endif
    1280             : 
    1281             : /*
    1282             :  * "id" is the POSIX thread ID. We use the
    1283             :  * files pointer for this..
    1284             :  */
    1285       57997 : int filp_close(struct file *filp, fl_owner_t id)
    1286             : {
    1287       57997 :         int retval = 0;
    1288             : 
    1289       57997 :         if (!file_count(filp)) {
    1290           0 :                 printk(KERN_ERR "VFS: Close: file count is 0\n");
    1291           0 :                 return 0;
    1292             :         }
    1293             : 
    1294       57997 :         if (filp->f_op->flush)
    1295           0 :                 retval = filp->f_op->flush(filp, id);
    1296             : 
    1297       58000 :         if (likely(!(filp->f_mode & FMODE_PATH))) {
    1298       27717 :                 dnotify_flush(filp, id);
    1299       27717 :                 locks_remove_posix(filp, id);
    1300             :         }
    1301       58000 :         fput(filp);
    1302       58000 :         return retval;
    1303             : }
    1304             : 
    1305             : EXPORT_SYMBOL(filp_close);
    1306             : 
    1307             : /*
    1308             :  * Careful here! We test whether the file pointer is NULL before
    1309             :  * releasing the fd. This ensures that one clone task can't release
    1310             :  * an fd while another clone is opening it.
    1311             :  */
    1312      101619 : SYSCALL_DEFINE1(close, unsigned int, fd)
    1313             : {
    1314       50809 :         int retval = close_fd(fd);
    1315             : 
    1316             :         /* can't restart close syscall because file table entry was cleared */
    1317       50840 :         if (unlikely(retval == -ERESTARTSYS ||
    1318             :                      retval == -ERESTARTNOINTR ||
    1319             :                      retval == -ERESTARTNOHAND ||
    1320             :                      retval == -ERESTART_RESTARTBLOCK))
    1321           0 :                 retval = -EINTR;
    1322             : 
    1323       50840 :         return retval;
    1324             : }
    1325             : 
    1326             : /**
    1327             :  * close_range() - Close all file descriptors in a given range.
    1328             :  *
    1329             :  * @fd:     starting file descriptor to close
    1330             :  * @max_fd: last file descriptor to close
    1331             :  * @flags:  reserved for future extensions
    1332             :  *
    1333             :  * This closes a range of file descriptors. All file descriptors
    1334             :  * from @fd up to and including @max_fd are closed.
    1335             :  * Currently, errors to close a given file descriptor are ignored.
    1336             :  */
    1337           0 : SYSCALL_DEFINE3(close_range, unsigned int, fd, unsigned int, max_fd,
    1338             :                 unsigned int, flags)
    1339             : {
    1340           0 :         return __close_range(fd, max_fd, flags);
    1341             : }
    1342             : 
    1343             : /*
    1344             :  * This routine simulates a hangup on the tty, to arrange that users
    1345             :  * are given clean terminals at login time.
    1346             :  */
    1347           0 : SYSCALL_DEFINE0(vhangup)
    1348             : {
    1349           0 :         if (capable(CAP_SYS_TTY_CONFIG)) {
    1350           0 :                 tty_vhangup_self();
    1351           0 :                 return 0;
    1352             :         }
    1353             :         return -EPERM;
    1354             : }
    1355             : 
    1356             : /*
    1357             :  * Called when an inode is about to be open.
    1358             :  * We use this to disallow opening large files on 32bit systems if
    1359             :  * the caller didn't specify O_LARGEFILE.  On 64bit systems we force
    1360             :  * on this flag in sys_open.
    1361             :  */
    1362       10147 : int generic_file_open(struct inode * inode, struct file * filp)
    1363             : {
    1364       10147 :         if (!(filp->f_flags & O_LARGEFILE) && i_size_read(inode) > MAX_NON_LFS)
    1365           0 :                 return -EOVERFLOW;
    1366             :         return 0;
    1367             : }
    1368             : 
    1369             : EXPORT_SYMBOL(generic_file_open);
    1370             : 
    1371             : /*
    1372             :  * This is used by subsystems that don't want seekable
    1373             :  * file descriptors. The function is not supposed to ever fail, the only
    1374             :  * reason it returns an 'int' and not 'void' is so that it can be plugged
    1375             :  * directly into file_operations structure.
    1376             :  */
    1377         194 : int nonseekable_open(struct inode *inode, struct file *filp)
    1378             : {
    1379         194 :         filp->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE);
    1380         194 :         return 0;
    1381             : }
    1382             : 
    1383             : EXPORT_SYMBOL(nonseekable_open);
    1384             : 
    1385             : /*
    1386             :  * stream_open is used by subsystems that want stream-like file descriptors.
    1387             :  * Such file descriptors are not seekable and don't have notion of position
    1388             :  * (file.f_pos is always 0 and ppos passed to .read()/.write() is always NULL).
    1389             :  * Contrary to file descriptors of other regular files, .read() and .write()
    1390             :  * can run simultaneously.
    1391             :  *
    1392             :  * stream_open never fails and is marked to return int so that it could be
    1393             :  * directly used as file_operations.open .
    1394             :  */
    1395        1315 : int stream_open(struct inode *inode, struct file *filp)
    1396             : {
    1397        1315 :         filp->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE | FMODE_ATOMIC_POS);
    1398        1315 :         filp->f_mode |= FMODE_STREAM;
    1399        1315 :         return 0;
    1400             : }
    1401             : 
    1402             : EXPORT_SYMBOL(stream_open);

Generated by: LCOV version 1.14