Fix metadata link handling

This commit is contained in:
Marcus Holland-Moritz 2020-12-01 11:39:11 +01:00
parent 24616178f3
commit 984fca1b51
3 changed files with 30 additions and 1 deletions

View File

@ -206,7 +206,7 @@ class metadata_ : public metadata_v2::impl {
std::string_view link_value(entry_view entry) const {
return meta_
.links()[meta_.link_index()[entry.inode()] - meta_.link_index_offset()];
.links()[meta_.link_index()[entry.inode() - meta_.link_index_offset()]];
}
folly::ByteRange data_;

View File

@ -533,6 +533,7 @@ void scanner_<LoggerPolicy>::scan(filesystem_writer& fsw,
mv2.links = ge_data.get_links();
mv2.timestamp_base = ge_data.get_timestamp_base();
mv2.chunk_index_offset = first_file_inode;
mv2.link_index_offset = first_link_inode;
mv2.block_size = UINT32_C(1) << cfg_.block_size_bits;
mv2.total_fs_size = prog.original_size;

View File

@ -77,6 +77,7 @@ std::unordered_map<std::string, simplestat> statmap{
{"//foo.pl", {S_IFREG | 0600, 1337, 0, 23456}},
{"//ipsum.txt", {S_IFREG | 0644, 1000, 1000, 2000000}},
{"//somedir/ipsum.py", {S_IFREG | 0644, 1000, 1000, 10000}},
{"//somedir/bad", {S_IFLNK | 0777, 1000, 1000, 6}},
};
} // namespace
@ -87,6 +88,13 @@ class mmap_mock : public mmif {
assign(m_data.data(), m_data.size());
}
boost::system::error_code lock(void const*, size_t) override {
return boost::system::error_code();
}
boost::system::error_code advise(void const*, size_t, int) override {
return boost::system::error_code();
}
private:
const std::string m_data;
};
@ -105,6 +113,7 @@ class os_access_mock : public os_access {
".",
"..",
"ipsum.py",
"bad",
};
return std::make_shared<dir_reader_mock>(std::move(files));
@ -128,6 +137,8 @@ class os_access_mock : public os_access {
std::string readlink(const std::string& path, size_t size) const override {
if (path == "//somelink" && size == 16) {
return "somedir/ipsum.py";
} else if (path == "//somedir/bad" && size == 6) {
return "../foo";
}
throw std::runtime_error("oops");
@ -216,6 +227,23 @@ void basic_end_to_end_test(const std::string& compressor,
ssize_t rv = fs.read(inode, &buf[0], st.st_size, 0);
EXPECT_EQ(rv, st.st_size);
EXPECT_EQ(std::string(buf.begin(), buf.end()), test::loremipsum(st.st_size));
entry = fs.find("/somelink");
EXPECT_EQ(fs.getattr(*entry, &st), 0);
EXPECT_EQ(st.st_size, 16);
std::string link;
EXPECT_EQ(fs.readlink(*entry, &link), 0);
EXPECT_EQ(link, "somedir/ipsum.py");
entry = fs.find("/somedir/bad");
EXPECT_EQ(fs.getattr(*entry, &st), 0);
EXPECT_EQ(st.st_size, 6);
EXPECT_EQ(fs.readlink(*entry, &link), 0);
EXPECT_EQ(link, "../foo");
}
std::vector<std::string> const compressions{"null",