From 52e9dd26a6778af1c4db276ced8ff3e12aae01b5 Mon Sep 17 00:00:00 2001 From: Mayank Raghuwanshi Date: Mon, 4 Oct 2021 16:39:24 +0530 Subject: [PATCH] Modify canRead and CanWrite functions of fsaccess class Signed-off-by: Mayank Raghuwanshi --- .../tools/source/sysman/linux/fs_access.cpp | 18 ++--- .../tools/source/sysman/linux/fs_access.h | 1 + .../sysman/linux/mock_sysman_fixture.h | 1 + .../sources/sysman/linux/test_sysman.cpp | 66 +++++++++++++++++++ 4 files changed, 78 insertions(+), 8 deletions(-) diff --git a/level_zero/tools/source/sysman/linux/fs_access.cpp b/level_zero/tools/source/sysman/linux/fs_access.cpp index 62c78e0300..44d13e975e 100644 --- a/level_zero/tools/source/sysman/linux/fs_access.cpp +++ b/level_zero/tools/source/sysman/linux/fs_access.cpp @@ -168,23 +168,25 @@ ze_result_t FsAccess::write(const std::string file, const std::string val) { } ze_result_t FsAccess::canRead(const std::string file) { - if (access(file.c_str(), F_OK)) { + struct stat sb; + if (statSyscall(file.c_str(), &sb) != 0) { return ZE_RESULT_ERROR_UNKNOWN; } - if (access(file.c_str(), R_OK)) { - return ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS; + if (sb.st_mode & S_IRUSR) { + return ZE_RESULT_SUCCESS; } - return ZE_RESULT_SUCCESS; + return ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS; } ze_result_t FsAccess::canWrite(const std::string file) { - if (access(file.c_str(), F_OK)) { + struct stat sb; + if (statSyscall(file.c_str(), &sb) != 0) { return ZE_RESULT_ERROR_UNKNOWN; } - if (access(file.c_str(), W_OK)) { - return ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS; + if (sb.st_mode & S_IWUSR) { + return ZE_RESULT_SUCCESS; } - return ZE_RESULT_SUCCESS; + return ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS; } bool FsAccess::fileExists(const std::string file) { diff --git a/level_zero/tools/source/sysman/linux/fs_access.h b/level_zero/tools/source/sysman/linux/fs_access.h index 5cbe58b773..a6431bb983 100644 --- a/level_zero/tools/source/sysman/linux/fs_access.h +++ b/level_zero/tools/source/sysman/linux/fs_access.h @@ -55,6 +55,7 @@ class FsAccess { protected: FsAccess(); decltype(&NEO::SysCalls::access) accessSyscall = NEO::SysCalls::access; + decltype(&stat) statSyscall = stat; }; class ProcfsAccess : private FsAccess { diff --git a/level_zero/tools/test/unit_tests/sources/sysman/linux/mock_sysman_fixture.h b/level_zero/tools/test/unit_tests/sources/sysman/linux/mock_sysman_fixture.h index b915d21355..cd4539790a 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/linux/mock_sysman_fixture.h +++ b/level_zero/tools/test/unit_tests/sources/sysman/linux/mock_sysman_fixture.h @@ -134,6 +134,7 @@ class SysmanMultiDeviceFixture : public MultiDeviceFixture, public ::testing::Te class PublicFsAccess : public L0::FsAccess { public: using FsAccess::accessSyscall; + using FsAccess::statSyscall; }; class PublicSysfsAccess : public L0::SysfsAccess { diff --git a/level_zero/tools/test/unit_tests/sources/sysman/linux/test_sysman.cpp b/level_zero/tools/test/unit_tests/sources/sysman/linux/test_sysman.cpp index 92e2dbb5fc..6e7c0e16c2 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/linux/test_sysman.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/linux/test_sysman.cpp @@ -20,6 +20,20 @@ inline static int mockAccessSuccess(const char *pathname, int mode) { return 0; } +inline static int mockStatFailure(const char *pathname, struct stat *sb) noexcept { + return -1; +} + +inline static int mockStatSuccess(const char *pathname, struct stat *sb) noexcept { + sb->st_mode = S_IWUSR | S_IRUSR; + return 0; +} + +inline static int mockStatNoPermissions(const char *pathname, struct stat *sb) noexcept { + sb->st_mode = 0; + return 0; +} + TEST_F(SysmanDeviceFixture, GivenValidDeviceHandleInSysmanImpCreationWhenAllSysmanInterfacesAreAssignedToNullThenExpectSysmanDeviceModuleContextsAreNull) { ze_device_handle_t hSysman = device->toHandle(); SysmanDeviceImp *sysmanImp = new SysmanDeviceImp(hSysman); @@ -161,6 +175,58 @@ TEST_F(SysmanDeviceFixture, GivenPublicSysfsAccessClassWhenCallingDirectoryExist delete tempSysfsAccess; } +TEST_F(SysmanDeviceFixture, GivenPublicFsAccessClassWhenCallingCanWriteWithUserHavingWritePermissionsThenSuccessIsReturned) { + PublicFsAccess *tempFsAccess = new PublicFsAccess(); + tempFsAccess->statSyscall = mockStatSuccess; + char cwd[PATH_MAX]; + std::string path = getcwd(cwd, PATH_MAX); + EXPECT_EQ(ZE_RESULT_SUCCESS, tempFsAccess->canWrite(path)); + delete tempFsAccess; +} + +TEST_F(SysmanDeviceFixture, GivenPublicFsAccessClassWhenCallingCanReadWithUserHavingReadPermissionsThenSuccessIsReturned) { + PublicFsAccess *tempFsAccess = new PublicFsAccess(); + tempFsAccess->statSyscall = mockStatSuccess; + char cwd[PATH_MAX]; + std::string path = getcwd(cwd, PATH_MAX); + EXPECT_EQ(ZE_RESULT_SUCCESS, tempFsAccess->canRead(path)); + delete tempFsAccess; +} + +TEST_F(SysmanDeviceFixture, GivenPublicFsAccessClassWhenCallingCanWriteWithUserNotHavingWritePermissionsThenInsufficientIsReturned) { + PublicFsAccess *tempFsAccess = new PublicFsAccess(); + tempFsAccess->statSyscall = mockStatNoPermissions; + char cwd[PATH_MAX]; + std::string path = getcwd(cwd, PATH_MAX); + EXPECT_EQ(ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS, tempFsAccess->canWrite(path)); + delete tempFsAccess; +} + +TEST_F(SysmanDeviceFixture, GivenPublicFsAccessClassWhenCallingCanReadWithUserNotHavingReadPermissionsThenInsufficientIsReturned) { + PublicFsAccess *tempFsAccess = new PublicFsAccess(); + tempFsAccess->statSyscall = mockStatNoPermissions; + char cwd[PATH_MAX]; + std::string path = getcwd(cwd, PATH_MAX); + EXPECT_EQ(ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS, tempFsAccess->canRead(path)); + delete tempFsAccess; +} + +TEST_F(SysmanDeviceFixture, GivenPublicFsAccessClassWhenCallingCanReadWithInvalidPathThenErrorIsReturned) { + PublicFsAccess *tempFsAccess = new PublicFsAccess(); + tempFsAccess->statSyscall = mockStatFailure; + std::string path = "invalidPath"; + EXPECT_EQ(ZE_RESULT_ERROR_UNKNOWN, tempFsAccess->canRead(path)); + delete tempFsAccess; +} + +TEST_F(SysmanDeviceFixture, GivenPublicFsAccessClassWhenCallingCanWriteWithInvalidPathThenErrorIsReturned) { + PublicFsAccess *tempFsAccess = new PublicFsAccess(); + tempFsAccess->statSyscall = mockStatFailure; + std::string path = "invalidPath"; + EXPECT_EQ(ZE_RESULT_ERROR_UNKNOWN, tempFsAccess->canRead(path)); + delete tempFsAccess; +} + TEST_F(SysmanDeviceFixture, GivenValidPathnameWhenCallingFsAccessExistsThenSuccessIsReturned) { auto FsAccess = pLinuxSysmanImp->getFsAccess();