linux/fs/attr.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 *  linux/fs/attr.c
   4 *
   5 *  Copyright (C) 1991, 1992  Linus Torvalds
   6 *  changes by Thomas Schoebel-Theuer
   7 */
   8
   9#include <linux/export.h>
  10#include <linux/time.h>
  11#include <linux/mm.h>
  12#include <linux/string.h>
  13#include <linux/sched/signal.h>
  14#include <linux/capability.h>
  15#include <linux/fsnotify.h>
  16#include <linux/fcntl.h>
  17#include <linux/security.h>
  18#include <linux/evm.h>
  19#include <linux/ima.h>
  20
  21/**
  22 * setattr_prepare - check if attribute changes to a dentry are allowed
  23 * @dentry:     dentry to check
  24 * @attr:       attributes to change
  25 *
  26 * Check if we are allowed to change the attributes contained in @attr
  27 * in the given dentry.  This includes the normal unix access permission
  28 * checks, as well as checks for rlimits and others. The function also clears
  29 * SGID bit from mode if user is not allowed to set it. Also file capabilities
  30 * and IMA extended attributes are cleared if ATTR_KILL_PRIV is set.
  31 *
  32 * Should be called as the first thing in ->setattr implementations,
  33 * possibly after taking additional locks.
  34 */
  35int setattr_prepare(struct dentry *dentry, struct iattr *attr)
  36{
  37        struct inode *inode = d_inode(dentry);
  38        unsigned int ia_valid = attr->ia_valid;
  39
  40        /*
  41         * First check size constraints.  These can't be overriden using
  42         * ATTR_FORCE.
  43         */
  44        if (ia_valid & ATTR_SIZE) {
  45                int error = inode_newsize_ok(inode, attr->ia_size);
  46                if (error)
  47                        return error;
  48        }
  49
  50        /* If force is set do it anyway. */
  51        if (ia_valid & ATTR_FORCE)
  52                goto kill_priv;
  53
  54        /* Make sure a caller can chown. */
  55        if ((ia_valid & ATTR_UID) &&
  56            (!uid_eq(current_fsuid(), inode->i_uid) ||
  57             !uid_eq(attr->ia_uid, inode->i_uid)) &&
  58            !capable_wrt_inode_uidgid(inode, CAP_CHOWN))
  59                return -EPERM;
  60
  61        /* Make sure caller can chgrp. */
  62        if ((ia_valid & ATTR_GID) &&
  63            (!uid_eq(current_fsuid(), inode->i_uid) ||
  64            (!in_group_p(attr->ia_gid) && !gid_eq(attr->ia_gid, inode->i_gid))) &&
  65            !capable_wrt_inode_uidgid(inode, CAP_CHOWN))
  66                return -EPERM;
  67
  68        /* Make sure a caller can chmod. */
  69        if (ia_valid & ATTR_MODE) {
  70                if (!inode_owner_or_capable(inode))
  71                        return -EPERM;
  72                /* Also check the setgid bit! */
  73                if (!in_group_p((ia_valid & ATTR_GID) ? attr->ia_gid :
  74                                inode->i_gid) &&
  75                    !capable_wrt_inode_uidgid(inode, CAP_FSETID))
  76                        attr->ia_mode &= ~S_ISGID;
  77        }
  78
  79        /* Check for setting the inode time. */
  80        if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET | ATTR_TIMES_SET)) {
  81                if (!inode_owner_or_capable(inode))
  82                        return -EPERM;
  83        }
  84
  85kill_priv:
  86        /* User has permission for the change */
  87        if (ia_valid & ATTR_KILL_PRIV) {
  88                int error;
  89
  90                error = security_inode_killpriv(dentry);
  91                if (error)
  92                        return error;
  93        }
  94
  95        return 0;
  96}
  97EXPORT_SYMBOL(setattr_prepare);
  98
  99/**
 100 * inode_newsize_ok - may this inode be truncated to a given size
 101 * @inode:      the inode to be truncated
 102 * @offset:     the new size to assign to the inode
 103 * @Returns:    0 on success, -ve errno on failure
 104 *
 105 * inode_newsize_ok must be called with i_mutex held.
 106 *
 107 * inode_newsize_ok will check filesystem limits and ulimits to check that the
 108 * new inode size is within limits. inode_newsize_ok will also send SIGXFSZ
 109 * when necessary. Caller must not proceed with inode size change if failure is
 110 * returned. @inode must be a file (not directory), with appropriate
 111 * permissions to allow truncate (inode_newsize_ok does NOT check these
 112 * conditions).
 113 */
 114int inode_newsize_ok(const struct inode *inode, loff_t offset)
 115{
 116        if (inode->i_size < offset) {
 117                unsigned long limit;
 118
 119                limit = rlimit(RLIMIT_FSIZE);
 120                if (limit != RLIM_INFINITY && offset > limit)
 121                        goto out_sig;
 122                if (offset > inode->i_sb->s_maxbytes)
 123                        goto out_big;
 124        } else {
 125                /*
 126                 * truncation of in-use swapfiles is disallowed - it would
 127                 * cause subsequent swapout to scribble on the now-freed
 128                 * blocks.
 129                 */
 130                if (IS_SWAPFILE(inode))
 131                        return -ETXTBSY;
 132        }
 133
 134        return 0;
 135out_sig:
 136        send_sig(SIGXFSZ, current, 0);
 137out_big:
 138        return -EFBIG;
 139}
 140EXPORT_SYMBOL(inode_newsize_ok);
 141
 142/**
 143 * setattr_copy - copy simple metadata updates into the generic inode
 144 * @inode:      the inode to be updated
 145 * @attr:       the new attributes
 146 *
 147 * setattr_copy must be called with i_mutex held.
 148 *
 149 * setattr_copy updates the inode's metadata with that specified
 150 * in attr. Noticeably missing is inode size update, which is more complex
 151 * as it requires pagecache updates.
 152 *
 153 * The inode is not marked as dirty after this operation. The rationale is
 154 * that for "simple" filesystems, the struct inode is the inode storage.
 155 * The caller is free to mark the inode dirty afterwards if needed.
 156 */
 157void setattr_copy(struct inode *inode, const struct iattr *attr)
 158{
 159        unsigned int ia_valid = attr->ia_valid;
 160
 161        if (ia_valid & ATTR_UID)
 162                inode->i_uid = attr->ia_uid;
 163        if (ia_valid & ATTR_GID)
 164                inode->i_gid = attr->ia_gid;
 165        if (ia_valid & ATTR_ATIME)
 166                inode->i_atime = timespec_trunc(attr->ia_atime,
 167                                                inode->i_sb->s_time_gran);
 168        if (ia_valid & ATTR_MTIME)
 169                inode->i_mtime = timespec_trunc(attr->ia_mtime,
 170                                                inode->i_sb->s_time_gran);
 171        if (ia_valid & ATTR_CTIME)
 172                inode->i_ctime = timespec_trunc(attr->ia_ctime,
 173                                                inode->i_sb->s_time_gran);
 174        if (ia_valid & ATTR_MODE) {
 175                umode_t mode = attr->ia_mode;
 176
 177                if (!in_group_p(inode->i_gid) &&
 178                    !capable_wrt_inode_uidgid(inode, CAP_FSETID))
 179                        mode &= ~S_ISGID;
 180                inode->i_mode = mode;
 181        }
 182}
 183EXPORT_SYMBOL(setattr_copy);
 184
 185/**
 186 * notify_change - modify attributes of a filesytem object
 187 * @dentry:     object affected
 188 * @iattr:      new attributes
 189 * @delegated_inode: returns inode, if the inode is delegated
 190 *
 191 * The caller must hold the i_mutex on the affected object.
 192 *
 193 * If notify_change discovers a delegation in need of breaking,
 194 * it will return -EWOULDBLOCK and return a reference to the inode in
 195 * delegated_inode.  The caller should then break the delegation and
 196 * retry.  Because breaking a delegation may take a long time, the
 197 * caller should drop the i_mutex before doing so.
 198 *
 199 * Alternatively, a caller may pass NULL for delegated_inode.  This may
 200 * be appropriate for callers that expect the underlying filesystem not
 201 * to be NFS exported.  Also, passing NULL is fine for callers holding
 202 * the file open for write, as there can be no conflicting delegation in
 203 * that case.
 204 */
 205int notify_change(struct dentry * dentry, struct iattr * attr, struct inode **delegated_inode)
 206{
 207        struct inode *inode = dentry->d_inode;
 208        umode_t mode = inode->i_mode;
 209        int error;
 210        struct timespec now;
 211        unsigned int ia_valid = attr->ia_valid;
 212
 213        WARN_ON_ONCE(!inode_is_locked(inode));
 214
 215        if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID | ATTR_TIMES_SET)) {
 216                if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
 217                        return -EPERM;
 218        }
 219
 220        /*
 221         * If utimes(2) and friends are called with times == NULL (or both
 222         * times are UTIME_NOW), then we need to check for write permission
 223         */
 224        if (ia_valid & ATTR_TOUCH) {
 225                if (IS_IMMUTABLE(inode))
 226                        return -EPERM;
 227
 228                if (!inode_owner_or_capable(inode)) {
 229                        error = inode_permission(inode, MAY_WRITE);
 230                        if (error)
 231                                return error;
 232                }
 233        }
 234
 235        if ((ia_valid & ATTR_MODE)) {
 236                umode_t amode = attr->ia_mode;
 237                /* Flag setting protected by i_mutex */
 238                if (is_sxid(amode))
 239                        inode->i_flags &= ~S_NOSEC;
 240        }
 241
 242        now = current_time(inode);
 243
 244        attr->ia_ctime = now;
 245        if (!(ia_valid & ATTR_ATIME_SET))
 246                attr->ia_atime = now;
 247        if (!(ia_valid & ATTR_MTIME_SET))
 248                attr->ia_mtime = now;
 249        if (ia_valid & ATTR_KILL_PRIV) {
 250                error = security_inode_need_killpriv(dentry);
 251                if (error < 0)
 252                        return error;
 253                if (error == 0)
 254                        ia_valid = attr->ia_valid &= ~ATTR_KILL_PRIV;
 255        }
 256
 257        /*
 258         * We now pass ATTR_KILL_S*ID to the lower level setattr function so
 259         * that the function has the ability to reinterpret a mode change
 260         * that's due to these bits. This adds an implicit restriction that
 261         * no function will ever call notify_change with both ATTR_MODE and
 262         * ATTR_KILL_S*ID set.
 263         */
 264        if ((ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID)) &&
 265            (ia_valid & ATTR_MODE))
 266                BUG();
 267
 268        if (ia_valid & ATTR_KILL_SUID) {
 269                if (mode & S_ISUID) {
 270                        ia_valid = attr->ia_valid |= ATTR_MODE;
 271                        attr->ia_mode = (inode->i_mode & ~S_ISUID);
 272                }
 273        }
 274        if (ia_valid & ATTR_KILL_SGID) {
 275                if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
 276                        if (!(ia_valid & ATTR_MODE)) {
 277                                ia_valid = attr->ia_valid |= ATTR_MODE;
 278                                attr->ia_mode = inode->i_mode;
 279                        }
 280                        attr->ia_mode &= ~S_ISGID;
 281                }
 282        }
 283        if (!(attr->ia_valid & ~(ATTR_KILL_SUID | ATTR_KILL_SGID)))
 284                return 0;
 285
 286        /*
 287         * Verify that uid/gid changes are valid in the target
 288         * namespace of the superblock.
 289         */
 290        if (ia_valid & ATTR_UID &&
 291            !kuid_has_mapping(inode->i_sb->s_user_ns, attr->ia_uid))
 292                return -EOVERFLOW;
 293        if (ia_valid & ATTR_GID &&
 294            !kgid_has_mapping(inode->i_sb->s_user_ns, attr->ia_gid))
 295                return -EOVERFLOW;
 296
 297        /* Don't allow modifications of files with invalid uids or
 298         * gids unless those uids & gids are being made valid.
 299         */
 300        if (!(ia_valid & ATTR_UID) && !uid_valid(inode->i_uid))
 301                return -EOVERFLOW;
 302        if (!(ia_valid & ATTR_GID) && !gid_valid(inode->i_gid))
 303                return -EOVERFLOW;
 304
 305        error = security_inode_setattr(dentry, attr);
 306        if (error)
 307                return error;
 308        error = try_break_deleg(inode, delegated_inode);
 309        if (error)
 310                return error;
 311
 312        if (inode->i_op->setattr)
 313                error = inode->i_op->setattr(dentry, attr);
 314        else
 315                error = simple_setattr(dentry, attr);
 316
 317        if (!error) {
 318                fsnotify_change(dentry, ia_valid);
 319                ima_inode_post_setattr(dentry);
 320                evm_inode_post_setattr(dentry, ia_valid);
 321        }
 322
 323        return error;
 324}
 325EXPORT_SYMBOL(notify_change);
 326