diff options
Diffstat (limited to 'src/Common/libzip/zip_filerange_crc.c')
-rw-r--r-- | src/Common/libzip/zip_filerange_crc.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/Common/libzip/zip_filerange_crc.c b/src/Common/libzip/zip_filerange_crc.c index 6c4be274..33bf5d85 100644 --- a/src/Common/libzip/zip_filerange_crc.c +++ b/src/Common/libzip/zip_filerange_crc.c @@ -1,6 +1,6 @@ /* zip_filerange_crc.c -- compute CRC32 for a range of a file - Copyright (C) 2008-2016 Dieter Baron and Thomas Klausner + Copyright (C) 2008-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> @@ -39,7 +39,8 @@ int _zip_filerange_crc(zip_source_t *src, zip_uint64_t start, zip_uint64_t len, uLong *crcp, zip_error_t *error) { - Bytef buf[BUFSIZE]; + DEFINE_BYTE_ARRAY(buf, BUFSIZE); + zip_int64_t n; *crcp = crc32(0L, Z_NULL, 0); @@ -54,14 +55,21 @@ _zip_filerange_crc(zip_source_t *src, zip_uint64_t start, zip_uint64_t len, uLon return -1; } + if (!byte_array_init(buf, BUFSIZE)) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return -1; + } + while (len > 0) { n = (zip_int64_t)(len > BUFSIZE ? BUFSIZE : len); if ((n = zip_source_read(src, buf, (zip_uint64_t)n)) < 0) { _zip_error_set_from_source(error, src); + byte_array_fini(buf); return -1; } if (n == 0) { zip_error_set(error, ZIP_ER_EOF, 0); + byte_array_fini(buf); return -1; } @@ -70,5 +78,7 @@ _zip_filerange_crc(zip_source_t *src, zip_uint64_t start, zip_uint64_t len, uLon len -= (zip_uint64_t)n; } + byte_array_fini(buf); + return 0; } |