VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Common/libzip/zip_dirent.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/Common/libzip/zip_dirent.c')
-rw-r--r--src/Common/libzip/zip_dirent.c531
1 files changed, 271 insertions, 260 deletions
diff --git a/src/Common/libzip/zip_dirent.c b/src/Common/libzip/zip_dirent.c
index df38afd9..060e1e95 100644
--- a/src/Common/libzip/zip_dirent.c
+++ b/src/Common/libzip/zip_dirent.c
@@ -2,3 +2,3 @@
zip_dirent.c -- read directory entry (local or central), clean dirent
- Copyright (C) 1999-2016 Dieter Baron and Thomas Klausner
+ Copyright (C) 1999-2017 Dieter Baron and Thomas Klausner
@@ -37,4 +37,4 @@
#include <string.h>
-#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/types.h>
#include <time.h>
@@ -50,4 +50,3 @@ static bool _zip_dirent_process_winzip_aes(zip_dirent_t *de, zip_error_t *error)
void
-_zip_cdir_free(zip_cdir_t *cd)
-{
+_zip_cdir_free(zip_cdir_t *cd) {
zip_uint64_t i;
@@ -57,4 +56,4 @@ _zip_cdir_free(zip_cdir_t *cd)
- for (i=0; i<cd->nentry; i++)
- _zip_entry_finalize(cd->entry+i);
+ for (i = 0; i < cd->nentry; i++)
+ _zip_entry_finalize(cd->entry + i);
free(cd->entry);
@@ -66,7 +65,6 @@ _zip_cdir_free(zip_cdir_t *cd)
zip_cdir_t *
-_zip_cdir_new(zip_uint64_t nentry, zip_error_t *error)
-{
+_zip_cdir_new(zip_uint64_t nentry, zip_error_t *error) {
zip_cdir_t *cd;
- if ((cd=(zip_cdir_t *)malloc(sizeof(*cd))) == NULL) {
+ if ((cd = (zip_cdir_t *)malloc(sizeof(*cd))) == NULL) {
zip_error_set(error, ZIP_ER_MEMORY, 0);
@@ -91,4 +89,3 @@ _zip_cdir_new(zip_uint64_t nentry, zip_error_t *error)
bool
-_zip_cdir_grow(zip_cdir_t *cd, zip_uint64_t additional_entries, zip_error_t *error)
-{
+_zip_cdir_grow(zip_cdir_t *cd, zip_uint64_t additional_entries, zip_error_t *error) {
zip_uint64_t i, new_alloc;
@@ -102,3 +99,3 @@ _zip_cdir_grow(zip_cdir_t *cd, zip_uint64_t additional_entries, zip_error_t *err
- if (new_alloc < additional_entries || new_alloc > SIZE_MAX/sizeof(*(cd->entry))) {
+ if (new_alloc < additional_entries || new_alloc > SIZE_MAX / sizeof(*(cd->entry))) {
zip_error_set(error, ZIP_ER_MEMORY, 0);
@@ -107,3 +104,3 @@ _zip_cdir_grow(zip_cdir_t *cd, zip_uint64_t additional_entries, zip_error_t *err
- if ((new_entry = (zip_entry_t *)realloc(cd->entry, sizeof(*(cd->entry))*(size_t)new_alloc)) == NULL) {
+ if ((new_entry = (zip_entry_t *)realloc(cd->entry, sizeof(*(cd->entry)) * (size_t)new_alloc)) == NULL) {
zip_error_set(error, ZIP_ER_MEMORY, 0);
@@ -115,3 +112,3 @@ _zip_cdir_grow(zip_cdir_t *cd, zip_uint64_t additional_entries, zip_error_t *err
for (i = cd->nentry; i < new_alloc; i++) {
- _zip_entry_init(cd->entry+i);
+ _zip_entry_init(cd->entry + i);
}
@@ -125,4 +122,3 @@ _zip_cdir_grow(zip_cdir_t *cd, zip_uint64_t additional_entries, zip_error_t *err
zip_int64_t
-_zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivors)
-{
+_zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivors) {
zip_uint64_t offset, size;
@@ -137,4 +133,4 @@ _zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivor
if ((off = zip_source_tell_write(za->src)) < 0) {
- _zip_error_set_from_source(&za->error, za->src);
- return -1;
+ _zip_error_set_from_source(&za->error, za->src);
+ return -1;
}
@@ -144,6 +140,6 @@ _zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivor
- for (i=0; i<survivors; i++) {
- zip_entry_t *entry = za->entry+filelist[i].idx;
+ for (i = 0; i < survivors; i++) {
+ zip_entry_t *entry = za->entry + filelist[i].idx;
- if ((ret=_zip_dirent_write(za, entry->changes ? entry->changes : entry->orig, ZIP_FL_CENTRAL)) < 0)
+ if ((ret = _zip_dirent_write(za, entry->changes ? entry->changes : entry->orig, ZIP_FL_CENTRAL)) < 0)
return -1;
@@ -154,4 +150,4 @@ _zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivor
if ((off = zip_source_tell_write(za->src)) < 0) {
- _zip_error_set_from_source(&za->error, za->src);
- return -1;
+ _zip_error_set_from_source(&za->error, za->src);
+ return -1;
}
@@ -164,4 +160,4 @@ _zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivor
if ((buffer = _zip_buffer_new(buf, sizeof(buf))) == NULL) {
- zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
- return -1;
+ zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+ return -1;
}
@@ -170,3 +166,3 @@ _zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivor
_zip_buffer_put(buffer, EOCD64_MAGIC, 4);
- _zip_buffer_put_64(buffer, EOCD64LEN-12);
+ _zip_buffer_put_64(buffer, EOCD64LEN - 12);
_zip_buffer_put_16(buffer, 45);
@@ -181,3 +177,3 @@ _zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivor
_zip_buffer_put_32(buffer, 0);
- _zip_buffer_put_64(buffer, offset+size);
+ _zip_buffer_put_64(buffer, offset + size);
_zip_buffer_put_32(buffer, 1);
@@ -197,5 +193,5 @@ _zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivor
if (!_zip_buffer_ok(buffer)) {
- zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
- _zip_buffer_free(buffer);
- return -1;
+ zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
+ _zip_buffer_free(buffer);
+ return -1;
}
@@ -203,3 +199,3 @@ _zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivor
if (_zip_write(za, _zip_buffer_data(buffer), _zip_buffer_offset(buffer)) < 0) {
- _zip_buffer_free(buffer);
+ _zip_buffer_free(buffer);
return -1;
@@ -220,7 +216,6 @@ _zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivor
zip_dirent_t *
-_zip_dirent_clone(const zip_dirent_t *sde)
-{
+_zip_dirent_clone(const zip_dirent_t *sde) {
zip_dirent_t *tde;
- if ((tde=(zip_dirent_t *)malloc(sizeof(*tde))) == NULL)
+ if ((tde = (zip_dirent_t *)malloc(sizeof(*tde))) == NULL)
return NULL;
@@ -240,4 +235,3 @@ _zip_dirent_clone(const zip_dirent_t *sde)
void
-_zip_dirent_finalize(zip_dirent_t *zde)
-{
+_zip_dirent_finalize(zip_dirent_t *zde) {
if (!zde->cloned || zde->changed & ZIP_DIRENT_FILENAME) {
@@ -265,4 +259,3 @@ _zip_dirent_finalize(zip_dirent_t *zde)
void
-_zip_dirent_free(zip_dirent_t *zde)
-{
+_zip_dirent_free(zip_dirent_t *zde) {
if (zde == NULL)
@@ -276,4 +269,3 @@ _zip_dirent_free(zip_dirent_t *zde)
void
-_zip_dirent_init(zip_dirent_t *de)
-{
+_zip_dirent_init(zip_dirent_t *de) {
de->changed = 0;
@@ -283,4 +275,4 @@ _zip_dirent_init(zip_dirent_t *de)
de->crc_valid = true;
- de->version_madeby = 20 | (ZIP_OPSYS_DEFAULT << 8);
- de->version_needed = 20; /* 2.0 */
+ de->version_madeby = 63 | (ZIP_OPSYS_DEFAULT << 8);
+ de->version_needed = 10; /* 1.0 */
de->bitflags = 0;
@@ -298,2 +290,3 @@ _zip_dirent_init(zip_dirent_t *de)
de->offset = 0;
+ de->compression_level = 0;
de->encryption_method = ZIP_EM_NONE;
@@ -304,6 +297,4 @@ _zip_dirent_init(zip_dirent_t *de)
bool
-_zip_dirent_needs_zip64(const zip_dirent_t *de, zip_flags_t flags)
-{
- if (de->uncomp_size >= ZIP_UINT32_MAX || de->comp_size >= ZIP_UINT32_MAX
- || ((flags & ZIP_FL_CENTRAL) && de->offset >= ZIP_UINT32_MAX))
+_zip_dirent_needs_zip64(const zip_dirent_t *de, zip_flags_t flags) {
+ if (de->uncomp_size >= ZIP_UINT32_MAX || de->comp_size >= ZIP_UINT32_MAX || ((flags & ZIP_FL_CENTRAL) && de->offset >= ZIP_UINT32_MAX))
return true;
@@ -315,7 +306,6 @@ _zip_dirent_needs_zip64(const zip_dirent_t *de, zip_flags_t flags)
zip_dirent_t *
-_zip_dirent_new(void)
-{
+_zip_dirent_new(void) {
zip_dirent_t *de;
- if ((de=(zip_dirent_t *)malloc(sizeof(*de))) == NULL)
+ if ((de = (zip_dirent_t *)malloc(sizeof(*de))) == NULL)
return NULL;
@@ -338,4 +328,3 @@ _zip_dirent_new(void)
zip_int64_t
-_zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, bool local, zip_error_t *error)
-{
+_zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, bool local, zip_error_t *error) {
zip_uint8_t buf[CDENTRYSIZE];
@@ -350,11 +339,11 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo
if (buffer) {
- if (_zip_buffer_left(buffer) < size) {
- zip_error_set(error, ZIP_ER_NOZIP, 0);
- return -1;
- }
+ if (_zip_buffer_left(buffer) < size) {
+ zip_error_set(error, ZIP_ER_NOZIP, 0);
+ return -1;
+ }
}
else {
- if ((buffer = _zip_buffer_new_from_source(src, size, buf, error)) == NULL) {
- return -1;
- }
+ if ((buffer = _zip_buffer_new_from_source(src, size, buf, error)) == NULL) {
+ return -1;
+ }
}
@@ -363,5 +352,5 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo
zip_error_set(error, ZIP_ER_NOZIP, 0);
- if (!from_buffer) {
- _zip_buffer_free(buffer);
- }
+ if (!from_buffer) {
+ _zip_buffer_free(buffer);
+ }
return -1;
@@ -398,3 +387,4 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo
zde->offset = 0;
- } else {
+ }
+ else {
comment_len = _zip_buffer_get_16(buffer);
@@ -407,7 +397,7 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo
if (!_zip_buffer_ok(buffer)) {
- zip_error_set(error, ZIP_ER_INTERNAL, 0);
- if (!from_buffer) {
- _zip_buffer_free(buffer);
- }
- return -1;
+ zip_error_set(error, ZIP_ER_INTERNAL, 0);
+ if (!from_buffer) {
+ _zip_buffer_free(buffer);
+ }
+ return -1;
}
@@ -431,16 +421,16 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo
- variable_size = (zip_uint32_t)filename_len+(zip_uint32_t)ef_len+(zip_uint32_t)comment_len;
+ variable_size = (zip_uint32_t)filename_len + (zip_uint32_t)ef_len + (zip_uint32_t)comment_len;
if (from_buffer) {
- if (_zip_buffer_left(buffer) < variable_size) {
- zip_error_set(error, ZIP_ER_INCONS, 0);
- return -1;
- }
+ if (_zip_buffer_left(buffer) < variable_size) {
+ zip_error_set(error, ZIP_ER_INCONS, 0);
+ return -1;
+ }
}
else {
- _zip_buffer_free(buffer);
+ _zip_buffer_free(buffer);
- if ((buffer = _zip_buffer_new_from_source(src, variable_size, NULL, error)) == NULL) {
- return -1;
- }
+ if ((buffer = _zip_buffer_new_from_source(src, variable_size, NULL, error)) == NULL) {
+ return -1;
+ }
}
@@ -449,11 +439,11 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo
zde->filename = _zip_read_string(buffer, src, filename_len, 1, error);
- if (!zde->filename) {
- if (zip_error_code_zip(error) == ZIP_ER_EOF) {
- zip_error_set(error, ZIP_ER_INCONS, 0);
- }
- if (!from_buffer) {
- _zip_buffer_free(buffer);
- }
+ if (!zde->filename) {
+ if (zip_error_code_zip(error) == ZIP_ER_EOF) {
+ zip_error_set(error, ZIP_ER_INCONS, 0);
+ }
+ if (!from_buffer) {
+ _zip_buffer_free(buffer);
+ }
return -1;
- }
+ }
@@ -462,5 +452,5 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo
zip_error_set(error, ZIP_ER_INCONS, 0);
- if (!from_buffer) {
- _zip_buffer_free(buffer);
- }
+ if (!from_buffer) {
+ _zip_buffer_free(buffer);
+ }
return -1;
@@ -473,13 +463,13 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo
- if (ef == NULL) {
- if (!from_buffer) {
- _zip_buffer_free(buffer);
- }
+ if (ef == NULL) {
+ if (!from_buffer) {
+ _zip_buffer_free(buffer);
+ }
return -1;
- }
- if (!_zip_ef_parse(ef, ef_len, local ? ZIP_EF_LOCAL : ZIP_EF_CENTRAL, &zde->extra_fields, error)) {
+ }
+ if (!_zip_ef_parse(ef, ef_len, local ? ZIP_EF_LOCAL : ZIP_EF_CENTRAL, &zde->extra_fields, error)) {
free(ef);
- if (!from_buffer) {
- _zip_buffer_free(buffer);
- }
+ if (!from_buffer) {
+ _zip_buffer_free(buffer);
+ }
return -1;
@@ -493,8 +483,8 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo
zde->comment = _zip_read_string(buffer, src, comment_len, 0, error);
- if (!zde->comment) {
- if (!from_buffer) {
- _zip_buffer_free(buffer);
- }
+ if (!zde->comment) {
+ if (!from_buffer) {
+ _zip_buffer_free(buffer);
+ }
return -1;
- }
+ }
if (zde->bitflags & ZIP_GPBF_ENCODING_UTF_8) {
@@ -502,5 +492,5 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo
zip_error_set(error, ZIP_ER_INCONS, 0);
- if (!from_buffer) {
- _zip_buffer_free(buffer);
- }
+ if (!from_buffer) {
+ _zip_buffer_free(buffer);
+ }
return -1;
@@ -517,19 +507,19 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo
zip_uint16_t got_len;
- zip_buffer_t *ef_buffer;
+ zip_buffer_t *ef_buffer;
const zip_uint8_t *ef = _zip_ef_get_by_id(zde->extra_fields, &got_len, ZIP_EF_ZIP64, 0, local ? ZIP_EF_LOCAL : ZIP_EF_CENTRAL, error);
/* TODO: if got_len == 0 && !ZIP64_EOCD: no error, 0xffffffff is valid value */
- if (ef == NULL) {
- if (!from_buffer) {
- _zip_buffer_free(buffer);
- }
+ if (ef == NULL) {
+ if (!from_buffer) {
+ _zip_buffer_free(buffer);
+ }
return -1;
- }
+ }
- if ((ef_buffer = _zip_buffer_new((zip_uint8_t *)ef, got_len)) == NULL) {
- zip_error_set(error, ZIP_ER_MEMORY, 0);
- if (!from_buffer) {
- _zip_buffer_free(buffer);
- }
- return -1;
- }
+ if ((ef_buffer = _zip_buffer_new((zip_uint8_t *)ef, got_len)) == NULL) {
+ zip_error_set(error, ZIP_ER_MEMORY, 0);
+ if (!from_buffer) {
+ _zip_buffer_free(buffer);
+ }
+ return -1;
+ }
@@ -540,3 +530,3 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo
include BOTH original and compressed file size fields. */
- (void)_zip_buffer_skip(ef_buffer, 8); /* error is caught by _zip_buffer_eof() call */
+ (void)_zip_buffer_skip(ef_buffer, 8); /* error is caught by _zip_buffer_eof() call */
}
@@ -551,11 +541,11 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo
- if (!_zip_buffer_eof(ef_buffer)) {
- zip_error_set(error, ZIP_ER_INCONS, 0);
- _zip_buffer_free(ef_buffer);
- if (!from_buffer) {
- _zip_buffer_free(buffer);
- }
- return -1;
- }
- _zip_buffer_free(ef_buffer);
+ if (!_zip_buffer_eof(ef_buffer)) {
+ zip_error_set(error, ZIP_ER_INCONS, 0);
+ _zip_buffer_free(ef_buffer);
+ if (!from_buffer) {
+ _zip_buffer_free(buffer);
+ }
+ return -1;
+ }
+ _zip_buffer_free(ef_buffer);
}
@@ -563,10 +553,10 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo
if (!_zip_buffer_ok(buffer)) {
- zip_error_set(error, ZIP_ER_INTERNAL, 0);
- if (!from_buffer) {
- _zip_buffer_free(buffer);
- }
- return -1;
+ zip_error_set(error, ZIP_ER_INTERNAL, 0);
+ if (!from_buffer) {
+ _zip_buffer_free(buffer);
+ }
+ return -1;
}
if (!from_buffer) {
- _zip_buffer_free(buffer);
+ _zip_buffer_free(buffer);
}
@@ -580,5 +570,2 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo
if (!_zip_dirent_process_winzip_aes(zde, error)) {
- if (!from_buffer) {
- _zip_buffer_free(buffer);
- }
return -1;
@@ -593,4 +580,3 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo
static zip_string_t *
-_zip_dirent_process_ef_utf_8(const zip_dirent_t *de, zip_uint16_t id, zip_string_t *str)
-{
+_zip_dirent_process_ef_utf_8(const zip_dirent_t *de, zip_uint16_t id, zip_string_t *str) {
zip_uint16_t ef_len;
@@ -606,3 +592,3 @@ _zip_dirent_process_ef_utf_8(const zip_dirent_t *de, zip_uint16_t id, zip_string
if ((buffer = _zip_buffer_new((zip_uint8_t *)ef, ef_len)) == NULL) {
- return str;
+ return str;
}
@@ -613,4 +599,4 @@ _zip_dirent_process_ef_utf_8(const zip_dirent_t *de, zip_uint16_t id, zip_string
if (_zip_string_crc32(str) == ef_crc) {
- zip_uint16_t len = (zip_uint16_t)_zip_buffer_left(buffer);
- zip_string_t *ef_str = _zip_string_new(_zip_buffer_get(buffer, len), len, ZIP_FL_ENC_UTF_8, NULL);
+ zip_uint16_t len = (zip_uint16_t)_zip_buffer_left(buffer);
+ zip_string_t *ef_str = _zip_string_new(_zip_buffer_get(buffer, len), len, ZIP_FL_ENC_UTF_8, NULL);
@@ -629,4 +615,3 @@ _zip_dirent_process_ef_utf_8(const zip_dirent_t *de, zip_uint16_t id, zip_string
static bool
-_zip_dirent_process_winzip_aes(zip_dirent_t *de, zip_error_t *error)
-{
+_zip_dirent_process_winzip_aes(zip_dirent_t *de, zip_error_t *error) {
zip_uint16_t ef_len;
@@ -651,3 +636,3 @@ _zip_dirent_process_winzip_aes(zip_dirent_t *de, zip_error_t *error)
zip_error_set(error, ZIP_ER_INTERNAL, 0);
- return false;
+ return false;
}
@@ -713,4 +698,3 @@ _zip_dirent_process_winzip_aes(zip_dirent_t *de, zip_error_t *error)
zip_int32_t
-_zip_dirent_size(zip_source_t *src, zip_uint16_t flags, zip_error_t *error)
-{
+_zip_dirent_size(zip_source_t *src, zip_uint16_t flags, zip_error_t *error) {
zip_int32_t size;
@@ -724,3 +708,3 @@ _zip_dirent_size(zip_source_t *src, zip_uint16_t flags, zip_error_t *error)
if (zip_source_seek(src, local ? 26 : 28, SEEK_CUR) < 0) {
- _zip_error_set_from_source(error, src);
+ _zip_error_set_from_source(error, src);
return -1;
@@ -732,3 +716,3 @@ _zip_dirent_size(zip_source_t *src, zip_uint16_t flags, zip_error_t *error)
- for (i=0; i<(local ? 2 : 3); i++) {
+ for (i = 0; i < (local ? 2 : 3); i++) {
size += _zip_buffer_get_16(buffer);
@@ -737,5 +721,5 @@ _zip_dirent_size(zip_source_t *src, zip_uint16_t flags, zip_error_t *error)
if (!_zip_buffer_eof(buffer)) {
- zip_error_set(error, ZIP_ER_INTERNAL, 0);
+ zip_error_set(error, ZIP_ER_INTERNAL, 0);
_zip_buffer_free(buffer);
- return -1;
+ return -1;
}
@@ -758,4 +742,3 @@ _zip_dirent_size(zip_source_t *src, zip_uint16_t flags, zip_error_t *error)
int
-_zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
-{
+_zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags) {
zip_uint16_t dostime, dosdate;
@@ -776,5 +759,3 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
- if ((name_enc == ZIP_ENCODING_UTF8_KNOWN && com_enc == ZIP_ENCODING_ASCII) ||
- (name_enc == ZIP_ENCODING_ASCII && com_enc == ZIP_ENCODING_UTF8_KNOWN) ||
- (name_enc == ZIP_ENCODING_UTF8_KNOWN && com_enc == ZIP_ENCODING_UTF8_KNOWN))
+ if ((name_enc == ZIP_ENCODING_UTF8_KNOWN && com_enc == ZIP_ENCODING_ASCII) || (name_enc == ZIP_ENCODING_ASCII && com_enc == ZIP_ENCODING_UTF8_KNOWN) || (name_enc == ZIP_ENCODING_UTF8_KNOWN && com_enc == ZIP_ENCODING_UTF8_KNOWN))
de->bitflags |= ZIP_GPBF_ENCODING_UTF_8;
@@ -787,3 +768,3 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
}
- if ((flags & ZIP_FL_LOCAL) == 0 && com_enc == ZIP_ENCODING_UTF8_KNOWN){
+ if ((flags & ZIP_FL_LOCAL) == 0 && com_enc == ZIP_ENCODING_UTF8_KNOWN) {
zip_extra_field_t *ef2 = _zip_ef_utf8(ZIP_EF_UTF_8_COMMENT, de->comment, &za->error);
@@ -799,6 +780,6 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
if (de->encryption_method == ZIP_EM_NONE) {
- de->bitflags &= ~ZIP_GPBF_ENCRYPTED;
+ de->bitflags &= (zip_uint16_t)~ZIP_GPBF_ENCRYPTED;
}
else {
- de->bitflags |= ZIP_GPBF_ENCRYPTED;
+ de->bitflags |= (zip_uint16_t)ZIP_GPBF_ENCRYPTED;
}
@@ -806,3 +787,3 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
is_really_zip64 = _zip_dirent_needs_zip64(de, flags);
- is_zip64 = (flags & (ZIP_FL_LOCAL|ZIP_FL_FORCE_ZIP64)) == (ZIP_FL_LOCAL|ZIP_FL_FORCE_ZIP64) || is_really_zip64;
+ is_zip64 = (flags & (ZIP_FL_LOCAL | ZIP_FL_FORCE_ZIP64)) == (ZIP_FL_LOCAL | ZIP_FL_FORCE_ZIP64) || is_really_zip64;
is_winzip_aes = de->encryption_method == ZIP_EM_AES_128 || de->encryption_method == ZIP_EM_AES_192 || de->encryption_method == ZIP_EM_AES_256;
@@ -810,41 +791,41 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
if (is_zip64) {
- zip_uint8_t ef_zip64[EFZIP64SIZE];
- zip_buffer_t *ef_buffer = _zip_buffer_new(ef_zip64, sizeof(ef_zip64));
- if (ef_buffer == NULL) {
- zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+ zip_uint8_t ef_zip64[EFZIP64SIZE];
+ zip_buffer_t *ef_buffer = _zip_buffer_new(ef_zip64, sizeof(ef_zip64));
+ if (ef_buffer == NULL) {
+ zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
_zip_ef_free(ef);
- return -1;
- }
-
- if (flags & ZIP_FL_LOCAL) {
- if ((flags & ZIP_FL_FORCE_ZIP64) || de->comp_size > ZIP_UINT32_MAX || de->uncomp_size > ZIP_UINT32_MAX) {
- _zip_buffer_put_64(ef_buffer, de->uncomp_size);
- _zip_buffer_put_64(ef_buffer, de->comp_size);
- }
- }
- else {
- if ((flags & ZIP_FL_FORCE_ZIP64) || de->comp_size > ZIP_UINT32_MAX || de->uncomp_size > ZIP_UINT32_MAX || de->offset > ZIP_UINT32_MAX) {
- if (de->uncomp_size >= ZIP_UINT32_MAX) {
- _zip_buffer_put_64(ef_buffer, de->uncomp_size);
- }
- if (de->comp_size >= ZIP_UINT32_MAX) {
- _zip_buffer_put_64(ef_buffer, de->comp_size);
- }
- if (de->offset >= ZIP_UINT32_MAX) {
- _zip_buffer_put_64(ef_buffer, de->offset);
- }
- }
- }
-
- if (!_zip_buffer_ok(ef_buffer)) {
- zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
- _zip_buffer_free(ef_buffer);
+ return -1;
+ }
+
+ if (flags & ZIP_FL_LOCAL) {
+ if ((flags & ZIP_FL_FORCE_ZIP64) || de->comp_size > ZIP_UINT32_MAX || de->uncomp_size > ZIP_UINT32_MAX) {
+ _zip_buffer_put_64(ef_buffer, de->uncomp_size);
+ _zip_buffer_put_64(ef_buffer, de->comp_size);
+ }
+ }
+ else {
+ if ((flags & ZIP_FL_FORCE_ZIP64) || de->comp_size > ZIP_UINT32_MAX || de->uncomp_size > ZIP_UINT32_MAX || de->offset > ZIP_UINT32_MAX) {
+ if (de->uncomp_size >= ZIP_UINT32_MAX) {
+ _zip_buffer_put_64(ef_buffer, de->uncomp_size);
+ }
+ if (de->comp_size >= ZIP_UINT32_MAX) {
+ _zip_buffer_put_64(ef_buffer, de->comp_size);
+ }
+ if (de->offset >= ZIP_UINT32_MAX) {
+ _zip_buffer_put_64(ef_buffer, de->offset);
+ }
+ }
+ }
+
+ if (!_zip_buffer_ok(ef_buffer)) {
+ zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
+ _zip_buffer_free(ef_buffer);
_zip_ef_free(ef);
- return -1;
- }
+ return -1;
+ }
- ef64 = _zip_ef_new(ZIP_EF_ZIP64, (zip_uint16_t)(_zip_buffer_offset(ef_buffer)), ef_zip64, ZIP_EF_BOTH);
- _zip_buffer_free(ef_buffer);
- ef64->next = ef;
- ef = ef64;
+ ef64 = _zip_ef_new(ZIP_EF_ZIP64, (zip_uint16_t)(_zip_buffer_offset(ef_buffer)), ef_zip64, ZIP_EF_BOTH);
+ _zip_buffer_free(ef_buffer);
+ ef64->next = ef;
+ ef = ef64;
}
@@ -853,10 +834,10 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
zip_uint8_t data[EF_WINZIP_AES_SIZE];
- zip_buffer_t *ef_buffer = _zip_buffer_new(data, sizeof(data));
+ zip_buffer_t *ef_buffer = _zip_buffer_new(data, sizeof(data));
zip_extra_field_t *ef_winzip;
-
- if (ef_buffer == NULL) {
- zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+
+ if (ef_buffer == NULL) {
+ zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
_zip_ef_free(ef);
- return -1;
- }
+ return -1;
+ }
@@ -864,16 +845,16 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
_zip_buffer_put(ef_buffer, "AE", 2);
- _zip_buffer_put_8(ef_buffer, (de->encryption_method & 0xff));
+ _zip_buffer_put_8(ef_buffer, (zip_uint8_t)(de->encryption_method & 0xff));
_zip_buffer_put_16(ef_buffer, (zip_uint16_t)de->comp_method);
- if (!_zip_buffer_ok(ef_buffer)) {
- zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
- _zip_buffer_free(ef_buffer);
+ if (!_zip_buffer_ok(ef_buffer)) {
+ zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
+ _zip_buffer_free(ef_buffer);
_zip_ef_free(ef);
- return -1;
- }
+ return -1;
+ }
- ef_winzip = _zip_ef_new(ZIP_EF_WINZIP_AES, EF_WINZIP_AES_SIZE, data, ZIP_EF_BOTH);
- _zip_buffer_free(ef_buffer);
- ef_winzip->next = ef;
- ef = ef_winzip;
+ ef_winzip = _zip_ef_new(ZIP_EF_WINZIP_AES, EF_WINZIP_AES_SIZE, data, ZIP_EF_BOTH);
+ _zip_buffer_free(ef_buffer);
+ ef_winzip->next = ef;
+ ef = ef_winzip;
}
@@ -881,5 +862,5 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
if ((buffer = _zip_buffer_new(buf, sizeof(buf))) == NULL) {
- zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
- _zip_ef_free(ef);
- return -1;
+ zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+ _zip_ef_free(ef);
+ return -1;
}
@@ -889,6 +870,6 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
if ((flags & ZIP_FL_LOCAL) == 0) {
- _zip_buffer_put_16(buffer, (zip_uint16_t)(is_really_zip64 ? 45 : de->version_madeby));
+ _zip_buffer_put_16(buffer, (zip_uint16_t)(is_really_zip64 ? 45 : de->version_madeby));
}
_zip_buffer_put_16(buffer, (zip_uint16_t)(is_really_zip64 ? 45 : de->version_needed));
- _zip_buffer_put_16(buffer, de->bitflags&0xfff9); /* clear compression method specific flags */
+ _zip_buffer_put_16(buffer, de->bitflags);
if (is_winzip_aes) {
@@ -904,3 +885,3 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
- if (is_winzip_aes && de->uncomp_size < 20) {
+ if (is_winzip_aes && de->uncomp_size < 20) {
_zip_buffer_put_32(buffer, 0);
@@ -921,14 +902,14 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
else {
- if (de->comp_size < ZIP_UINT32_MAX) {
+ if (de->comp_size < ZIP_UINT32_MAX) {
_zip_buffer_put_32(buffer, (zip_uint32_t)de->comp_size);
- }
- else {
+ }
+ else {
_zip_buffer_put_32(buffer, ZIP_UINT32_MAX);
- }
- if (de->uncomp_size < ZIP_UINT32_MAX) {
+ }
+ if (de->uncomp_size < ZIP_UINT32_MAX) {
_zip_buffer_put_32(buffer, (zip_uint32_t)de->uncomp_size);
- }
- else {
+ }
+ else {
_zip_buffer_put_32(buffer, ZIP_UINT32_MAX);
- }
+ }
}
@@ -952,6 +933,6 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
if (!_zip_buffer_ok(buffer)) {
- zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
- _zip_buffer_free(buffer);
- _zip_ef_free(ef);
- return -1;
+ zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
+ _zip_buffer_free(buffer);
+ _zip_ef_free(ef);
+ return -1;
}
@@ -959,5 +940,5 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
if (_zip_write(za, buf, _zip_buffer_offset(buffer)) < 0) {
- _zip_buffer_free(buffer);
- _zip_ef_free(ef);
- return -1;
+ _zip_buffer_free(buffer);
+ _zip_ef_free(ef);
+ return -1;
}
@@ -968,3 +949,3 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
if (_zip_string_write(za, de->filename) < 0) {
- _zip_ef_free(ef);
+ _zip_ef_free(ef);
return -1;
@@ -975,3 +956,3 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
if (_zip_ef_write(za, ef, ZIP_EF_BOTH) < 0) {
- _zip_ef_free(ef);
+ _zip_ef_free(ef);
return -1;
@@ -1000,4 +981,3 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags)
static time_t
-_zip_d2u_time(zip_uint16_t dtime, zip_uint16_t ddate)
-{
+_zip_d2u_time(zip_uint16_t dtime, zip_uint16_t ddate) {
struct tm tm;
@@ -1009,9 +989,9 @@ _zip_d2u_time(zip_uint16_t dtime, zip_uint16_t ddate)
- tm.tm_year = ((ddate>>9)&127) + 1980 - 1900;
- tm.tm_mon = ((ddate>>5)&15) - 1;
- tm.tm_mday = ddate&31;
+ tm.tm_year = ((ddate >> 9) & 127) + 1980 - 1900;
+ tm.tm_mon = ((ddate >> 5) & 15) - 1;
+ tm.tm_mday = ddate & 31;
- tm.tm_hour = (dtime>>11)&31;
- tm.tm_min = (dtime>>5)&63;
- tm.tm_sec = (dtime<<1)&62;
+ tm.tm_hour = (dtime >> 11) & 31;
+ tm.tm_min = (dtime >> 5) & 63;
+ tm.tm_sec = (dtime << 1) & 62;
@@ -1022,4 +1002,3 @@ _zip_d2u_time(zip_uint16_t dtime, zip_uint16_t ddate)
static zip_extra_field_t *
-_zip_ef_utf8(zip_uint16_t id, zip_string_t *str, zip_error_t *error)
-{
+_zip_ef_utf8(zip_uint16_t id, zip_string_t *str, zip_error_t *error) {
const zip_uint8_t *raw;
@@ -1029,3 +1008,3 @@ _zip_ef_utf8(zip_uint16_t id, zip_string_t *str, zip_error_t *error)
- if ((raw=_zip_string_get(str, &len, ZIP_FL_ENC_RAW, NULL)) == NULL) {
+ if ((raw = _zip_string_get(str, &len, ZIP_FL_ENC_RAW, NULL)) == NULL) {
/* error already set */
@@ -1034,8 +1013,8 @@ _zip_ef_utf8(zip_uint16_t id, zip_string_t *str, zip_error_t *error)
- if (len+5 > ZIP_UINT16_MAX) {
- zip_error_set(error, ZIP_ER_INVAL, 0); /* TODO: better error code? */
- return NULL;
+ if (len + 5 > ZIP_UINT16_MAX) {
+ zip_error_set(error, ZIP_ER_INVAL, 0); /* TODO: better error code? */
+ return NULL;
}
- if ((buffer = _zip_buffer_new(NULL, len+5)) == NULL) {
+ if ((buffer = _zip_buffer_new(NULL, len + 5)) == NULL) {
zip_error_set(error, ZIP_ER_MEMORY, 0);
@@ -1049,5 +1028,5 @@ _zip_ef_utf8(zip_uint16_t id, zip_string_t *str, zip_error_t *error)
if (!_zip_buffer_ok(buffer)) {
- zip_error_set(error, ZIP_ER_INTERNAL, 0);
- _zip_buffer_free(buffer);
- return NULL;
+ zip_error_set(error, ZIP_ER_INTERNAL, 0);
+ _zip_buffer_free(buffer);
+ return NULL;
}
@@ -1062,4 +1041,3 @@ _zip_ef_utf8(zip_uint16_t id, zip_string_t *str, zip_error_t *error)
zip_dirent_t *
-_zip_get_dirent(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_error_t *error)
-{
+_zip_get_dirent(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_error_t *error) {
if (error == NULL)
@@ -1088,7 +1066,4 @@ _zip_get_dirent(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_error_t *err
-
-
void
-_zip_u2d_time(time_t intime, zip_uint16_t *dtime, zip_uint16_t *ddate)
-{
+_zip_u2d_time(time_t intime, zip_uint16_t *dtime, zip_uint16_t *ddate) {
struct tm *tm;
@@ -1100,4 +1075,4 @@ _zip_u2d_time(time_t intime, zip_uint16_t *dtime, zip_uint16_t *ddate)
- *ddate = (zip_uint16_t)(((tm->tm_year+1900-1980)<<9) + ((tm->tm_mon+1)<<5) + tm->tm_mday);
- *dtime = (zip_uint16_t)(((tm->tm_hour)<<11) + ((tm->tm_min)<<5) + ((tm->tm_sec)>>1));
+ *ddate = (zip_uint16_t)(((tm->tm_year + 1900 - 1980) << 9) + ((tm->tm_mon + 1) << 5) + tm->tm_mday);
+ *dtime = (zip_uint16_t)(((tm->tm_hour) << 11) + ((tm->tm_min) << 5) + ((tm->tm_sec) >> 1));
@@ -1105 +1080,37 @@ _zip_u2d_time(time_t intime, zip_uint16_t *dtime, zip_uint16_t *ddate)
}
+
+
+void
+_zip_dirent_set_version_needed(zip_dirent_t *de, bool force_zip64) {
+ zip_uint16_t length;
+
+ if (de->comp_method == ZIP_CM_LZMA) {
+ de->version_needed = 63;
+ return;
+ }
+
+ if (de->comp_method == ZIP_CM_BZIP2) {
+ de->version_needed = 46;
+ return;
+ }
+
+ if (force_zip64 || _zip_dirent_needs_zip64(de, 0)) {
+ de->version_needed = 45;
+ return;
+ }
+
+ if (de->comp_method == ZIP_CM_DEFLATE || de->encryption_method == ZIP_EM_TRAD_PKWARE) {
+ de->version_needed = 20;
+ return;
+ }
+
+ /* directory */
+ if ((length = _zip_string_length(de->filename)) > 0) {
+ if (de->filename->raw[length - 1] == '/') {
+ de->version_needed = 20;
+ return;
+ }
+ }
+
+ de->version_needed = 10;
+}