summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAlan Somers <asomers@FreeBSD.org>2023-10-05 16:13:05 +0000
committerAlan Somers <asomers@FreeBSD.org>2023-11-30 20:41:53 +0000
commite8dd46ee96c82ed06e5d79f503203a40719fb8d8 (patch)
tree7f0977233d3b18226003c47093a6bc6baf3a4327 /tests
parent7aaf39f6b3b0bc5cc171eac7ca118d17460ea5db (diff)
Diffstat (limited to 'tests')
-rw-r--r--tests/sys/fs/fusefs/readdir.cc87
1 files changed, 87 insertions, 0 deletions
diff --git a/tests/sys/fs/fusefs/readdir.cc b/tests/sys/fs/fusefs/readdir.cc
index 5fd8f25e8bb7..6b78e3a70697 100644
--- a/tests/sys/fs/fusefs/readdir.cc
+++ b/tests/sys/fs/fusefs/readdir.cc
@@ -321,6 +321,50 @@ TEST_F(Readdir, nodots)
leakdir(dir);
}
+/*
+ * FUSE_READDIR returns a path with an embedded NUL. Obviously illegal, but
+ * nothing bad should happen.
+ */
+TEST_F(Readdir, nul)
+{
+ const char FULLPATH[] = "mountpoint/some_dir";
+ const char RELPATH[] = "some_dir";
+ uint64_t ino = 42;
+ DIR *dir;
+ struct dirent *de;
+ vector<struct dirent> ents(1);
+ vector<struct dirent> empty_ents(0);
+ const char nul[] = "foo\0bar";
+
+ expect_lookup(RELPATH, ino);
+ expect_opendir(ino);
+ ents[0].d_fileno = 4;
+ ents[0].d_off = 4000;
+ ents[0].d_namlen = sizeof(nul);
+ ents[0].d_type = DT_REG;
+ strncpy(ents[0].d_name, nul, ents[0].d_namlen);
+ expect_readdir(ino, 0, ents);
+ expect_readdir(ino, 4000, empty_ents);
+
+ errno = 0;
+ dir = opendir(FULLPATH);
+ ASSERT_NE(nullptr, dir) << strerror(errno);
+
+ errno = 0;
+ de = readdir(dir);
+ ASSERT_NE(nullptr, de) << strerror(errno);
+ EXPECT_EQ(4ul, de->d_fileno);
+ EXPECT_EQ(DT_REG, de->d_type);
+ EXPECT_EQ(sizeof(nul), de->d_namlen);
+ EXPECT_EQ(0, strcmp(nul, de->d_name));
+
+ ASSERT_EQ(nullptr, readdir(dir));
+ ASSERT_EQ(0, errno);
+
+ leakdir(dir);
+}
+
+
/* telldir(3) and seekdir(3) should work with fuse */
TEST_F(Readdir, seekdir)
{
@@ -397,6 +441,49 @@ TEST_F(Readdir, seekdir)
leakdir(dir);
}
+/*
+ * FUSE_READDIR returns a path with an embedded /. Obviously illegal, but
+ * nothing bad should happen.
+ */
+TEST_F(Readdir, slash)
+{
+ const char FULLPATH[] = "mountpoint/some_dir";
+ const char RELPATH[] = "some_dir";
+ uint64_t ino = 42;
+ DIR *dir;
+ struct dirent *de;
+ vector<struct dirent> ents(1);
+ vector<struct dirent> empty_ents(0);
+ const char foobar[] = "foo/bar";
+
+ expect_lookup(RELPATH, ino);
+ expect_opendir(ino);
+ ents[0].d_fileno = 4;
+ ents[0].d_off = 4000;
+ ents[0].d_namlen = sizeof(foobar);
+ ents[0].d_type = DT_REG;
+ strncpy(ents[0].d_name, foobar, ents[0].d_namlen);
+ expect_readdir(ino, 0, ents);
+ expect_readdir(ino, 4000, empty_ents);
+
+ errno = 0;
+ dir = opendir(FULLPATH);
+ ASSERT_NE(nullptr, dir) << strerror(errno);
+
+ errno = 0;
+ de = readdir(dir);
+ ASSERT_NE(nullptr, de) << strerror(errno);
+ EXPECT_EQ(4ul, de->d_fileno);
+ EXPECT_EQ(DT_REG, de->d_type);
+ EXPECT_EQ(sizeof(foobar), de->d_namlen);
+ EXPECT_EQ(0, strcmp(foobar, de->d_name));
+
+ ASSERT_EQ(nullptr, readdir(dir));
+ ASSERT_EQ(0, errno);
+
+ leakdir(dir);
+}
+
TEST_F(Readdir_7_8, nodots)
{
const char FULLPATH[] = "mountpoint/some_dir";