|
@@ -340,17 +340,22 @@ int afs_permission(struct inode *inode, int mask)
|
|
|
} else {
|
|
|
if (!(access & AFS_ACE_LOOKUP))
|
|
|
goto permission_denied;
|
|
|
+ if ((mask & MAY_EXEC) && !(inode->i_mode & S_IXUSR))
|
|
|
+ goto permission_denied;
|
|
|
if (mask & (MAY_EXEC | MAY_READ)) {
|
|
|
if (!(access & AFS_ACE_READ))
|
|
|
goto permission_denied;
|
|
|
+ if (!(inode->i_mode & S_IRUSR))
|
|
|
+ goto permission_denied;
|
|
|
} else if (mask & MAY_WRITE) {
|
|
|
if (!(access & AFS_ACE_WRITE))
|
|
|
goto permission_denied;
|
|
|
+ if (!(inode->i_mode & S_IWUSR))
|
|
|
+ goto permission_denied;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
key_put(key);
|
|
|
- ret = generic_permission(inode, mask);
|
|
|
_leave(" = %d", ret);
|
|
|
return ret;
|
|
|
|