Date: Tue, 03 Sep 2019 14:06:17 -0000 From: Alan Somers <asomers@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r345950 - in projects/fuse2: sys/fs/fuse tests/sys/fs/fusefs Message-ID: <201904051533.x35FXi7h064532@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: asomers Date: Fri Apr 5 15:33:43 2019 New Revision: 345950 URL: https://svnweb.freebsd.org/changeset/base/345950 Log: fusefs: correctly return EROFS from VOP_ACCESS Sponsored by: The FreeBSD Foundation Modified: projects/fuse2/sys/fs/fuse/fuse_internal.c projects/fuse2/tests/sys/fs/fusefs/access.cc projects/fuse2/tests/sys/fs/fusefs/mockfs.cc projects/fuse2/tests/sys/fs/fusefs/mockfs.hh projects/fuse2/tests/sys/fs/fusefs/utils.cc projects/fuse2/tests/sys/fs/fusefs/utils.hh Modified: projects/fuse2/sys/fs/fuse/fuse_internal.c ============================================================================== --- projects/fuse2/sys/fs/fuse/fuse_internal.c Fri Apr 5 15:04:25 2019 (r345949) +++ projects/fuse2/sys/fs/fuse/fuse_internal.c Fri Apr 5 15:33:43 2019 (r345950) @@ -137,7 +137,7 @@ fuse_internal_access(struct vnode *vp, dataflags = data->dataflags; if ((mode & VWRITE) && vfs_isrdonly(mp)) { - return EACCES; + return EROFS; } /* Unless explicitly permitted, deny everyone except the fs owner. */ if (vnode_isvroot(vp) && !(facp->facc_flags & FACCESS_NOCHECKSPY)) { Modified: projects/fuse2/tests/sys/fs/fusefs/access.cc ============================================================================== --- projects/fuse2/tests/sys/fs/fusefs/access.cc Fri Apr 5 15:04:25 2019 (r345949) +++ projects/fuse2/tests/sys/fs/fusefs/access.cc Fri Apr 5 15:33:43 2019 (r345950) @@ -46,6 +46,14 @@ void expect_lookup(const char *relpath, uint64_t ino) } }; +class RofsAccess: public Access { +public: +virtual void SetUp() { + m_ro = true; + Access::SetUp(); +} +}; + /* The error case of FUSE_ACCESS. */ /* https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=236291 */ TEST_F(Access, DISABLED_eaccess) @@ -81,6 +89,19 @@ TEST_F(Access, DISABLED_enosys) ASSERT_EQ(0, access(FULLPATH, access_mode)) << strerror(errno); ASSERT_EQ(0, access(FULLPATH, access_mode)) << strerror(errno); +} + +TEST_F(RofsAccess, erofs) +{ + const char FULLPATH[] = "mountpoint/some_file.txt"; + const char RELPATH[] = "some_file.txt"; + uint64_t ino = 42; + mode_t access_mode = W_OK; + + expect_lookup(RELPATH, ino); + + ASSERT_NE(0, access(FULLPATH, access_mode)); + ASSERT_EQ(EROFS, errno); } /* The successful case of FUSE_ACCESS. */ Modified: projects/fuse2/tests/sys/fs/fusefs/mockfs.cc ============================================================================== --- projects/fuse2/tests/sys/fs/fusefs/mockfs.cc Fri Apr 5 15:04:25 2019 (r345949) +++ projects/fuse2/tests/sys/fs/fusefs/mockfs.cc Fri Apr 5 15:33:43 2019 (r345950) @@ -258,7 +258,7 @@ void debug_fuseop(const mockfs_buf_in *in) } MockFS::MockFS(int max_readahead, bool allow_other, bool default_permissions, - bool push_symlinks_in, uint32_t flags) + bool push_symlinks_in, bool ro, uint32_t flags) { struct iovec *iov = NULL; int iovlen = 0; @@ -305,6 +305,10 @@ MockFS::MockFS(int max_readahead, bool allow_other, bo } if (push_symlinks_in) { build_iovec(&iov, &iovlen, "push_symlinks_in", + __DECONST(void*, &trueval), sizeof(bool)); + } + if (ro) { + build_iovec(&iov, &iovlen, "ro", __DECONST(void*, &trueval), sizeof(bool)); } if (nmount(iov, iovlen, 0)) Modified: projects/fuse2/tests/sys/fs/fusefs/mockfs.hh ============================================================================== --- projects/fuse2/tests/sys/fs/fusefs/mockfs.hh Fri Apr 5 15:04:25 2019 (r345949) +++ projects/fuse2/tests/sys/fs/fusefs/mockfs.hh Fri Apr 5 15:33:43 2019 (r345950) @@ -216,7 +216,7 @@ class MockFS { /* Create a new mockfs and mount it to a tempdir */ MockFS(int max_readahead, bool allow_other, - bool default_permissions, bool push_symlinks_in, + bool default_permissions, bool push_symlinks_in, bool ro, uint32_t flags); virtual ~MockFS(); Modified: projects/fuse2/tests/sys/fs/fusefs/utils.cc ============================================================================== --- projects/fuse2/tests/sys/fs/fusefs/utils.cc Fri Apr 5 15:04:25 2019 (r345949) +++ projects/fuse2/tests/sys/fs/fusefs/utils.cc Fri Apr 5 15:33:43 2019 (r345950) @@ -94,7 +94,7 @@ void FuseTest::SetUp() { try { m_mock = new MockFS(m_maxreadahead, m_allow_other, - m_default_permissions, m_push_symlinks_in, + m_default_permissions, m_push_symlinks_in, m_ro, m_init_flags); } catch (std::system_error err) { FAIL() << err.what(); Modified: projects/fuse2/tests/sys/fs/fusefs/utils.hh ============================================================================== --- projects/fuse2/tests/sys/fs/fusefs/utils.hh Fri Apr 5 15:04:25 2019 (r345949) +++ projects/fuse2/tests/sys/fs/fusefs/utils.hh Fri Apr 5 15:33:43 2019 (r345950) @@ -44,6 +44,7 @@ class FuseTest : public ::testing::Test { bool m_allow_other; bool m_default_permissions; bool m_push_symlinks_in; + bool m_ro; MockFS *m_mock = NULL; const static uint64_t FH = 0xdeadbeef1a7ebabe; @@ -59,7 +60,8 @@ class FuseTest : public ::testing::Test { m_init_flags(0), m_allow_other(false), m_default_permissions(false), - m_push_symlinks_in(false) + m_push_symlinks_in(false), + m_ro(false) {} virtual void SetUp();
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201904051533.x35FXi7h064532>