diff options
Diffstat (limited to 'install.cpp')
-rw-r--r-- | install.cpp | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/install.cpp b/install.cpp index 72c922d5..c9871523 100644 --- a/install.cpp +++ b/install.cpp | |||
@@ -32,13 +32,13 @@ | |||
32 | #include <android-base/parseint.h> | 32 | #include <android-base/parseint.h> |
33 | #include <android-base/stringprintf.h> | 33 | #include <android-base/stringprintf.h> |
34 | #include <android-base/strings.h> | 34 | #include <android-base/strings.h> |
35 | #include <ziparchive/zip_archive.h> | ||
35 | 36 | ||
36 | #include "common.h" | 37 | #include "common.h" |
37 | #include "error_code.h" | 38 | #include "error_code.h" |
38 | #include "install.h" | 39 | #include "install.h" |
39 | #include "minui/minui.h" | 40 | #include "minui/minui.h" |
40 | #include "minzip/SysUtil.h" | 41 | #include "otautil/SysUtil.h" |
41 | #include "minzip/Zip.h" | ||
42 | #include "roots.h" | 42 | #include "roots.h" |
43 | #include "ui.h" | 43 | #include "ui.h" |
44 | #include "verifier.h" | 44 | #include "verifier.h" |
@@ -72,15 +72,17 @@ static int parse_build_number(const std::string& str) { | |||
72 | } | 72 | } |
73 | 73 | ||
74 | // Read the build.version.incremental of src/tgt from the metadata and log it to last_install. | 74 | // Read the build.version.incremental of src/tgt from the metadata and log it to last_install. |
75 | static void read_source_target_build(ZipArchive* zip, std::vector<std::string>& log_buffer) { | 75 | static void read_source_target_build(ZipArchiveHandle zip, std::vector<std::string>& log_buffer) { |
76 | const ZipEntry* meta_entry = mzFindZipEntry(zip, METADATA_PATH); | 76 | ZipString metadata_path(METADATA_PATH); |
77 | if (meta_entry == nullptr) { | 77 | ZipEntry meta_entry; |
78 | if (FindEntry(zip, metadata_path, &meta_entry) != 0) { | ||
78 | LOG(ERROR) << "Failed to find " << METADATA_PATH << " in update package"; | 79 | LOG(ERROR) << "Failed to find " << METADATA_PATH << " in update package"; |
79 | return; | 80 | return; |
80 | } | 81 | } |
81 | 82 | ||
82 | std::string meta_data(meta_entry->uncompLen, '\0'); | 83 | std::string meta_data(meta_entry.uncompressed_length, '\0'); |
83 | if (!mzReadZipEntry(zip, meta_entry, &meta_data[0], meta_entry->uncompLen)) { | 84 | if (ExtractToMemory(zip, &meta_entry, reinterpret_cast<uint8_t*>(&meta_data[0]), |
85 | meta_entry.uncompressed_length) != 0) { | ||
84 | LOG(ERROR) << "Failed to read metadata in update package"; | 86 | LOG(ERROR) << "Failed to read metadata in update package"; |
85 | return; | 87 | return; |
86 | } | 88 | } |
@@ -109,15 +111,14 @@ static void read_source_target_build(ZipArchive* zip, std::vector<std::string>& | |||
109 | 111 | ||
110 | // If the package contains an update binary, extract it and run it. | 112 | // If the package contains an update binary, extract it and run it. |
111 | static int | 113 | static int |
112 | try_update_binary(const char* path, ZipArchive* zip, bool* wipe_cache, | 114 | try_update_binary(const char* path, ZipArchiveHandle zip, bool* wipe_cache, |
113 | std::vector<std::string>& log_buffer, int retry_count) | 115 | std::vector<std::string>& log_buffer, int retry_count) |
114 | { | 116 | { |
115 | read_source_target_build(zip, log_buffer); | 117 | read_source_target_build(zip, log_buffer); |
116 | 118 | ||
117 | const ZipEntry* binary_entry = | 119 | ZipString binary_name(ASSUMED_UPDATE_BINARY_NAME); |
118 | mzFindZipEntry(zip, ASSUMED_UPDATE_BINARY_NAME); | 120 | ZipEntry binary_entry; |
119 | if (binary_entry == NULL) { | 121 | if (FindEntry(zip, binary_name, &binary_entry) != 0) { |
120 | mzCloseZipArchive(zip); | ||
121 | return INSTALL_CORRUPT; | 122 | return INSTALL_CORRUPT; |
122 | } | 123 | } |
123 | 124 | ||
@@ -126,15 +127,14 @@ try_update_binary(const char* path, ZipArchive* zip, bool* wipe_cache, | |||
126 | int fd = creat(binary, 0755); | 127 | int fd = creat(binary, 0755); |
127 | if (fd < 0) { | 128 | if (fd < 0) { |
128 | PLOG(ERROR) << "Can't make " << binary; | 129 | PLOG(ERROR) << "Can't make " << binary; |
129 | mzCloseZipArchive(zip); | ||
130 | return INSTALL_ERROR; | 130 | return INSTALL_ERROR; |
131 | } | 131 | } |
132 | bool ok = mzExtractZipEntryToFile(zip, binary_entry, fd); | 132 | int error = ExtractEntryToFile(zip, &binary_entry, fd); |
133 | close(fd); | 133 | close(fd); |
134 | mzCloseZipArchive(zip); | ||
135 | 134 | ||
136 | if (!ok) { | 135 | if (error != 0) { |
137 | LOG(ERROR) << "Can't copy " << ASSUMED_UPDATE_BINARY_NAME; | 136 | LOG(ERROR) << "Can't copy " << ASSUMED_UPDATE_BINARY_NAME |
137 | << " : " << ErrorCodeString(error); | ||
138 | return INSTALL_ERROR; | 138 | return INSTALL_ERROR; |
139 | } | 139 | } |
140 | 140 | ||
@@ -326,13 +326,14 @@ really_install_package(const char *path, bool* wipe_cache, bool needs_mount, | |||
326 | } | 326 | } |
327 | 327 | ||
328 | // Try to open the package. | 328 | // Try to open the package. |
329 | ZipArchive zip; | 329 | ZipArchiveHandle zip; |
330 | err = mzOpenZipArchive(map.addr, map.length, &zip); | 330 | err = OpenArchiveFromMemory(map.addr, map.length, path, &zip); |
331 | if (err != 0) { | 331 | if (err != 0) { |
332 | LOG(ERROR) << "Can't open " << path; | 332 | LOG(ERROR) << "Can't open " << path << " : " << ErrorCodeString(err); |
333 | log_buffer.push_back(android::base::StringPrintf("error: %d", kZipOpenFailure)); | 333 | log_buffer.push_back(android::base::StringPrintf("error: %d", kZipOpenFailure)); |
334 | 334 | ||
335 | sysReleaseMap(&map); | 335 | sysReleaseMap(&map); |
336 | CloseArchive(zip); | ||
336 | return INSTALL_CORRUPT; | 337 | return INSTALL_CORRUPT; |
337 | } | 338 | } |
338 | 339 | ||
@@ -342,12 +343,12 @@ really_install_package(const char *path, bool* wipe_cache, bool needs_mount, | |||
342 | ui->Print("Retry attempt: %d\n", retry_count); | 343 | ui->Print("Retry attempt: %d\n", retry_count); |
343 | } | 344 | } |
344 | ui->SetEnableReboot(false); | 345 | ui->SetEnableReboot(false); |
345 | int result = try_update_binary(path, &zip, wipe_cache, log_buffer, retry_count); | 346 | int result = try_update_binary(path, zip, wipe_cache, log_buffer, retry_count); |
346 | ui->SetEnableReboot(true); | 347 | ui->SetEnableReboot(true); |
347 | ui->Print("\n"); | 348 | ui->Print("\n"); |
348 | 349 | ||
349 | sysReleaseMap(&map); | 350 | sysReleaseMap(&map); |
350 | 351 | CloseArchive(zip); | |
351 | return result; | 352 | return result; |
352 | } | 353 | } |
353 | 354 | ||