From b7a4f0b9e2779fbddc675641c5a2978168f0df2f Mon Sep 17 00:00:00 2001 From: Renaud Paquay Date: Wed, 10 May 2017 17:48:59 -0700 Subject: [PATCH] Fix uninitialized member variable The default constructor of FileMap was missing an initializer for the mFileMapping variables. This results in CloseHandle being called with a "random" value, which can cause havoc in Win32 process over time (e.g. in the case of libaapt2_jni.dll, which is loaded in a JVM process). Also, update the code to use "NULL" for invalid file map handle and "INVALID_HANDLE_VALUE" for invalid file handle. Bug: 38197857 Test: Stress testing on (Windows) machine Change-Id: Ibd769219d601fbafcfcee89e848b31cc5137826c --- libutils/FileMap.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/libutils/FileMap.cpp b/libutils/FileMap.cpp index 1afa1ecae..3c4d81c1e 100644 --- a/libutils/FileMap.cpp +++ b/libutils/FileMap.cpp @@ -48,8 +48,16 @@ using namespace android; // Constructor. Create an empty object. FileMap::FileMap(void) - : mFileName(NULL), mBasePtr(NULL), mBaseLength(0), - mDataPtr(NULL), mDataLength(0) + : mFileName(NULL), + mBasePtr(NULL), + mBaseLength(0), + mDataPtr(NULL), + mDataLength(0) +#if defined(__MINGW32__) + , + mFileHandle(INVALID_HANDLE_VALUE), + mFileMapping(NULL) +#endif { } @@ -65,8 +73,8 @@ FileMap::FileMap(FileMap&& other) other.mBasePtr = NULL; other.mDataPtr = NULL; #if defined(__MINGW32__) - other.mFileHandle = 0; - other.mFileMapping = 0; + other.mFileHandle = INVALID_HANDLE_VALUE; + other.mFileMapping = NULL; #endif } @@ -84,8 +92,8 @@ FileMap& FileMap::operator=(FileMap&& other) { #if defined(__MINGW32__) mFileHandle = other.mFileHandle; mFileMapping = other.mFileMapping; - other.mFileHandle = 0; - other.mFileMapping = 0; + other.mFileHandle = INVALID_HANDLE_VALUE; + other.mFileMapping = NULL; #endif return *this; } @@ -101,7 +109,7 @@ FileMap::~FileMap(void) ALOGD("UnmapViewOfFile(%p) failed, error = %lu\n", mBasePtr, GetLastError() ); } - if (mFileMapping != INVALID_HANDLE_VALUE) { + if (mFileMapping != NULL) { CloseHandle(mFileMapping); } #else @@ -156,7 +164,7 @@ bool FileMap::create(const char* origFileName, int fd, off64_t offset, size_t le ALOGE("MapViewOfFile(%" PRId64 ", %zu) failed with error %lu\n", adjOffset, adjLength, GetLastError() ); CloseHandle(mFileMapping); - mFileMapping = INVALID_HANDLE_VALUE; + mFileMapping = NULL; return false; } #else // !defined(__MINGW32__)