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

Commit 736e7b4a authored by Christopher Ferris's avatar Christopher Ferris Committed by Automerger Merge Worker
Browse files

Fail explicitly on length overflow. am: bff51b88

Change-Id: I349be60206e9c1f673d845d07b76b4540d25c2f5
parents 79c2098a bff51b88
Loading
Loading
Loading
Loading
+5 −1
Original line number 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;
    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 prot = PROT_READ;
+13 −0
Original line number Diff line number Diff line
@@ -52,3 +52,16 @@ TEST(FileMap, large_offset) {
    ASSERT_EQ(0u, m.getDataLength());
    ASSERT_EQ(offset, 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));
}