Handle memory leaks when version() is shown. This is incredibly ugly.
authorJonathan Dieter <jdieter@gmail.com>
Mon, 8 Oct 2018 16:35:21 +0000 (17:35 +0100)
committerJonathan Dieter <jdieter@gmail.com>
Mon, 8 Oct 2018 16:35:21 +0000 (17:35 +0100)
Signed-off-by: Jonathan Dieter <jdieter@gmail.com>
src/unzck.c
src/util_common.c
src/zck.c
src/zck_delta_size.c
src/zck_dl.c
src/zck_read_header.c

index fdded0e42e6201e1e957929b9830ce2a77f9ef67..6816a929e3ccb39450c25eded051ce632d0b321a 100644 (file)
@@ -57,11 +57,15 @@ struct arguments {
   char *args[1];
   zck_log_type log_level;
   bool stdout;
+  bool exit;
 };
 
 static error_t parse_opt (int key, char *arg, struct argp_state *state) {
     struct arguments *arguments = state->input;
 
+    if(arguments->exit)
+        return 0;
+
     switch (key) {
         case 'v':
             arguments->log_level--;
@@ -73,6 +77,7 @@ static error_t parse_opt (int key, char *arg, struct argp_state *state) {
             break;
         case 'V':
             version();
+            arguments->exit = true;
             break;
 
         case ARGP_KEY_ARG:
@@ -105,7 +110,9 @@ int main (int argc, char *argv[]) {
     /* Defaults */
     arguments.log_level = ZCK_LOG_ERROR;
 
-    argp_parse (&argp, argc, argv, 0, 0, &arguments);
+    int retval = argp_parse (&argp, argc, argv, 0, 0, &arguments);
+    if(retval || arguments.exit)
+        exit(retval);
 
     zck_set_log_level(arguments.log_level);
 
index dd7494696c800d1bd2275d5832fc6080bf83bc43..af8e8782f8dc7c0a8b6cd15b320a79de88001cd2 100644 (file)
@@ -34,5 +34,4 @@
 void version() {
     printf(ZCK_NAME " " ZCK_VERSION "\nCopyright (c) " ZCK_COPYRIGHT_YEAR
            " Jonathan Dieter\n");
-    exit(0);
 }
index 26d7996dc70f94ebdd4a9aa2c1f53ced68d8d85f..252ae55fa9be1778d451f4f4b9e06f68f086f012 100644 (file)
--- a/src/zck.c
+++ b/src/zck.c
@@ -67,11 +67,15 @@ struct arguments {
   bool manual_chunk;
   char *output;
   char *dict;
+  bool exit;
 };
 
 static error_t parse_opt (int key, char *arg, struct argp_state *state) {
     struct arguments *arguments = state->input;
 
+    if(arguments->exit)
+        return 0;
+
     switch (key) {
         case 'v':
             arguments->log_level--;
@@ -92,6 +96,7 @@ static error_t parse_opt (int key, char *arg, struct argp_state *state) {
             break;
         case 'V':
             version();
+            arguments->exit = true;
             break;
 
         case ARGP_KEY_ARG:
@@ -124,7 +129,9 @@ int main (int argc, char *argv[]) {
     /* Defaults */
     arguments.log_level = ZCK_LOG_ERROR;
 
-    argp_parse (&argp, argc, argv, 0, 0, &arguments);
+    int retval = argp_parse(&argp, argc, argv, 0, 0, &arguments);
+    if(retval || arguments.exit)
+        exit(retval);
 
     zck_set_log_level(arguments.log_level);
 
index c6ae3e6a95f4bef32c01c4cd10d6ff21028c4ec0..81fb3901f6db99fddb3b0ebf18bdbf75ed6df5b4 100644 (file)
@@ -53,11 +53,15 @@ static struct argp_option options[] = {
 struct arguments {
   char *args[2];
   zck_log_type log_level;
+  bool exit;
 };
 
 static error_t parse_opt (int key, char *arg, struct argp_state *state) {
     struct arguments *arguments = state->input;
 
+    if(arguments->exit)
+        return 0;
+
     switch (key) {
         case 'v':
             arguments->log_level--;
@@ -66,6 +70,7 @@ static error_t parse_opt (int key, char *arg, struct argp_state *state) {
             break;
         case 'V':
             version();
+            arguments->exit = true;
             break;
 
         case ARGP_KEY_ARG:
@@ -98,7 +103,9 @@ int main (int argc, char *argv[]) {
     /* Defaults */
     arguments.log_level = ZCK_LOG_ERROR;
 
-    argp_parse (&argp, argc, argv, 0, 0, &arguments);
+    int retval = argp_parse(&argp, argc, argv, 0, 0, &arguments);
+    if(retval || arguments.exit)
+        exit(retval);
 
     zck_set_log_level(arguments.log_level);
 
index a9e7e360d298535d6f0b36fa446389185aa917f2..206213812db09af9725eacf1a237732480b88de6 100644 (file)
@@ -70,11 +70,15 @@ struct arguments {
   zck_log_type log_level;
   char *source;
   int fail_no_ranges;
+  bool exit;
 };
 
 static error_t parse_opt (int key, char *arg, struct argp_state *state) {
     struct arguments *arguments = state->input;
 
+    if(arguments->exit)
+        return 0;
+
     switch (key) {
         case 'v':
             if(arguments->log_level > ZCK_LOG_INFO)
@@ -95,6 +99,7 @@ static error_t parse_opt (int key, char *arg, struct argp_state *state) {
             break;
         case 'V':
             version();
+            arguments->exit = true;
             break;
         case 1000:
             arguments->fail_no_ranges = 1;
@@ -272,7 +277,9 @@ int main (int argc, char *argv[]) {
     /* Defaults */
     arguments.log_level = ZCK_LOG_INFO;
 
-    argp_parse (&argp, argc, argv, 0, 0, &arguments);
+    int retval = argp_parse (&argp, argc, argv, 0, 0, &arguments);
+    if(retval || arguments.exit)
+        exit(retval);
 
     curl_global_init(CURL_GLOBAL_ALL);
 
@@ -333,8 +340,8 @@ int main (int argc, char *argv[]) {
 
     int exit_val = 0;
 
-    int retval = dl_header(curl_ctx, dl, arguments.args[0],
-                           arguments.fail_no_ranges, arguments.log_level);
+    retval = dl_header(curl_ctx, dl, arguments.args[0],
+                       arguments.fail_no_ranges, arguments.log_level);
     if(!retval) {
         exit_val = 10;
         goto out;
index 7b96a96202784b39c339726bd718654413281042..b77c9b9ce9d7705e24c2b5cf06f339e6a8762b8d 100644 (file)
@@ -57,11 +57,15 @@ struct arguments {
   bool quiet;
   bool show_chunks;
   zck_log_type log_level;
+  bool exit;
 };
 
 static error_t parse_opt (int key, char *arg, struct argp_state *state) {
     struct arguments *arguments = state->input;
 
+    if(arguments->exit)
+        return 0;
+
     switch (key) {
         case 'v':
             arguments->log_level--;
@@ -76,6 +80,7 @@ static error_t parse_opt (int key, char *arg, struct argp_state *state) {
             break;
         case 'V':
             version();
+            arguments->exit = true;
             break;
         case 'f':
             arguments->verify = true;
@@ -111,7 +116,9 @@ int main (int argc, char *argv[]) {
     /* Defaults */
     arguments.log_level = ZCK_LOG_ERROR;
 
-    argp_parse (&argp, argc, argv, 0, 0, &arguments);
+    int retval = argp_parse (&argp, argc, argv, 0, 0, &arguments);
+    if(retval || arguments.exit)
+        exit(retval);
 
     zck_set_log_level(arguments.log_level);