From 7d0338cb0b24926aff648a4c8ba5d77b052010cc Mon Sep 17 00:00:00 2001 From: Juliusz Wajgelt <49338439+jwajgelt@users.noreply.github.com> Date: Wed, 11 Dec 2024 08:24:50 -0800 Subject: [PATCH] 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 --- .../ReactCommon/cxxreact/JSBigString.cpp | 2 +- .../cxxreact/tests/jsbigstring.cpp | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/react-native/ReactCommon/cxxreact/JSBigString.cpp b/packages/react-native/ReactCommon/cxxreact/JSBigString.cpp index 59cfe8d41e8..702ee408f26 100644 --- a/packages/react-native/ReactCommon/cxxreact/JSBigString.cpp +++ b/packages/react-native/ReactCommon/cxxreact/JSBigString.cpp @@ -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(d.quot); + m_mapOff = static_cast(d.quot) * ps; m_pageOff = static_cast(d.rem); m_size = size + m_pageOff; } else { diff --git a/packages/react-native/ReactCommon/cxxreact/tests/jsbigstring.cpp b/packages/react-native/ReactCommon/cxxreact/tests/jsbigstring.cpp index cb196d1b353..6bb9dda3b46 100644 --- a/packages/react-native/ReactCommon/cxxreact/tests/jsbigstring.cpp +++ b/packages/react-native/ReactCommon/cxxreact/tests/jsbigstring.cpp @@ -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]); + } +}