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

Commit 55baca28 authored by Yin-Chia Yeh's avatar Yin-Chia Yeh
Browse files

AImageReader: avoid edit during traversing

Test: HWAsan build + CTS NativeImageReaderTest
Bug: 119839845
Change-Id: Ic22dba944e233fc55b5fe35004148867348f951a
parent 51460e50
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -357,8 +357,10 @@ AImageReader::~AImageReader() {
              it != mAcquiredImages.end(); it++) {
        AImage* image = *it;
        Mutex::Autolock _l(image->mLock);
        releaseImageLocked(image, /*releaseFenceFd*/-1);
        // Do not alter mAcquiredImages while we are iterating on it
        releaseImageLocked(image, /*releaseFenceFd*/-1, /*clearCache*/false);
    }
    mAcquiredImages.clear();

    // Delete Buffer Items
    for (auto it = mBuffers.begin();
@@ -497,7 +499,7 @@ AImageReader::returnBufferItemLocked(BufferItem* buffer) {
}

void
AImageReader::releaseImageLocked(AImage* image, int releaseFenceFd) {
AImageReader::releaseImageLocked(AImage* image, int releaseFenceFd, bool clearCache) {
    BufferItem* buffer = image->mBuffer;
    if (buffer == nullptr) {
        // This should not happen, but is not fatal
@@ -521,6 +523,10 @@ AImageReader::releaseImageLocked(AImage* image, int releaseFenceFd) {
    image->mLockedBuffer = nullptr;
    image->mIsClosed = true;

    if (!clearCache) {
        return;
    }

    bool found = false;
    // cleanup acquired image list
    for (auto it = mAcquiredImages.begin();
+1 −1
Original line number Diff line number Diff line
@@ -88,7 +88,7 @@ struct AImageReader : public RefBase {
    media_status_t acquireImageLocked(/*out*/AImage** image, /*out*/int* fenceFd);

    // Called by AImage/~AImageReader to close image. Caller is responsible to grab AImage::mLock
    void releaseImageLocked(AImage* image, int releaseFenceFd);
    void releaseImageLocked(AImage* image, int releaseFenceFd, bool clearCache = true);

    static int getBufferWidth(BufferItem* buffer);
    static int getBufferHeight(BufferItem* buffer);