diff options
author | Dmitriy Ivanov <dimitry@google.com> | 2014-07-15 19:33:00 -0700 |
---|---|---|
committer | Dmitriy Ivanov <dimitry@google.com> | 2015-01-30 17:57:13 -0800 |
commit | 40b52b2c884e2a0abf9c4af8b785433286b7e84b (patch) | |
tree | 3fcbfee057ce1576507ea59fda4c06e8c9c3b647 | |
parent | d170bb035dc652b7e350ab7ccca0b1ffa332054e (diff) | |
download | system_core-40b52b2c884e2a0abf9c4af8b785433286b7e84b.zip system_core-40b52b2c884e2a0abf9c4af8b785433286b7e84b.tar.gz system_core-40b52b2c884e2a0abf9c4af8b785433286b7e84b.tar.bz2 |
Add close_file flag to OpenArchiveFd()
* We should be able to keep fd alive after CloseArchive()
Change-Id: I1aa2c039bb2a590ae72f256acc9ba5401c2c59b1
-rw-r--r-- | include/ziparchive/zip_archive.h | 5 | ||||
-rw-r--r-- | libziparchive/zip_archive.cc | 13 | ||||
-rw-r--r-- | libziparchive/zip_archive_test.cc | 21 |
3 files changed, 33 insertions, 6 deletions
diff --git a/include/ziparchive/zip_archive.h b/include/ziparchive/zip_archive.h index 7da6e84..386a390 100644 --- a/include/ziparchive/zip_archive.h +++ b/include/ziparchive/zip_archive.h @@ -101,6 +101,9 @@ int32_t OpenArchive(const char* fileName, ZipArchiveHandle* handle); * Sets handle to the value of the opaque handle for this file descriptor. * This handle must be released by calling CloseArchive with this handle. * + * If assume_ownership parameter is 'true' calling CloseArchive will close + * the file. + * * This function maps and scans the central directory and builds a table * of entries for future lookups. * @@ -109,7 +112,7 @@ int32_t OpenArchive(const char* fileName, ZipArchiveHandle* handle); * Returns 0 on success, and negative values on failure. */ int32_t OpenArchiveFd(const int fd, const char* debugFileName, - ZipArchiveHandle *handle); + ZipArchiveHandle *handle, bool assume_ownership = true); /* * Close archive, releasing resources associated with it. This will diff --git a/libziparchive/zip_archive.cc b/libziparchive/zip_archive.cc index b6fd0d2..afc122d 100644 --- a/libziparchive/zip_archive.cc +++ b/libziparchive/zip_archive.cc @@ -289,6 +289,7 @@ static const char kTempMappingFileName[] = "zip: ExtractFileToFile"; struct ZipArchive { /* open Zip archive */ const int fd; + const bool close_file; /* mapped central directory area */ off64_t directory_offset; @@ -306,8 +307,9 @@ struct ZipArchive { uint32_t hash_table_size; ZipEntryName* hash_table; - ZipArchive(const int fd) : + ZipArchive(const int fd, bool assume_ownership) : fd(fd), + close_file(assume_ownership), directory_offset(0), directory_map(NULL), num_entries(0), @@ -315,7 +317,7 @@ struct ZipArchive { hash_table(NULL) {} ~ZipArchive() { - if (fd >= 0) { + if (close_file && fd >= 0) { close(fd); } @@ -690,21 +692,22 @@ static int32_t OpenArchiveInternal(ZipArchive* archive, } int32_t OpenArchiveFd(int fd, const char* debug_file_name, - ZipArchiveHandle* handle) { - ZipArchive* archive = new ZipArchive(fd); + ZipArchiveHandle* handle, bool assume_ownership) { + ZipArchive* archive = new ZipArchive(fd, assume_ownership); *handle = archive; return OpenArchiveInternal(archive, debug_file_name); } int32_t OpenArchive(const char* fileName, ZipArchiveHandle* handle) { const int fd = open(fileName, O_RDONLY | O_BINARY, 0); - ZipArchive* archive = new ZipArchive(fd); + ZipArchive* archive = new ZipArchive(fd, true); *handle = archive; if (fd < 0) { ALOGW("Unable to open '%s': %s", fileName, strerror(errno)); return kIoError; } + return OpenArchiveInternal(archive, fileName); } diff --git a/libziparchive/zip_archive_test.cc b/libziparchive/zip_archive_test.cc index 4775de0..c8dafa9 100644 --- a/libziparchive/zip_archive_test.cc +++ b/libziparchive/zip_archive_test.cc @@ -17,6 +17,7 @@ #include "ziparchive/zip_archive.h" #include <errno.h> +#include <fcntl.h> #include <getopt.h> #include <stdio.h> #include <unistd.h> @@ -88,6 +89,26 @@ TEST(ziparchive, OpenMissing) { ASSERT_EQ(-1, GetFileDescriptor(handle)); } +TEST(ziparchive, OpenAssumeFdOwnership) { + int fd = open((test_data_dir + "/" + kValidZip).c_str(), O_RDONLY); + ASSERT_NE(-1, fd); + ZipArchiveHandle handle; + ASSERT_EQ(0, OpenArchiveFd(fd, "OpenWithAssumeFdOwnership", &handle)); + CloseArchive(handle); + ASSERT_EQ(-1, lseek(fd, 0, SEEK_SET)); + ASSERT_EQ(EBADF, errno); +} + +TEST(ziparchive, OpenDoNotAssumeFdOwnership) { + int fd = open((test_data_dir + "/" + kValidZip).c_str(), O_RDONLY); + ASSERT_NE(-1, fd); + ZipArchiveHandle handle; + ASSERT_EQ(0, OpenArchiveFd(fd, "OpenWithAssumeFdOwnership", &handle, false)); + CloseArchive(handle); + ASSERT_EQ(0, lseek(fd, 0, SEEK_SET)); + close(fd); +} + TEST(ziparchive, Iteration) { ZipArchiveHandle handle; ASSERT_EQ(0, OpenArchiveWrapper(kValidZip, &handle)); |