diff options
author | Jérôme Poichet <jpoichet@google.com> | 2014-09-26 18:59:11 +0000 |
---|---|---|
committer | Jérôme Poichet <jpoichet@google.com> | 2014-09-26 18:59:11 +0000 |
commit | d29c902f9822ab4b11dd4b91729c64d6987cdf29 (patch) | |
tree | f4b39003e4a5b956f2248011a6ac4eb8ef29861c /core/jni/android | |
parent | 1b99187253fcb03698a7db71394ff8a900ce56a6 (diff) | |
download | frameworks_base-d29c902f9822ab4b11dd4b91729c64d6987cdf29.zip frameworks_base-d29c902f9822ab4b11dd4b91729c64d6987cdf29.tar.gz frameworks_base-d29c902f9822ab4b11dd4b91729c64d6987cdf29.tar.bz2 |
Revert "Fix memory leak where we close the descriptor instead of the file."
This reverts commit 1503ebd95fc82b1ae6ec8b006e62a9f6109973fa.
Change-Id: Id40cf34821ea244b1a838079bd147bc845b96cb3
Diffstat (limited to 'core/jni/android')
-rw-r--r-- | core/jni/android/graphics/BitmapFactory.cpp | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 6796134..8ea28ec 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -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 |