summaryrefslogtreecommitdiffstats
path: root/base/mapped_file.cpp
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2019-02-06 14:28:32 -0800
committerElliott Hughes <enh@google.com>2019-02-06 14:29:35 -0800
commiteb0ef145fd38922617e6ab3d94eaacde93e04c95 (patch)
tree63a400421b9bc3526032421fce23b8434c84a8d4 /base/mapped_file.cpp
parenta42af36002914dc2efe9589a334c72eb5225d1c5 (diff)
downloadsystem_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 'base/mapped_file.cpp')
-rw-r--r--base/mapped_file.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/base/mapped_file.cpp b/base/mapped_file.cpp
index f7901afa4..faa845d14 100644
--- a/base/mapped_file.cpp
+++ b/base/mapped_file.cpp
@@ -16,6 +16,8 @@
#include "android-base/mapped_file.h"
+#include <errno.h>
+
namespace android {
namespace base {
@@ -50,7 +52,14 @@ std::unique_ptr<MappedFile> MappedFile::FromFd(int fd, off64_t offset, size_t le
new MappedFile{static_cast<char*>(base), length, slop, handle});
#else
void* base = mmap(nullptr, file_length, prot, MAP_SHARED, fd, file_offset);
- if (base == MAP_FAILED) return nullptr;
+ if (base == MAP_FAILED) {
+ // http://b/119818070 "app crashes when reading asset of zero length".
+ // mmap fails with EINVAL for a zero length region.
+ if (errno == EINVAL && length == 0) {
+ return std::unique_ptr<MappedFile>(new MappedFile{nullptr, 0, 0});
+ }
+ return nullptr;
+ }
return std::unique_ptr<MappedFile>(new MappedFile{static_cast<char*>(base), length, slop});
#endif
}