diff options
author | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2017-04-26 00:10:55 +0200 |
---|---|---|
committer | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2017-04-26 00:20:19 +0200 |
commit | d081d6143e86bd350bd62dc6811629346746ac52 (patch) | |
tree | 24559cfc688a694d1fb085b000228118eb845f32 /src/Common/libzip/zip_source_read.c | |
parent | 9270952b3dd956ba2f6b2e444768354bee3ae5e2 (diff) | |
download | VeraCrypt-d081d6143e86bd350bd62dc6811629346746ac52.tar.gz VeraCrypt-d081d6143e86bd350bd62dc6811629346746ac52.zip |
Windows: update libzip to version 1.2.0
Diffstat (limited to 'src/Common/libzip/zip_source_read.c')
-rw-r--r-- | src/Common/libzip/zip_source_read.c | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/src/Common/libzip/zip_source_read.c b/src/Common/libzip/zip_source_read.c index 061a6f91..267128ba 100644 --- a/src/Common/libzip/zip_source_read.c +++ b/src/Common/libzip/zip_source_read.c @@ -1,6 +1,6 @@ /* zip_source_read.c -- read data from zip_source - Copyright (C) 2009-2014 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2016 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> @@ -38,6 +38,9 @@ zip_int64_t zip_source_read(zip_source_t *src, void *data, zip_uint64_t len) { + zip_uint64_t bytes_read; + zip_int64_t n; + if (src->source_closed) { return -1; } @@ -46,5 +49,39 @@ zip_source_read(zip_source_t *src, void *data, zip_uint64_t len) return -1; } - return _zip_source_call(src, data, len, ZIP_SOURCE_READ); + if (_zip_source_had_error(src)) { + return -1; + } + + if (_zip_source_eof(src)) { + return 0; + } + + bytes_read = 0; + while (bytes_read < len) { + if ((n = _zip_source_call(src, (zip_uint8_t *)data + bytes_read, len - bytes_read, ZIP_SOURCE_READ)) < 0) { + if (bytes_read == 0) { + return -1; + } + else { + return (zip_int64_t)bytes_read; + } + } + + if (n == 0) { + src->eof = 1; + break; + } + + bytes_read += (zip_uint64_t)n; + } + + return (zip_int64_t)bytes_read; +} + + +bool +_zip_source_eof(zip_source_t *src) +{ + return src->eof; } |