diff options
Diffstat (limited to 'fs/afs/security.c')
-rw-r--r-- | fs/afs/security.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/afs/security.c b/fs/afs/security.c index 8d010422dc89..ecb86a670180 100644 --- a/fs/afs/security.c +++ b/fs/afs/security.c | |||
@@ -114,7 +114,7 @@ void afs_clear_permits(struct afs_vnode *vnode) | |||
114 | 114 | ||
115 | mutex_lock(&vnode->permits_lock); | 115 | mutex_lock(&vnode->permits_lock); |
116 | permits = vnode->permits; | 116 | permits = vnode->permits; |
117 | rcu_assign_pointer(vnode->permits, NULL); | 117 | RCU_INIT_POINTER(vnode->permits, NULL); |
118 | mutex_unlock(&vnode->permits_lock); | 118 | mutex_unlock(&vnode->permits_lock); |
119 | 119 | ||
120 | if (permits) | 120 | if (permits) |
@@ -340,17 +340,22 @@ int afs_permission(struct inode *inode, int mask) | |||
340 | } else { | 340 | } else { |
341 | if (!(access & AFS_ACE_LOOKUP)) | 341 | if (!(access & AFS_ACE_LOOKUP)) |
342 | goto permission_denied; | 342 | goto permission_denied; |
343 | if ((mask & MAY_EXEC) && !(inode->i_mode & S_IXUSR)) | ||
344 | goto permission_denied; | ||
343 | if (mask & (MAY_EXEC | MAY_READ)) { | 345 | if (mask & (MAY_EXEC | MAY_READ)) { |
344 | if (!(access & AFS_ACE_READ)) | 346 | if (!(access & AFS_ACE_READ)) |
345 | goto permission_denied; | 347 | goto permission_denied; |
348 | if (!(inode->i_mode & S_IRUSR)) | ||
349 | goto permission_denied; | ||
346 | } else if (mask & MAY_WRITE) { | 350 | } else if (mask & MAY_WRITE) { |
347 | if (!(access & AFS_ACE_WRITE)) | 351 | if (!(access & AFS_ACE_WRITE)) |
348 | goto permission_denied; | 352 | goto permission_denied; |
353 | if (!(inode->i_mode & S_IWUSR)) | ||
354 | goto permission_denied; | ||
349 | } | 355 | } |
350 | } | 356 | } |
351 | 357 | ||
352 | key_put(key); | 358 | key_put(key); |
353 | ret = generic_permission(inode, mask); | ||
354 | _leave(" = %d", ret); | 359 | _leave(" = %d", ret); |
355 | return ret; | 360 | return ret; |
356 | 361 | ||