diff --git a/fs/vfs/operation/fs_other.c b/fs/vfs/operation/fs_other.c index fa935f96ec4f0f6eb9a7e2cc4d6d45fa9580d317..3b81073dff6555d1c8941ffa6755b7f8303dbdd6 100644 --- a/fs/vfs/operation/fs_other.c +++ b/fs/vfs/operation/fs_other.c @@ -107,20 +107,21 @@ int VfsPermissionCheck(uint fuid, uint fgid, uint fileMode, int accMode) tmpMode = 0; if (S_ISDIR(fileMode)) { - if (((uint)accMode & EXEC_OP) && (IsCapPermit(CAP_DAC_READ_SEARCH))) { + if (IsCapPermit(CAP_DAC_EXECUTE) + || (!((uint)accMode & WRITE_OP) && IsCapPermit(CAP_DAC_READ_SEARCH))) { tmpMode |= EXEC_OP; } } else { - if (((uint)accMode & EXEC_OP) && (IsCapPermit(CAP_DAC_EXECUTE)) && (fileMode & MODE_IXUGO)) { + if (IsCapPermit(CAP_DAC_EXECUTE) && (fileMode & MODE_IXUGO)) { tmpMode |= EXEC_OP; } } - if (((uint)accMode & WRITE_OP) && IsCapPermit(CAP_DAC_WRITE)) { + if (IsCapPermit(CAP_DAC_WRITE)) { tmpMode |= WRITE_OP; } - if (((uint)accMode & READ_OP) && IsCapPermit(CAP_DAC_READ_SEARCH)) { + if (IsCapPermit(CAP_DAC_READ_SEARCH)) { tmpMode |= READ_OP; }