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

Commit a509e771 authored by Android Build Merger (Role)'s avatar Android Build Merger (Role)
Browse files

[automerger] ResStringPool: Fix security vulnerability am: 7e54c3f2 am:...

[automerger] ResStringPool: Fix security vulnerability am: 7e54c3f2 am: 98e2d2ec am: 24a89da3 am: d85632ae am: 927b3357 am: 79d0fb25

Change-Id: I068f51adbb0248db232c50bd89fb25ef0d7273a9
parents 5ddeef71 79d0fb25
Loading
Loading
Loading
Loading
+18 −0
Original line number Original line Diff line number Diff line
@@ -457,6 +457,22 @@ status_t ResStringPool::setTo(const void* data, size_t size, bool copyData)


    uninit();
    uninit();


    // The chunk must be at least the size of the string pool header.
    if (size < sizeof(ResStringPool_header)) {
        LOG_ALWAYS_FATAL("Bad string block: data size %zu is too small to be a string block", size);
        return (mError=BAD_TYPE);
    }

    // The data is at least as big as a ResChunk_header, so we can safely validate the other
    // header fields.
    // `data + size` is safe because the source of `size` comes from the kernel/filesystem.
    if (validate_chunk(reinterpret_cast<const ResChunk_header*>(data), sizeof(ResStringPool_header),
                       reinterpret_cast<const uint8_t*>(data) + size,
                       "ResStringPool_header") != NO_ERROR) {
        LOG_ALWAYS_FATAL("Bad string block: malformed block dimensions");
        return (mError=BAD_TYPE);
    }

    const bool notDeviceEndian = htods(0xf0) != 0xf0;
    const bool notDeviceEndian = htods(0xf0) != 0xf0;


    if (copyData || notDeviceEndian) {
    if (copyData || notDeviceEndian) {
@@ -468,6 +484,8 @@ status_t ResStringPool::setTo(const void* data, size_t size, bool copyData)
        data = mOwnedData;
        data = mOwnedData;
    }
    }


    // The size has been checked, so it is safe to read the data in the ResStringPool_header
    // data structure.
    mHeader = (const ResStringPool_header*)data;
    mHeader = (const ResStringPool_header*)data;


    if (notDeviceEndian) {
    if (notDeviceEndian) {