summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristophe Grenier <[email protected]>2025-06-22 19:44:57 +0200
committerChristophe Grenier <[email protected]>2025-06-22 19:44:57 +0200
commita66fddd0a2ca85fe68201ed4a49f9a6c60436eb3 (patch)
tree7cd6fd2e6051fac937fba0ea13a9c81455bee14d
parent67c32df3adff8453c15ac48eed9672b34b0b20e6 (diff)
src/file_zip.c: allow encrypted zip ("encrypted-package")
-rw-r--r--src/file_zip.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/file_zip.c b/src/file_zip.c
index c01bcade..8f7c1c62 100644
--- a/src/file_zip.c
+++ b/src/file_zip.c
@@ -388,13 +388,14 @@ static const char *zip_parse_parse_entry_mimetype(const char *mime, const unsign
*ext == extension_xrns ||
*ext == file_hint_zip.extension;
@ ensures fr->file_size < 0x8000000000000000;
- @ ensures \result == -1 || \result == 0;
+ @ ensures \result == -1 || \result == 0 || \result ==1;
@ ensures \result == 0 ==> (fr->file_size > \old(fr->file_size));
@ assigns *fr->handle, fr->file_size, *ext;
@ assigns Frama_C_entropy_source, errno;
@ assigns first_filename[0 .. 255];
@ assigns msoffice, sh3d, ext_msoffice;
@*/
+// Returns 1 if encrypted-package
static int zip_parse_file_entry_fn(file_recovery_t *fr, const char **ext, const unsigned int file_nbr, const zip_file_entry_t *file, const uint64_t len)
{
char filename[65535+1];
@@ -421,6 +422,10 @@ static int zip_parse_file_entry_fn(file_recovery_t *fr, const char **ext, const
#ifdef DEBUG_ZIP
log_info("%s (len=%lu)\n", filename, len);
#endif
+ if(len==17 && memcmp(filename, "encrypted-package", 17)==0)
+ {
+ return 1;
+ }
if(*ext!=NULL)
return 0;
if(file_nbr==0)
@@ -595,9 +600,11 @@ static int zip_parse_file_entry_fn(file_recovery_t *fr, const char **ext, const
*ext == extension_xpi ||
*ext == extension_xrns ||
*ext == file_hint_zip.extension;
- @ ensures \result == -1 || \result == 0;
+ @ ensures \result == -1 || \result == 0 || result == 1;
@ ensures \result == 0 ==> fr->file_size < 0x8000000000000000;
@ ensures \result == 0 ==> (fr->file_size > \old(fr->file_size));
+ @ ensures \result == 1 ==> fr->file_size < 0x8000000000000000;
+ @ ensures \result == 1 ==> (fr->file_size > \old(fr->file_size));
@ assigns *fr->handle, fr->file_size, *ext;
@ assigns fr->time;
@ assigns Frama_C_entropy_source, errno;
@@ -614,6 +621,7 @@ static int zip_parse_file_entry(file_recovery_t *fr, const char **ext, const uns
/*@ assert \valid_read(file); */
/*@ assert \valid_read(extra); */
uint64_t len;
+ int fn_status=0;
if (fread(b_file, sizeof(b_file), 1, fr->handle) != 1)
{
#ifdef DEBUG_ZIP
@@ -650,7 +658,8 @@ static int zip_parse_file_entry(file_recovery_t *fr, const char **ext, const uns
if (len)
{
/*@ assert 0 < len <= 65535; */
- if(zip_parse_file_entry_fn(fr, ext, file_nbr, file, len) < 0)
+ fn_status=zip_parse_file_entry_fn(fr, ext, file_nbr, file, len);
+ if(fn_status < 0)
return -1;
/*@ assert fr->file_size < 0x8000000000000000; */
}
@@ -755,6 +764,8 @@ static int zip_parse_file_entry(file_recovery_t *fr, const char **ext, const uns
}
}
/*@ assert fr->file_size < 0x8000000000000000; */
+ if(fn_status==1)
+ return 1;
return 0;
}
@@ -1038,6 +1049,7 @@ static int zip64_parse_end_central_dir_locator(file_recovery_t *fr)
static void file_check_zip(file_recovery_t *fr)
{
const char *ext=NULL;
+ const uint64_t original_file_size=fr->file_size;
unsigned int file_nbr=0;
fr->file_size = 0;
fr->offset_error=0;
@@ -1111,6 +1123,11 @@ static void file_check_zip(file_recovery_t *fr)
case ZIP_FILE_ENTRY: /* File Entry */
status = zip_parse_file_entry(fr, &ext, file_nbr);
/*@ assert (status >= 0) ==> (fr->file_size > file_size_old); */
+ if(status==1)
+ {
+ fr->file_size = original_file_size;
+ return;
+ }
file_nbr++;
break;
case ZIP_SIGNATURE: /* Signature */