diff options
author | Elliott Hughes <enh@google.com> | 2019-02-06 14:28:32 -0800 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2019-02-06 14:29:35 -0800 |
commit | eb0ef145fd38922617e6ab3d94eaacde93e04c95 (patch) | |
tree | 63a400421b9bc3526032421fce23b8434c84a8d4 /libutils/FileMap.cpp | |
parent | a42af36002914dc2efe9589a334c72eb5225d1c5 (diff) | |
download | system_core-eb0ef145fd38922617e6ab3d94eaacde93e04c95.tar.gz system_core-eb0ef145fd38922617e6ab3d94eaacde93e04c95.tar.bz2 system_core-eb0ef145fd38922617e6ab3d94eaacde93e04c95.zip |
MappedFile and FileMap should support zero-length mappings.
Bug: http://b/119818070 "app crashes when reading asset of zero length"
Test: ran tests
Change-Id: Idd2ad6f6e72c8e445aff78a460fac96dea41c950
Diffstat (limited to 'libutils/FileMap.cpp')
-rw-r--r-- | libutils/FileMap.cpp | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/libutils/FileMap.cpp b/libutils/FileMap.cpp index 5feb2aa76..1202c156d 100644 --- a/libutils/FileMap.cpp +++ b/libutils/FileMap.cpp @@ -174,12 +174,6 @@ bool FileMap::create(const char* origFileName, int fd, off64_t offset, size_t le return false; } #else // !defined(__MINGW32__) - int prot, flags, adjust; - off64_t adjOffset; - size_t adjLength; - - void* ptr; - assert(fd >= 0); assert(offset >= 0); assert(length > 0); @@ -193,20 +187,23 @@ bool FileMap::create(const char* origFileName, int fd, off64_t offset, size_t le } } - adjust = offset % mPageSize; - adjOffset = offset - adjust; - adjLength = length + adjust; + int adjust = offset % mPageSize; + off64_t adjOffset = offset - adjust; + size_t adjLength = length + adjust; - flags = MAP_SHARED; - prot = PROT_READ; - if (!readOnly) - prot |= PROT_WRITE; + int flags = MAP_SHARED; + int prot = PROT_READ; + if (!readOnly) prot |= PROT_WRITE; - ptr = mmap(nullptr, adjLength, prot, flags, fd, adjOffset); + void* ptr = mmap(nullptr, adjLength, prot, flags, fd, adjOffset); if (ptr == MAP_FAILED) { - ALOGE("mmap(%lld,%zu) failed: %s\n", - (long long)adjOffset, adjLength, strerror(errno)); - return false; + if (errno == EINVAL && length == 0) { + ptr = nullptr; + adjust = 0; + } else { + ALOGE("mmap(%lld,%zu) failed: %s\n", (long long)adjOffset, adjLength, strerror(errno)); + return false; + } } mBasePtr = ptr; #endif // !defined(__MINGW32__) @@ -217,8 +214,6 @@ bool FileMap::create(const char* origFileName, int fd, off64_t offset, size_t le mDataPtr = (char*) mBasePtr + adjust; mDataLength = length; - assert(mBasePtr != NULL); - ALOGV("MAP: base %p/%zu data %p/%zu\n", mBasePtr, mBaseLength, mDataPtr, mDataLength); |