|
|
a995b3 |
From 83a2da55922f67e07f22048ac9671a44cc0d35c4 Mon Sep 17 00:00:00 2001
|
|
|
a995b3 |
From: Guido Draheim <guidod@gmx.de>
|
|
|
a995b3 |
Date: Wed, 14 Mar 2018 07:50:44 +0100
|
|
|
a995b3 |
Subject: [PATCH] ensure disk_close to avoid mem-leak #40
|
|
|
a995b3 |
|
|
|
a995b3 |
---
|
|
|
a995b3 |
bins/unzzipcat-mem.c | 57 +++++++++++++++++++++++++++-------------------------
|
|
|
a995b3 |
bins/unzzipdir-mem.c | 10 ++++-----
|
|
|
a995b3 |
2 files changed, 34 insertions(+), 33 deletions(-)
|
|
|
a995b3 |
|
|
|
a995b3 |
diff --git a/bins/unzzipcat-mem.c b/bins/unzzipcat-mem.c
|
|
|
a995b3 |
index d13029c..9bc966b 100644
|
|
|
a995b3 |
--- a/bins/unzzipcat-mem.c
|
|
|
a995b3 |
+++ b/bins/unzzipcat-mem.c
|
|
|
a995b3 |
@@ -89,7 +89,7 @@ static FILE* create_fopen(char* name, char* mode, int subdirs)
|
|
|
a995b3 |
|
|
|
a995b3 |
static int unzzip_cat (int argc, char ** argv, int extract)
|
|
|
a995b3 |
{
|
|
|
a995b3 |
- int done;
|
|
|
a995b3 |
+ int done = 0;
|
|
|
a995b3 |
int argn;
|
|
|
a995b3 |
ZZIP_MEM_DISK* disk;
|
|
|
a995b3 |
|
|
|
a995b3 |
@@ -116,47 +116,50 @@ static int unzzip_cat (int argc, char ** argv, int extract)
|
|
|
a995b3 |
FILE* out = stdout;
|
|
|
a995b3 |
if (extract) out = create_fopen(name, "w", 1);
|
|
|
a995b3 |
if (! out) {
|
|
|
a995b3 |
- if (errno != EISDIR) done = EXIT_ERRORS;
|
|
|
a995b3 |
+ if (errno != EISDIR) {
|
|
|
a995b3 |
+ DBG3("can not open output file %i %s", errno, strerror(errno));
|
|
|
a995b3 |
+ done = EXIT_ERRORS;
|
|
|
a995b3 |
+ }
|
|
|
a995b3 |
continue;
|
|
|
a995b3 |
}
|
|
|
a995b3 |
unzzip_mem_disk_cat_file (disk, name, out);
|
|
|
a995b3 |
if (extract) fclose(out);
|
|
|
a995b3 |
}
|
|
|
a995b3 |
- return done;
|
|
|
a995b3 |
- }
|
|
|
a995b3 |
-
|
|
|
a995b3 |
- if (argc == 3 && !extract)
|
|
|
a995b3 |
+ }
|
|
|
a995b3 |
+ else if (argc == 3 && !extract)
|
|
|
a995b3 |
{ /* list from one spec */
|
|
|
a995b3 |
ZZIP_MEM_ENTRY* entry = 0;
|
|
|
a995b3 |
while ((entry = zzip_mem_disk_findmatch(disk, argv[2], entry, 0, 0)))
|
|
|
a995b3 |
{
|
|
|
a995b3 |
unzzip_mem_entry_fprint (disk, entry, stdout);
|
|
|
a995b3 |
}
|
|
|
a995b3 |
-
|
|
|
a995b3 |
- return 0;
|
|
|
a995b3 |
- }
|
|
|
a995b3 |
-
|
|
|
a995b3 |
- for (argn=1; argn < argc; argn++)
|
|
|
a995b3 |
- { /* list only the matching entries - each in order of commandline */
|
|
|
a995b3 |
- ZZIP_MEM_ENTRY* entry = zzip_mem_disk_findfirst(disk);
|
|
|
a995b3 |
- for (; entry ; entry = zzip_mem_disk_findnext(disk, entry))
|
|
|
a995b3 |
- {
|
|
|
a995b3 |
- char* name = zzip_mem_entry_to_name (entry);
|
|
|
a995b3 |
- if (! _zzip_fnmatch (argv[argn], name,
|
|
|
a995b3 |
- FNM_NOESCAPE|FNM_PATHNAME|FNM_PERIOD))
|
|
|
a995b3 |
+ } else {
|
|
|
a995b3 |
+ for (argn=1; argn < argc; argn++)
|
|
|
a995b3 |
+ { /* list only the matching entries - each in order of commandline */
|
|
|
a995b3 |
+ ZZIP_MEM_ENTRY* entry = zzip_mem_disk_findfirst(disk);
|
|
|
a995b3 |
+ for (; entry ; entry = zzip_mem_disk_findnext(disk, entry))
|
|
|
a995b3 |
{
|
|
|
a995b3 |
- FILE* out = stdout;
|
|
|
a995b3 |
- if (extract) out = create_fopen(name, "w", 1);
|
|
|
a995b3 |
- if (! out) {
|
|
|
a995b3 |
- if (errno != EISDIR) done = EXIT_ERRORS;
|
|
|
a995b3 |
- continue;
|
|
|
a995b3 |
- }
|
|
|
a995b3 |
- unzzip_mem_disk_cat_file (disk, name, out);
|
|
|
a995b3 |
- if (extract) fclose(out);
|
|
|
a995b3 |
- break; /* match loop */
|
|
|
a995b3 |
+ char* name = zzip_mem_entry_to_name (entry);
|
|
|
a995b3 |
+ if (! _zzip_fnmatch (argv[argn], name,
|
|
|
a995b3 |
+ FNM_NOESCAPE|FNM_PATHNAME|FNM_PERIOD))
|
|
|
a995b3 |
+ {
|
|
|
a995b3 |
+ FILE* out = stdout;
|
|
|
a995b3 |
+ if (extract) out = create_fopen(name, "wb", 1);
|
|
|
a995b3 |
+ if (! out) {
|
|
|
a995b3 |
+ if (errno != EISDIR) {
|
|
|
a995b3 |
+ DBG3("can not open output file %i %s", errno, strerror(errno));
|
|
|
a995b3 |
+ done = EXIT_ERRORS;
|
|
|
a995b3 |
+ }
|
|
|
a995b3 |
+ continue;
|
|
|
a995b3 |
+ }
|
|
|
a995b3 |
+ unzzip_mem_disk_cat_file (disk, name, out);
|
|
|
a995b3 |
+ if (extract) fclose(out);
|
|
|
a995b3 |
+ break; /* match loop */
|
|
|
a995b3 |
+ }
|
|
|
a995b3 |
}
|
|
|
a995b3 |
}
|
|
|
a995b3 |
}
|
|
|
a995b3 |
+ zzip_mem_disk_close(disk);
|
|
|
a995b3 |
return done;
|
|
|
a995b3 |
}
|
|
|
a995b3 |
|
|
|
a995b3 |
diff --git a/bins/unzzipdir-mem.c b/bins/unzzipdir-mem.c
|
|
|
a995b3 |
index e54cd8d..beca788 100644
|
|
|
a995b3 |
--- a/bins/unzzipdir-mem.c
|
|
|
a995b3 |
+++ b/bins/unzzipdir-mem.c
|
|
|
a995b3 |
@@ -68,10 +68,8 @@ unzzip_list (int argc, char ** argv, int verbose)
|
|
|
a995b3 |
printf ("%lli/%lli %s %s\n", csize, usize, defl, name);
|
|
|
a995b3 |
}
|
|
|
a995b3 |
}
|
|
|
a995b3 |
- return 0;
|
|
|
a995b3 |
}
|
|
|
a995b3 |
-
|
|
|
a995b3 |
- if (argc == 3)
|
|
|
a995b3 |
+ else if (argc == 3)
|
|
|
a995b3 |
{ /* list from one spec */
|
|
|
a995b3 |
ZZIP_MEM_ENTRY* entry = 0;
|
|
|
a995b3 |
while ((entry = zzip_mem_disk_findmatch(disk, argv[2], entry, 0, 0)))
|
|
|
a995b3 |
@@ -89,9 +87,8 @@ unzzip_list (int argc, char ** argv, int verbose)
|
|
|
a995b3 |
printf ("%lli/%lli %s %s\n", csize, usize, defl, name);
|
|
|
a995b3 |
}
|
|
|
a995b3 |
}
|
|
|
a995b3 |
- return 0;
|
|
|
a995b3 |
}
|
|
|
a995b3 |
-
|
|
|
a995b3 |
+ else
|
|
|
a995b3 |
{ /* list only the matching entries - in order of zip directory */
|
|
|
a995b3 |
ZZIP_MEM_ENTRY* entry = zzip_mem_disk_findfirst(disk);
|
|
|
a995b3 |
for (; entry ; entry = zzip_mem_disk_findnext(disk, entry))
|
|
|
a995b3 |
@@ -118,8 +115,9 @@ unzzip_list (int argc, char ** argv, int verbose)
|
|
|
a995b3 |
}
|
|
|
a995b3 |
}
|
|
|
a995b3 |
}
|
|
|
a995b3 |
- return 0;
|
|
|
a995b3 |
}
|
|
|
a995b3 |
+ zzip_mem_disk_close(disk);
|
|
|
a995b3 |
+ return EXIT_OK;
|
|
|
a995b3 |
}
|
|
|
a995b3 |
|
|
|
a995b3 |
int
|