Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: third_party/zlib/google/zip_internal.cc

Issue 683913009: Eliminate resource leaks from zip::ZipFiles and (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebasing Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/zlib/google/zip.h ('k') | third_party/zlib/google/zip_reader.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 CloseHandle(file); 72 CloseHandle(file);
73 else 73 else
74 *(static_cast<WIN32FILE_IOWIN*>(ret)) = file_ret; 74 *(static_cast<WIN32FILE_IOWIN*>(ret)) = file_ret;
75 } 75 }
76 return ret; 76 return ret;
77 } 77 }
78 #endif 78 #endif
79 79
80 #if defined(OS_POSIX) 80 #if defined(OS_POSIX)
81 // Callback function for zlib that opens a file stream from a file descriptor. 81 // Callback function for zlib that opens a file stream from a file descriptor.
82 // Since we do not own the file descriptor, dup it so that we can fdopen/fclose
83 // a file stream.
82 void* FdOpenFileFunc(void* opaque, const char* filename, int mode) { 84 void* FdOpenFileFunc(void* opaque, const char* filename, int mode) {
83 FILE* file = NULL; 85 FILE* file = NULL;
84 const char* mode_fopen = NULL; 86 const char* mode_fopen = NULL;
85 87
86 if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ) 88 if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ)
87 mode_fopen = "rb"; 89 mode_fopen = "rb";
88 else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) 90 else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
89 mode_fopen = "r+b"; 91 mode_fopen = "r+b";
90 else if (mode & ZLIB_FILEFUNC_MODE_CREATE) 92 else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
91 mode_fopen = "wb"; 93 mode_fopen = "wb";
92 94
93 if ((filename != NULL) && (mode_fopen != NULL)) 95 if ((filename != NULL) && (mode_fopen != NULL)) {
94 file = fdopen(*static_cast<int*>(opaque), mode_fopen); 96 int fd = dup(*static_cast<int*>(opaque));
97 if (fd != -1)
98 file = fdopen(fd, mode_fopen);
99 }
95 100
96 return file; 101 return file;
97 } 102 }
98 103
99 // We don't actually close the file stream since that would close 104 int FdCloseFileFunc(void* opaque, void* stream) {
100 // the underlying file descriptor, and we don't own it. However we do need to 105 fclose(static_cast<FILE*>(stream));
101 // flush buffers and free |opaque| since we malloc'ed it in FillFdOpenFileFunc. 106 free(opaque); // malloc'ed in FillFdOpenFileFunc()
102 int CloseFileFunc(void* opaque, void* stream) {
103 fflush(static_cast<FILE*>(stream));
104 free(opaque);
105 return 0; 107 return 0;
106 } 108 }
107 109
108 // Fills |pzlib_filecunc_def| appropriately to handle the zip file 110 // Fills |pzlib_filecunc_def| appropriately to handle the zip file
109 // referred to by |fd|. 111 // referred to by |fd|.
110 void FillFdOpenFileFunc(zlib_filefunc_def* pzlib_filefunc_def, int fd) { 112 void FillFdOpenFileFunc(zlib_filefunc_def* pzlib_filefunc_def, int fd) {
111 fill_fopen_filefunc(pzlib_filefunc_def); 113 fill_fopen_filefunc(pzlib_filefunc_def);
112 pzlib_filefunc_def->zopen_file = FdOpenFileFunc; 114 pzlib_filefunc_def->zopen_file = FdOpenFileFunc;
113 pzlib_filefunc_def->zclose_file = CloseFileFunc; 115 pzlib_filefunc_def->zclose_file = FdCloseFileFunc;
114 int* ptr_fd = static_cast<int*>(malloc(sizeof(fd))); 116 int* ptr_fd = static_cast<int*>(malloc(sizeof(fd)));
115 *ptr_fd = fd; 117 *ptr_fd = fd;
116 pzlib_filefunc_def->opaque = ptr_fd; 118 pzlib_filefunc_def->opaque = ptr_fd;
117 } 119 }
118 #endif // defined(OS_POSIX) 120 #endif // defined(OS_POSIX)
119 121
120 #if defined(OS_WIN) 122 #if defined(OS_WIN)
121 // Callback function for zlib that opens a file stream from a Windows handle. 123 // Callback function for zlib that opens a file stream from a Windows handle.
124 // Does not take ownership of the handle.
122 void* HandleOpenFileFunc(void* opaque, const char* filename, int mode) { 125 void* HandleOpenFileFunc(void* opaque, const char* filename, int mode) {
123 WIN32FILE_IOWIN file_ret; 126 WIN32FILE_IOWIN file_ret;
124 file_ret.hf = static_cast<HANDLE>(opaque); 127 file_ret.hf = static_cast<HANDLE>(opaque);
125 file_ret.error = 0; 128 file_ret.error = 0;
126 if (file_ret.hf == INVALID_HANDLE_VALUE) 129 if (file_ret.hf == INVALID_HANDLE_VALUE)
127 return NULL; 130 return NULL;
128 131
129 void* ret = malloc(sizeof(WIN32FILE_IOWIN)); 132 void* ret = malloc(sizeof(WIN32FILE_IOWIN));
130 if (ret != NULL) 133 if (ret != NULL)
131 *(static_cast<WIN32FILE_IOWIN*>(ret)) = file_ret; 134 *(static_cast<WIN32FILE_IOWIN*>(ret)) = file_ret;
132 return ret; 135 return ret;
133 } 136 }
137
138 int HandleCloseFileFunc(void* opaque, void* stream) {
139 free(stream); // malloc'ed in HandleOpenFileFunc()
140 return 0;
141 }
134 #endif 142 #endif
135 143
136 // A struct that contains data required for zlib functions to extract files from 144 // 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 145 // a zip archive stored in memory directly. The following I/O API functions
138 // expect their opaque parameters refer to this struct. 146 // expect their opaque parameters refer to this struct.
139 struct ZipBuffer { 147 struct ZipBuffer {
140 const char* data; // weak 148 const char* data; // weak
141 size_t length; 149 size_t length;
142 size_t offset; 150 size_t offset;
143 }; 151 };
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 // Passing dummy "fd" filename to zlib. 283 // Passing dummy "fd" filename to zlib.
276 return unzOpen2("fd", &zip_funcs); 284 return unzOpen2("fd", &zip_funcs);
277 } 285 }
278 #endif 286 #endif
279 287
280 #if defined(OS_WIN) 288 #if defined(OS_WIN)
281 unzFile OpenHandleForUnzipping(HANDLE zip_handle) { 289 unzFile OpenHandleForUnzipping(HANDLE zip_handle) {
282 zlib_filefunc_def zip_funcs; 290 zlib_filefunc_def zip_funcs;
283 fill_win32_filefunc(&zip_funcs); 291 fill_win32_filefunc(&zip_funcs);
284 zip_funcs.zopen_file = HandleOpenFileFunc; 292 zip_funcs.zopen_file = HandleOpenFileFunc;
293 zip_funcs.zclose_file = HandleCloseFileFunc;
285 zip_funcs.opaque = zip_handle; 294 zip_funcs.opaque = zip_handle;
286 return unzOpen2("fd", &zip_funcs); 295 return unzOpen2("fd", &zip_funcs);
287 } 296 }
288 #endif 297 #endif
289 298
290 // static 299 // static
291 unzFile PrepareMemoryForUnzipping(const std::string& data) { 300 unzFile PrepareMemoryForUnzipping(const std::string& data) {
292 if (data.empty()) 301 if (data.empty())
293 return NULL; 302 return NULL;
294 303
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 0, // versionMadeBy 378 0, // versionMadeBy
370 LANGUAGE_ENCODING_FLAG)) { // flagBase 379 LANGUAGE_ENCODING_FLAG)) { // flagBase
371 DLOG(ERROR) << "Could not open zip file entry " << str_path; 380 DLOG(ERROR) << "Could not open zip file entry " << str_path;
372 return false; 381 return false;
373 } 382 }
374 return true; 383 return true;
375 } 384 }
376 385
377 } // namespace internal 386 } // namespace internal
378 } // namespace zip 387 } // namespace zip
OLDNEW
« no previous file with comments | « third_party/zlib/google/zip.h ('k') | third_party/zlib/google/zip_reader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698