fix incorrect mmap file offset in JSBigFileString (#48198)

Summary:
`JSBigFileString` incorrectly passes the file offset to `mmap`, causing errors when `offset` is non-zero.

## Changelog:
[GENERAL] [FIXED] - `JSBigFileString` fails for non-zero offset arguments

Pull Request resolved: https://github.com/facebook/react-native/pull/48198

Test Plan: - verify the new unit test passes

Reviewed By: cipolleschi

Differential Revision: D67086826

Pulled By: javache

fbshipit-source-id: 0991bb34a710b85ff0263dc553efb85ba62b4cd8
This commit is contained in:
Juliusz Wajgelt
2024-12-11 08:24:50 -08:00
committed by Facebook GitHub Bot
parent 477489ce84
commit 7d0338cb0b
2 changed files with 20 additions and 1 deletions
@@ -38,7 +38,7 @@ JSBigFileString::JSBigFileString(int fd, size_t size, off_t offset /*= 0*/)
const static auto ps = sysconf(_SC_PAGESIZE);
auto d = lldiv(offset, ps);
m_mapOff = static_cast<off_t>(d.quot);
m_mapOff = static_cast<off_t>(d.quot) * ps;
m_pageOff = static_cast<off_t>(d.rem);
m_size = size + m_pageOff;
} else {
@@ -60,3 +60,22 @@ TEST(JSBigFileString, MapPartTest) {
EXPECT_EQ(needle[i], bigStr.c_str()[i]);
}
}
TEST(JSBigFileString, MapPartAtLargeOffsetTest) {
std::string data(8 * 4096, 'X');
data += "Hello World!";
// Sub-string to actually map
std::string needle{"or"};
off_t offset = data.find(needle);
// Initialise Big String
int fd = tempFileFromString(data);
JSBigFileString bigStr{fd, needle.size(), offset};
// Test
EXPECT_EQ(needle.length(), bigStr.size());
for (unsigned int i = 0; i < needle.length(); ++i) {
EXPECT_EQ(needle[i], bigStr.c_str()[i]);
}
}