Change call to mmap64.
The code was using an off64_t but calling mmap. This caused the code
to abort on 32 bit.
Add a unit test that would abort on the previous version.
Bug: 155662887
Test: New unit test passes.
Change-Id: I7a6efbc0d4227403c3d08a08deea56f239382157
Merged-In: I7a6efbc0d4227403c3d08a08deea56f239382157
(cherry picked from commit 7b9f35c9de
)
This commit is contained in:
parent
1cf1238d4a
commit
de38b1a356
2 changed files with 21 additions and 1 deletions
|
@ -195,7 +195,7 @@ bool FileMap::create(const char* origFileName, int fd, off64_t offset, size_t le
|
|||
int prot = PROT_READ;
|
||||
if (!readOnly) prot |= PROT_WRITE;
|
||||
|
||||
void* ptr = mmap(nullptr, adjLength, prot, flags, fd, adjOffset);
|
||||
void* ptr = mmap64(nullptr, adjLength, prot, flags, fd, adjOffset);
|
||||
if (ptr == MAP_FAILED) {
|
||||
if (errno == EINVAL && length == 0) {
|
||||
ptr = nullptr;
|
||||
|
|
|
@ -32,3 +32,23 @@ TEST(FileMap, zero_length_mapping) {
|
|||
ASSERT_EQ(0u, m.getDataLength());
|
||||
ASSERT_EQ(4096, m.getDataOffset());
|
||||
}
|
||||
|
||||
TEST(FileMap, large_offset) {
|
||||
// Make sure that an offset > INT32_MAX will not fail the create
|
||||
// function. See http://b/155662887.
|
||||
TemporaryFile tf;
|
||||
ASSERT_TRUE(tf.fd != -1);
|
||||
|
||||
off64_t offset = INT32_MAX + 1024LL;
|
||||
|
||||
// Make the temporary file large enough to pass the mmap.
|
||||
ASSERT_EQ(offset, lseek64(tf.fd, offset, SEEK_SET));
|
||||
char value = 0;
|
||||
ASSERT_EQ(1, write(tf.fd, &value, 1));
|
||||
|
||||
android::FileMap m;
|
||||
ASSERT_TRUE(m.create("test", tf.fd, offset, 0, true));
|
||||
ASSERT_STREQ("test", m.getFileName());
|
||||
ASSERT_EQ(0u, m.getDataLength());
|
||||
ASSERT_EQ(offset, m.getDataOffset());
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue