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

Commit 8f71b9df authored by Jérôme Poichet's avatar Jérôme Poichet Committed by The Android Automerger
Browse files

Revert "Fix memory leak where we close the descriptor instead of the file."

This reverts commit 1503ebd95fc82b1ae6ec8b006e62a9f6109973fa.

Change-Id: Id40cf34821ea244b1a838079bd147bc845b96cb3
parent 9d9107d2
Loading
Loading
Loading
Loading
+5 −11
Original line number Diff line number Diff line
@@ -478,7 +478,7 @@ static jobject nativeDecodeFileDescriptor(JNIEnv* env, jobject clazz, jobject fi

    NPE_CHECK_RETURN_ZERO(env, fileDescriptor);

    int descriptor = jniGetFDFromFileDescriptor(env, fileDescriptor);
    jint descriptor = jniGetFDFromFileDescriptor(env, fileDescriptor);

    struct stat fdStat;
    if (fstat(descriptor, &fdStat) == -1) {
@@ -486,22 +486,16 @@ static jobject nativeDecodeFileDescriptor(JNIEnv* env, jobject clazz, jobject fi
        return nullObjectReturn("fstat return -1");
    }

    // Duplicate the descriptor here to prevent leaking memory. A leak occurs
    // if we only close the file descriptor and not the file object it is used to
    // create.  If we don't explicitly clean up the file (which in turn closes the
    // descriptor) the buffers allocated internally by fseek will be leaked.
    int dupDescriptor = dup(descriptor);
    // Restore the descriptor's offset on exiting this function.
    AutoFDSeek autoRestore(descriptor);

    FILE* file = fdopen(dupDescriptor, "r");
    FILE* file = fdopen(descriptor, "r");
    if (file == NULL) {
        // cleanup the duplicated descriptor since it will not be closed when the
        // file is cleaned up (fclose).
        close(dupDescriptor);
        return nullObjectReturn("Could not open file");
    }

    SkAutoTUnref<SkFILEStream> fileStream(new SkFILEStream(file,
                         SkFILEStream::kCallerPasses_Ownership));
                         SkFILEStream::kCallerRetains_Ownership));

    // Use a buffered stream. Although an SkFILEStream can be rewound, this
    // ensures that SkImageDecoder::Factory never rewinds beyond the