Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7b9f35c9 authored by Christopher Ferris's avatar Christopher Ferris
Browse files

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
parent 72fdec17
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;
+20 −0
Original line number Diff line number Diff line
@@ -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());
}