Chromium Code Reviews| OLD | NEW | 
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "third_party/zlib/google/zip_internal.h" | 5 #include "third_party/zlib/google/zip_internal.h" | 
| 6 | 6 | 
| 7 #include <algorithm> | 7 #include <algorithm> | 
| 8 | 8 | 
| 9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" | 
| 10 #include "base/logging.h" | 10 #include "base/logging.h" | 
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 83 FILE* file = NULL; | 83 FILE* file = NULL; | 
| 84 const char* mode_fopen = NULL; | 84 const char* mode_fopen = NULL; | 
| 85 | 85 | 
| 86 if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ) | 86 if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ) | 
| 87 mode_fopen = "rb"; | 87 mode_fopen = "rb"; | 
| 88 else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) | 88 else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) | 
| 89 mode_fopen = "r+b"; | 89 mode_fopen = "r+b"; | 
| 90 else if (mode & ZLIB_FILEFUNC_MODE_CREATE) | 90 else if (mode & ZLIB_FILEFUNC_MODE_CREATE) | 
| 91 mode_fopen = "wb"; | 91 mode_fopen = "wb"; | 
| 92 | 92 | 
| 93 if ((filename != NULL) && (mode_fopen != NULL)) | 93 if ((filename != NULL) && (mode_fopen != NULL)) { | 
| 94 file = fdopen(*static_cast<int*>(opaque), mode_fopen); | 94 int fd = dup(*static_cast<int*>(opaque)); | 
| 95 if (fd != -1) | |
| 96 file = fdopen(fd, mode_fopen); | |
| 97 } | |
| 95 | 98 | 
| 96 return file; | 99 return file; | 
| 97 } | 100 } | 
| 98 | 101 | 
| 99 // We don't actually close the file stream since that would close | |
| 100 // the underlying file descriptor, and we don't own it. However we do need to | |
| 101 // flush buffers and free |opaque| since we malloc'ed it in FillFdOpenFileFunc. | |
| 102 int CloseFileFunc(void* opaque, void* stream) { | 102 int CloseFileFunc(void* opaque, void* stream) { | 
| 103 fflush(static_cast<FILE*>(stream)); | 103 fclose(static_cast<FILE*>(stream)); | 
| 104 free(opaque); | 104 free(opaque); | 
| 105 return 0; | 105 return 0; | 
| 106 } | 106 } | 
| 107 | 107 | 
| 108 // Fills |pzlib_filecunc_def| appropriately to handle the zip file | 108 // Fills |pzlib_filecunc_def| appropriately to handle the zip file | 
| 109 // referred to by |fd|. | 109 // referred to by |fd|. | 
| 110 void FillFdOpenFileFunc(zlib_filefunc_def* pzlib_filefunc_def, int fd) { | 110 void FillFdOpenFileFunc(zlib_filefunc_def* pzlib_filefunc_def, int fd) { | 
| 111 fill_fopen_filefunc(pzlib_filefunc_def); | 111 fill_fopen_filefunc(pzlib_filefunc_def); | 
| 112 pzlib_filefunc_def->zopen_file = FdOpenFileFunc; | 112 pzlib_filefunc_def->zopen_file = FdOpenFileFunc; | 
| 113 pzlib_filefunc_def->zclose_file = CloseFileFunc; | 113 pzlib_filefunc_def->zclose_file = CloseFileFunc; | 
| (...skipping 10 matching lines...) Expand all Loading... | |
| 124 file_ret.hf = static_cast<HANDLE>(opaque); | 124 file_ret.hf = static_cast<HANDLE>(opaque); | 
| 125 file_ret.error = 0; | 125 file_ret.error = 0; | 
| 126 if (file_ret.hf == INVALID_HANDLE_VALUE) | 126 if (file_ret.hf == INVALID_HANDLE_VALUE) | 
| 127 return NULL; | 127 return NULL; | 
| 128 | 128 | 
| 129 void* ret = malloc(sizeof(WIN32FILE_IOWIN)); | 129 void* ret = malloc(sizeof(WIN32FILE_IOWIN)); | 
| 130 if (ret != NULL) | 130 if (ret != NULL) | 
| 131 *(static_cast<WIN32FILE_IOWIN*>(ret)) = file_ret; | 131 *(static_cast<WIN32FILE_IOWIN*>(ret)) = file_ret; | 
| 132 return ret; | 132 return ret; | 
| 133 } | 133 } | 
| 134 | |
| 135 int HandleCloseFileFunc(void* opaque, void* stream) { | |
| 136 free(stream); | |
| 
 
satorux1
2014/11/12 07:04:43
Good catch!
maybe add a comment:  // malloc'ed in
 
jeremyspiegel
2014/11/12 08:52:51
Sounds good.
 
 | |
| 137 return 0; | |
| 138 } | |
| 134 #endif | 139 #endif | 
| 135 | 140 | 
| 136 // A struct that contains data required for zlib functions to extract files from | 141 // A struct that contains data required for zlib functions to extract files from | 
| 137 // a zip archive stored in memory directly. The following I/O API functions | 142 // a zip archive stored in memory directly. The following I/O API functions | 
| 138 // expect their opaque parameters refer to this struct. | 143 // expect their opaque parameters refer to this struct. | 
| 139 struct ZipBuffer { | 144 struct ZipBuffer { | 
| 140 const char* data; // weak | 145 const char* data; // weak | 
| 141 size_t length; | 146 size_t length; | 
| 142 size_t offset; | 147 size_t offset; | 
| 143 }; | 148 }; | 
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 275 // Passing dummy "fd" filename to zlib. | 280 // Passing dummy "fd" filename to zlib. | 
| 276 return unzOpen2("fd", &zip_funcs); | 281 return unzOpen2("fd", &zip_funcs); | 
| 277 } | 282 } | 
| 278 #endif | 283 #endif | 
| 279 | 284 | 
| 280 #if defined(OS_WIN) | 285 #if defined(OS_WIN) | 
| 281 unzFile OpenHandleForUnzipping(HANDLE zip_handle) { | 286 unzFile OpenHandleForUnzipping(HANDLE zip_handle) { | 
| 282 zlib_filefunc_def zip_funcs; | 287 zlib_filefunc_def zip_funcs; | 
| 283 fill_win32_filefunc(&zip_funcs); | 288 fill_win32_filefunc(&zip_funcs); | 
| 284 zip_funcs.zopen_file = HandleOpenFileFunc; | 289 zip_funcs.zopen_file = HandleOpenFileFunc; | 
| 290 zip_funcs.zclose_file = HandleCloseFileFunc; | |
| 285 zip_funcs.opaque = zip_handle; | 291 zip_funcs.opaque = zip_handle; | 
| 286 return unzOpen2("fd", &zip_funcs); | 292 return unzOpen2("fd", &zip_funcs); | 
| 287 } | 293 } | 
| 288 #endif | 294 #endif | 
| 289 | 295 | 
| 290 // static | 296 // static | 
| 291 unzFile PrepareMemoryForUnzipping(const std::string& data) { | 297 unzFile PrepareMemoryForUnzipping(const std::string& data) { | 
| 292 if (data.empty()) | 298 if (data.empty()) | 
| 293 return NULL; | 299 return NULL; | 
| 294 | 300 | 
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 369 0, // versionMadeBy | 375 0, // versionMadeBy | 
| 370 LANGUAGE_ENCODING_FLAG)) { // flagBase | 376 LANGUAGE_ENCODING_FLAG)) { // flagBase | 
| 371 DLOG(ERROR) << "Could not open zip file entry " << str_path; | 377 DLOG(ERROR) << "Could not open zip file entry " << str_path; | 
| 372 return false; | 378 return false; | 
| 373 } | 379 } | 
| 374 return true; | 380 return true; | 
| 375 } | 381 } | 
| 376 | 382 | 
| 377 } // namespace internal | 383 } // namespace internal | 
| 378 } // namespace zip | 384 } // namespace zip | 
| OLD | NEW |