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

Commit 6b8bafba authored by Christopher Ferris's avatar Christopher Ferris Committed by Anis Assi
Browse files

Fail explicitly on length overflow.

Instead of aborting when FileMap::create detects an overflow, detect the
overflow directly and fail the call.

Bug: 156997193

Test: Ran unit tests, including new unit test that aborted before.
Change-Id: Ie49975b8949fd12bbde14346ec9bbb774ef88a51
Merged-In: Ie49975b8949fd12bbde14346ec9bbb774ef88a51
(cherry picked from commit 68604b9c)
(cherry picked from commit f846413e)
parent 1dea9a05
Loading
Loading
Loading
Loading
+5 −1
Original line number Original line Diff line number Diff line
@@ -189,7 +189,11 @@ bool FileMap::create(const char* origFileName, int fd, off64_t offset, size_t le


    int adjust = offset % mPageSize;
    int adjust = offset % mPageSize;
    off64_t adjOffset = offset - adjust;
    off64_t adjOffset = offset - adjust;
    size_t adjLength = length + adjust;
    size_t adjLength;
    if (__builtin_add_overflow(length, adjust, &adjLength)) {
        ALOGE("adjusted length overflow: length %zu adjust %d", length, adjust);
        return false;
    }


    int flags = MAP_SHARED;
    int flags = MAP_SHARED;
    int prot = PROT_READ;
    int prot = PROT_READ;
+13 −0
Original line number Original line Diff line number Diff line
@@ -32,3 +32,16 @@ TEST(FileMap, zero_length_mapping) {
    ASSERT_EQ(0u, m.getDataLength());
    ASSERT_EQ(0u, m.getDataLength());
    ASSERT_EQ(4096, m.getDataOffset());
    ASSERT_EQ(4096, m.getDataOffset());
}
}

TEST(FileMap, offset_overflow) {
    // Make sure that an end that overflows SIZE_MAX will not abort.
    // See http://b/156997193.
    TemporaryFile tf;
    ASSERT_TRUE(tf.fd != -1);

    off64_t offset = 200;
    size_t length = SIZE_MAX;

    android::FileMap m;
    ASSERT_FALSE(m.create("test", tf.fd, offset, length, true));
}