diff options
Diffstat (limited to 'fs/namei.c')
| -rw-r--r-- | fs/namei.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/namei.c b/fs/namei.c index 55a131230f94..432d6bc6fab0 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -227,10 +227,10 @@ int generic_permission(struct inode *inode, int mask, | |||
| 227 | 227 | ||
| 228 | int permission(struct inode *inode, int mask, struct nameidata *nd) | 228 | int permission(struct inode *inode, int mask, struct nameidata *nd) |
| 229 | { | 229 | { |
| 230 | umode_t mode = inode->i_mode; | ||
| 230 | int retval, submask; | 231 | int retval, submask; |
| 231 | 232 | ||
| 232 | if (mask & MAY_WRITE) { | 233 | if (mask & MAY_WRITE) { |
| 233 | umode_t mode = inode->i_mode; | ||
| 234 | 234 | ||
| 235 | /* | 235 | /* |
| 236 | * Nobody gets write access to a read-only fs. | 236 | * Nobody gets write access to a read-only fs. |
| @@ -247,6 +247,13 @@ int permission(struct inode *inode, int mask, struct nameidata *nd) | |||
| 247 | } | 247 | } |
| 248 | 248 | ||
| 249 | 249 | ||
| 250 | /* | ||
| 251 | * MAY_EXEC on regular files requires special handling: We override | ||
| 252 | * filesystem execute permissions if the mode bits aren't set. | ||
| 253 | */ | ||
| 254 | if ((mask & MAY_EXEC) && S_ISREG(mode) && !(mode & S_IXUGO)) | ||
| 255 | return -EACCES; | ||
| 256 | |||
| 250 | /* Ordinary permission routines do not understand MAY_APPEND. */ | 257 | /* Ordinary permission routines do not understand MAY_APPEND. */ |
| 251 | submask = mask & ~MAY_APPEND; | 258 | submask = mask & ~MAY_APPEND; |
| 252 | if (inode->i_op && inode->i_op->permission) | 259 | if (inode->i_op && inode->i_op->permission) |
| @@ -1767,6 +1774,8 @@ struct dentry *lookup_create(struct nameidata *nd, int is_dir) | |||
| 1767 | if (nd->last_type != LAST_NORM) | 1774 | if (nd->last_type != LAST_NORM) |
| 1768 | goto fail; | 1775 | goto fail; |
| 1769 | nd->flags &= ~LOOKUP_PARENT; | 1776 | nd->flags &= ~LOOKUP_PARENT; |
| 1777 | nd->flags |= LOOKUP_CREATE; | ||
| 1778 | nd->intent.open.flags = O_EXCL; | ||
| 1770 | 1779 | ||
| 1771 | /* | 1780 | /* |
| 1772 | * Do the final lookup. | 1781 | * Do the final lookup. |
