xref: /openbmc/linux/fs/attr.c (revision 6fa79bcaecdbb0eb417afbc7fb0a8fa204308b62)
1  /*
2   *  linux/fs/attr.c
3   *
4   *  Copyright (C) 1991, 1992  Linus Torvalds
5   *  changes by Thomas Schoebel-Theuer
6   */
7  
8  #include <linux/export.h>
9  #include <linux/time.h>
10  #include <linux/mm.h>
11  #include <linux/string.h>
12  #include <linux/capability.h>
13  #include <linux/fsnotify.h>
14  #include <linux/fcntl.h>
15  #include <linux/security.h>
16  #include <linux/evm.h>
17  #include <linux/ima.h>
18  
19  /**
20   * inode_change_ok - check if attribute changes to an inode are allowed
21   * @inode:	inode to check
22   * @attr:	attributes to change
23   *
24   * Check if we are allowed to change the attributes contained in @attr
25   * in the given inode.  This includes the normal unix access permission
26   * checks, as well as checks for rlimits and others.
27   *
28   * Should be called as the first thing in ->setattr implementations,
29   * possibly after taking additional locks.
30   */
31  int inode_change_ok(const struct inode *inode, struct iattr *attr)
32  {
33  	unsigned int ia_valid = attr->ia_valid;
34  
35  	/*
36  	 * First check size constraints.  These can't be overriden using
37  	 * ATTR_FORCE.
38  	 */
39  	if (ia_valid & ATTR_SIZE) {
40  		int error = inode_newsize_ok(inode, attr->ia_size);
41  		if (error)
42  			return error;
43  	}
44  
45  	/* If force is set do it anyway. */
46  	if (ia_valid & ATTR_FORCE)
47  		return 0;
48  
49  	/* Make sure a caller can chown. */
50  	if ((ia_valid & ATTR_UID) &&
51  	    (!uid_eq(current_fsuid(), inode->i_uid) ||
52  	     !uid_eq(attr->ia_uid, inode->i_uid)) && !capable(CAP_CHOWN))
53  		return -EPERM;
54  
55  	/* Make sure caller can chgrp. */
56  	if ((ia_valid & ATTR_GID) &&
57  	    (!uid_eq(current_fsuid(), inode->i_uid) ||
58  	    (!in_group_p(attr->ia_gid) && !gid_eq(attr->ia_gid, inode->i_gid))) &&
59  	    !capable(CAP_CHOWN))
60  		return -EPERM;
61  
62  	/* Make sure a caller can chmod. */
63  	if (ia_valid & ATTR_MODE) {
64  		if (!inode_owner_or_capable(inode))
65  			return -EPERM;
66  		/* Also check the setgid bit! */
67  		if (!in_group_p((ia_valid & ATTR_GID) ? attr->ia_gid :
68  				inode->i_gid) && !capable(CAP_FSETID))
69  			attr->ia_mode &= ~S_ISGID;
70  	}
71  
72  	/* Check for setting the inode time. */
73  	if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET | ATTR_TIMES_SET)) {
74  		if (!inode_owner_or_capable(inode))
75  			return -EPERM;
76  	}
77  
78  	return 0;
79  }
80  EXPORT_SYMBOL(inode_change_ok);
81  
82  /**
83   * inode_newsize_ok - may this inode be truncated to a given size
84   * @inode:	the inode to be truncated
85   * @offset:	the new size to assign to the inode
86   * @Returns:	0 on success, -ve errno on failure
87   *
88   * inode_newsize_ok must be called with i_mutex held.
89   *
90   * inode_newsize_ok will check filesystem limits and ulimits to check that the
91   * new inode size is within limits. inode_newsize_ok will also send SIGXFSZ
92   * when necessary. Caller must not proceed with inode size change if failure is
93   * returned. @inode must be a file (not directory), with appropriate
94   * permissions to allow truncate (inode_newsize_ok does NOT check these
95   * conditions).
96   */
97  int inode_newsize_ok(const struct inode *inode, loff_t offset)
98  {
99  	if (inode->i_size < offset) {
100  		unsigned long limit;
101  
102  		limit = rlimit(RLIMIT_FSIZE);
103  		if (limit != RLIM_INFINITY && offset > limit)
104  			goto out_sig;
105  		if (offset > inode->i_sb->s_maxbytes)
106  			goto out_big;
107  	} else {
108  		/*
109  		 * truncation of in-use swapfiles is disallowed - it would
110  		 * cause subsequent swapout to scribble on the now-freed
111  		 * blocks.
112  		 */
113  		if (IS_SWAPFILE(inode))
114  			return -ETXTBSY;
115  	}
116  
117  	return 0;
118  out_sig:
119  	send_sig(SIGXFSZ, current, 0);
120  out_big:
121  	return -EFBIG;
122  }
123  EXPORT_SYMBOL(inode_newsize_ok);
124  
125  /**
126   * setattr_copy - copy simple metadata updates into the generic inode
127   * @inode:	the inode to be updated
128   * @attr:	the new attributes
129   *
130   * setattr_copy must be called with i_mutex held.
131   *
132   * setattr_copy updates the inode's metadata with that specified
133   * in attr. Noticeably missing is inode size update, which is more complex
134   * as it requires pagecache updates.
135   *
136   * The inode is not marked as dirty after this operation. The rationale is
137   * that for "simple" filesystems, the struct inode is the inode storage.
138   * The caller is free to mark the inode dirty afterwards if needed.
139   */
140  void setattr_copy(struct inode *inode, const struct iattr *attr)
141  {
142  	unsigned int ia_valid = attr->ia_valid;
143  
144  	if (ia_valid & ATTR_UID)
145  		inode->i_uid = attr->ia_uid;
146  	if (ia_valid & ATTR_GID)
147  		inode->i_gid = attr->ia_gid;
148  	if (ia_valid & ATTR_ATIME)
149  		inode->i_atime = timespec_trunc(attr->ia_atime,
150  						inode->i_sb->s_time_gran);
151  	if (ia_valid & ATTR_MTIME)
152  		inode->i_mtime = timespec_trunc(attr->ia_mtime,
153  						inode->i_sb->s_time_gran);
154  	if (ia_valid & ATTR_CTIME)
155  		inode->i_ctime = timespec_trunc(attr->ia_ctime,
156  						inode->i_sb->s_time_gran);
157  	if (ia_valid & ATTR_MODE) {
158  		umode_t mode = attr->ia_mode;
159  
160  		if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
161  			mode &= ~S_ISGID;
162  		inode->i_mode = mode;
163  	}
164  }
165  EXPORT_SYMBOL(setattr_copy);
166  
167  int notify_change(struct dentry * dentry, struct iattr * attr)
168  {
169  	struct inode *inode = dentry->d_inode;
170  	umode_t mode = inode->i_mode;
171  	int error;
172  	struct timespec now;
173  	unsigned int ia_valid = attr->ia_valid;
174  
175  	WARN_ON_ONCE(!mutex_is_locked(&inode->i_mutex));
176  
177  	if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID | ATTR_TIMES_SET)) {
178  		if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
179  			return -EPERM;
180  	}
181  
182  	if ((ia_valid & ATTR_SIZE) && IS_I_VERSION(inode)) {
183  		if (attr->ia_size != inode->i_size)
184  			inode_inc_iversion(inode);
185  	}
186  
187  	if ((ia_valid & ATTR_MODE)) {
188  		umode_t amode = attr->ia_mode;
189  		/* Flag setting protected by i_mutex */
190  		if (is_sxid(amode))
191  			inode->i_flags &= ~S_NOSEC;
192  	}
193  
194  	now = current_fs_time(inode->i_sb);
195  
196  	attr->ia_ctime = now;
197  	if (!(ia_valid & ATTR_ATIME_SET))
198  		attr->ia_atime = now;
199  	if (!(ia_valid & ATTR_MTIME_SET))
200  		attr->ia_mtime = now;
201  	if (ia_valid & ATTR_KILL_PRIV) {
202  		attr->ia_valid &= ~ATTR_KILL_PRIV;
203  		ia_valid &= ~ATTR_KILL_PRIV;
204  		error = security_inode_need_killpriv(dentry);
205  		if (error > 0)
206  			error = security_inode_killpriv(dentry);
207  		if (error)
208  			return error;
209  	}
210  
211  	/*
212  	 * We now pass ATTR_KILL_S*ID to the lower level setattr function so
213  	 * that the function has the ability to reinterpret a mode change
214  	 * that's due to these bits. This adds an implicit restriction that
215  	 * no function will ever call notify_change with both ATTR_MODE and
216  	 * ATTR_KILL_S*ID set.
217  	 */
218  	if ((ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID)) &&
219  	    (ia_valid & ATTR_MODE))
220  		BUG();
221  
222  	if (ia_valid & ATTR_KILL_SUID) {
223  		if (mode & S_ISUID) {
224  			ia_valid = attr->ia_valid |= ATTR_MODE;
225  			attr->ia_mode = (inode->i_mode & ~S_ISUID);
226  		}
227  	}
228  	if (ia_valid & ATTR_KILL_SGID) {
229  		if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
230  			if (!(ia_valid & ATTR_MODE)) {
231  				ia_valid = attr->ia_valid |= ATTR_MODE;
232  				attr->ia_mode = inode->i_mode;
233  			}
234  			attr->ia_mode &= ~S_ISGID;
235  		}
236  	}
237  	if (!(attr->ia_valid & ~(ATTR_KILL_SUID | ATTR_KILL_SGID)))
238  		return 0;
239  
240  	error = security_inode_setattr(dentry, attr);
241  	if (error)
242  		return error;
243  
244  	if (inode->i_op->setattr)
245  		error = inode->i_op->setattr(dentry, attr);
246  	else
247  		error = simple_setattr(dentry, attr);
248  
249  	if (!error) {
250  		fsnotify_change(dentry, ia_valid);
251  		ima_inode_post_setattr(dentry);
252  		evm_inode_post_setattr(dentry, ia_valid);
253  	}
254  
255  	return error;
256  }
257  EXPORT_SYMBOL(notify_change);
258