diff --git a/libsparse/output_file.cpp b/libsparse/output_file.cpp index e35cb0d0e..b883c13f2 100644 --- a/libsparse/output_file.cpp +++ b/libsparse/output_file.cpp @@ -35,8 +35,9 @@ #include "sparse_crc32.h" #include "sparse_format.h" +#include + #ifndef _WIN32 -#include #define O_BINARY 0 #else #define ftruncate64 ftruncate @@ -45,7 +46,6 @@ #if defined(__APPLE__) && defined(__MACH__) #define lseek64 lseek #define ftruncate64 ftruncate -#define mmap64 mmap #define off64_t off_t #endif @@ -649,52 +649,10 @@ int write_fill_chunk(struct output_file* out, unsigned int len, uint32_t fill_va } int write_fd_chunk(struct output_file* out, unsigned int len, int fd, int64_t offset) { - int ret; - int64_t aligned_offset; - int aligned_diff; - uint64_t buffer_size; - char* ptr; + auto m = android::base::MappedFile::FromFd(fd, offset, len, PROT_READ); + if (!m) return -errno; - aligned_offset = offset & ~(4096 - 1); - aligned_diff = offset - aligned_offset; - buffer_size = (uint64_t)len + (uint64_t)aligned_diff; - -#ifndef _WIN32 - if (buffer_size > SIZE_MAX) return -E2BIG; - char* data = - reinterpret_cast(mmap64(nullptr, buffer_size, PROT_READ, MAP_SHARED, fd, aligned_offset)); - if (data == MAP_FAILED) { - return -errno; - } - ptr = data + aligned_diff; -#else - off64_t pos; - char* data = reinterpret_cast(malloc(len)); - if (!data) { - return -errno; - } - pos = lseek64(fd, offset, SEEK_SET); - if (pos < 0) { - free(data); - return -errno; - } - ret = read_all(fd, data, len); - if (ret < 0) { - free(data); - return ret; - } - ptr = data; -#endif - - ret = out->sparse_ops->write_data_chunk(out, len, ptr); - -#ifndef _WIN32 - munmap(data, buffer_size); -#else - free(data); -#endif - - return ret; + return out->sparse_ops->write_data_chunk(out, m->size(), m->data()); } /* Write a contiguous region of data blocks from a file */