svn commit: r345950 - in projects/fuse2: sys/fs/fuse tests/sys/fs/fusefs
Alan Somers
asomers at FreeBSD.org
Tue Sep 3 14:06:17 UTC 2019
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();
More information about the svn-src-projects
mailing list