74 lines
1.8 KiB
Plaintext
74 lines
1.8 KiB
Plaintext
--- fs/namei.c
|
|
+++ fs/namei.c
|
|
@@ -327,36 +327,6 @@ static inline int do_inode_permission(struct inode *inode, int mask)
|
|
return generic_permission(inode, mask);
|
|
}
|
|
|
|
-/**
|
|
- * inode_only_permission - check access rights to a given inode only
|
|
- * @inode: inode to check permissions on
|
|
- * @mask: right to check for (%MAY_READ, %MAY_WRITE, %MAY_EXEC, ...)
|
|
- *
|
|
- * Uses to check read/write/execute permissions on an inode directly, we do
|
|
- * not check filesystem permissions.
|
|
- */
|
|
-int inode_only_permission(struct inode *inode, int mask)
|
|
-{
|
|
- int retval;
|
|
-
|
|
- /*
|
|
- * Nobody gets write access to an immutable file.
|
|
- */
|
|
- if (unlikely(mask & MAY_WRITE) && IS_IMMUTABLE(inode))
|
|
- return -EACCES;
|
|
-
|
|
- retval = do_inode_permission(inode, mask);
|
|
- if (retval)
|
|
- return retval;
|
|
-
|
|
- retval = devcgroup_inode_permission(inode, mask);
|
|
- if (retval)
|
|
- return retval;
|
|
-
|
|
- return security_inode_permission(inode, mask);
|
|
-}
|
|
-EXPORT_SYMBOL(inode_only_permission);
|
|
-
|
|
/**
|
|
* inode_permission - check for access rights to a given inode
|
|
* @inode: inode to check permission on
|
|
@@ -371,6 +341,8 @@ static inline int do_inode_permission(struct inode *inode, int mask)
|
|
*/
|
|
int inode_permission(struct inode *inode, int mask)
|
|
{
|
|
+ int retval;
|
|
+
|
|
if (unlikely(mask & MAY_WRITE)) {
|
|
umode_t mode = inode->i_mode;
|
|
|
|
@@ -380,9 +352,23 @@ int inode_permission(struct inode *inode, int mask)
|
|
if (IS_RDONLY(inode) &&
|
|
(S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)))
|
|
return -EROFS;
|
|
+
|
|
+ /*
|
|
+ * Nobody gets write access to an immutable file.
|
|
+ */
|
|
+ if (IS_IMMUTABLE(inode))
|
|
+ return -EACCES;
|
|
}
|
|
|
|
- return inode_only_permission(inode, mask);
|
|
+ retval = do_inode_permission(inode, mask);
|
|
+ if (retval)
|
|
+ return retval;
|
|
+
|
|
+ retval = devcgroup_inode_permission(inode, mask);
|
|
+ if (retval)
|
|
+ return retval;
|
|
+
|
|
+ return security_inode_permission(inode, mask);
|
|
}
|
|
|
|
/**
|