VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Common/libzip/zip_source_layered.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/Common/libzip/zip_source_layered.c')
-rw-r--r--src/Common/libzip/zip_source_layered.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/Common/libzip/zip_source_layered.c b/src/Common/libzip/zip_source_layered.c
index 3c21441a..62b78e68 100644
--- a/src/Common/libzip/zip_source_layered.c
+++ b/src/Common/libzip/zip_source_layered.c
@@ -49,19 +49,27 @@ zip_source_layered(zip_t *za, zip_source_t *src, zip_source_layered_callback cb,
zip_source_t *
zip_source_layered_create(zip_source_t *src, zip_source_layered_callback cb, void *ud, zip_error_t *error) {
zip_source_t *zs;
+ zip_int64_t lower_supports, supports;
- if ((zs = _zip_source_new(error)) == NULL)
+ lower_supports = zip_source_supports(src);
+ supports = cb(src, ud, &lower_supports, sizeof(lower_supports), ZIP_SOURCE_SUPPORTS);
+ if (supports < 0) {
+ zip_error_set(error,ZIP_ER_INVAL, 0); /* Initialize in case cb doesn't return valid error. */
+ cb(src, ud, error, sizeof(*error), ZIP_SOURCE_ERROR);
return NULL;
+ }
+
+ if ((zs = _zip_source_new(error)) == NULL) {
+ return NULL;
+ }
- zip_source_keep(src);
zs->src = src;
zs->cb.l = cb;
zs->ud = ud;
+ zs->supports = supports;
- zs->supports = cb(src, ud, NULL, 0, ZIP_SOURCE_SUPPORTS);
- if (zs->supports < 0) {
- zs->supports = ZIP_SOURCE_SUPPORTS_READABLE;
- }
+ /* Layered sources can't support writing, since we currently have no use case. If we want to revisit this, we have to define how the two sources interact. */
+ zs->supports &= ~(ZIP_SOURCE_SUPPORTS_WRITABLE & ~ZIP_SOURCE_SUPPORTS_SEEKABLE);
return zs;
}