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

Commit 762c1cfd authored by Dave Burke's avatar Dave Burke Committed by Android Git Automerger
Browse files

am e09e20ee: Merge "Revert "Fix memory leak where we close the descriptor...

am e09e20ee: Merge "Revert "Fix memory leak where we close the descriptor instead of the file."" into lmp-dev

* commit 'e09e20eeca4b822855e02507a4e30387ea4ee1a6':
  Revert "Fix memory leak where we close the descriptor instead of the file."
parents b30ea7f6 6bf7be3b
Loading
Loading
Loading
Loading
+5 −11
Original line number Original line Diff line number Diff line
@@ -478,7 +478,7 @@ static jobject nativeDecodeFileDescriptor(JNIEnv* env, jobject clazz, jobject fi


    NPE_CHECK_RETURN_ZERO(env, fileDescriptor);
    NPE_CHECK_RETURN_ZERO(env, fileDescriptor);


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


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


    // Duplicate the descriptor here to prevent leaking memory. A leak occurs
    // Restore the descriptor's offset on exiting this function.
    // if we only close the file descriptor and not the file object it is used to
    AutoFDSeek autoRestore(descriptor);
    // 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);


    FILE* file = fdopen(dupDescriptor, "r");
    FILE* file = fdopen(descriptor, "r");
    if (file == NULL) {
    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");
        return nullObjectReturn("Could not open file");
    }
    }


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


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