Change call to mmap64.

The code was using an off64_t but calling mmap. This caused the code
to abort on 32 bit.

Add a unit test that would abort on the previous version.

Bug: 155662887

Test: New unit test passes.
Change-Id: I7a6efbc0d4227403c3d08a08deea56f239382157
Merged-In: I7a6efbc0d4227403c3d08a08deea56f239382157
(cherry picked from commit 7b9f35c9de)
This commit is contained in:
Christopher Ferris 2020-05-06 13:48:32 -07:00
parent 1cf1238d4a
commit de38b1a356
2 changed files with 21 additions and 1 deletions

View file

@ -195,7 +195,7 @@ bool FileMap::create(const char* origFileName, int fd, off64_t offset, size_t le
int prot = PROT_READ;
if (!readOnly) prot |= PROT_WRITE;
void* ptr = mmap(nullptr, adjLength, prot, flags, fd, adjOffset);
void* ptr = mmap64(nullptr, adjLength, prot, flags, fd, adjOffset);
if (ptr == MAP_FAILED) {
if (errno == EINVAL && length == 0) {
ptr = nullptr;

View file

@ -32,3 +32,23 @@ TEST(FileMap, zero_length_mapping) {
ASSERT_EQ(0u, m.getDataLength());
ASSERT_EQ(4096, m.getDataOffset());
}
TEST(FileMap, large_offset) {
// Make sure that an offset > INT32_MAX will not fail the create
// function. See http://b/155662887.
TemporaryFile tf;
ASSERT_TRUE(tf.fd != -1);
off64_t offset = INT32_MAX + 1024LL;
// Make the temporary file large enough to pass the mmap.
ASSERT_EQ(offset, lseek64(tf.fd, offset, SEEK_SET));
char value = 0;
ASSERT_EQ(1, write(tf.fd, &value, 1));
android::FileMap m;
ASSERT_TRUE(m.create("test", tf.fd, offset, 0, true));
ASSERT_STREQ("test", m.getFileName());
ASSERT_EQ(0u, m.getDataLength());
ASSERT_EQ(offset, m.getDataOffset());
}