diff options
Diffstat (limited to 'src/Common/libzip/zip_close.c')
-rw-r--r-- | src/Common/libzip/zip_close.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/Common/libzip/zip_close.c b/src/Common/libzip/zip_close.c index c46e1b34..26572261 100644 --- a/src/Common/libzip/zip_close.c +++ b/src/Common/libzip/zip_close.c @@ -1,6 +1,6 @@ /* zip_close.c -- close zip archive and update changes - Copyright (C) 1999-2017 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2018 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <libzip@nih.at> @@ -520,17 +520,24 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de) { static int copy_data(zip_t *za, zip_uint64_t len) { - zip_uint8_t buf[BUFSIZE]; + DEFINE_BYTE_ARRAY(buf, BUFSIZE); size_t n; double total = (double)len; + if (!byte_array_init(buf, BUFSIZE)) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + while (len > 0) { - n = len > sizeof(buf) ? sizeof(buf) : len; + n = len > BUFSIZE ? BUFSIZE : len; if (_zip_read(za->src, buf, n, &za->error) < 0) { + byte_array_fini(buf); return -1; } if (_zip_write(za, buf, n) < 0) { + byte_array_fini(buf); return -1; } @@ -539,13 +546,14 @@ copy_data(zip_t *za, zip_uint64_t len) { _zip_progress_update(za->progress, (total - (double)len) / total); } + byte_array_fini(buf); return 0; } static int copy_source(zip_t *za, zip_source_t *src, zip_int64_t data_length) { - zip_uint8_t buf[BUFSIZE]; + DEFINE_BYTE_ARRAY(buf, BUFSIZE); zip_int64_t n, current; int ret; @@ -554,14 +562,19 @@ copy_source(zip_t *za, zip_source_t *src, zip_int64_t data_length) { return -1; } + if (!byte_array_init(buf, BUFSIZE)) { + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + ret = 0; current = 0; - while ((n = zip_source_read(src, buf, sizeof(buf))) > 0) { + while ((n = zip_source_read(src, buf, BUFSIZE)) > 0) { if (_zip_write(za, buf, (zip_uint64_t)n) < 0) { ret = -1; break; } - if (n == sizeof(buf) && za->progress && data_length > 0) { + if (n == BUFSIZE && za->progress && data_length > 0) { current += n; _zip_progress_update(za->progress, (double)current / (double)data_length); } @@ -572,6 +585,8 @@ copy_source(zip_t *za, zip_source_t *src, zip_int64_t data_length) { ret = -1; } + byte_array_fini(buf); + zip_source_close(src); return ret; |