From b8ad4a31e6fd9c60460eaf96baec89f02b330586 Mon Sep 17 00:00:00 2001 From: Jonathan Dieter Date: Mon, 8 Oct 2018 17:35:21 +0100 Subject: [PATCH] Handle memory leaks when version() is shown. This is incredibly ugly. Signed-off-by: Jonathan Dieter --- src/unzck.c | 9 ++++++++- src/util_common.c | 1 - src/zck.c | 9 ++++++++- src/zck_delta_size.c | 9 ++++++++- src/zck_dl.c | 13 ++++++++++--- src/zck_read_header.c | 9 ++++++++- 6 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/unzck.c b/src/unzck.c index fdded0e..6816a92 100644 --- a/src/unzck.c +++ b/src/unzck.c @@ -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); diff --git a/src/util_common.c b/src/util_common.c index dd74946..af8e878 100644 --- a/src/util_common.c +++ b/src/util_common.c @@ -34,5 +34,4 @@ void version() { printf(ZCK_NAME " " ZCK_VERSION "\nCopyright (c) " ZCK_COPYRIGHT_YEAR " Jonathan Dieter\n"); - exit(0); } diff --git a/src/zck.c b/src/zck.c index 26d7996..252ae55 100644 --- 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); diff --git a/src/zck_delta_size.c b/src/zck_delta_size.c index c6ae3e6..81fb390 100644 --- a/src/zck_delta_size.c +++ b/src/zck_delta_size.c @@ -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); diff --git a/src/zck_dl.c b/src/zck_dl.c index a9e7e36..2062138 100644 --- a/src/zck_dl.c +++ b/src/zck_dl.c @@ -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; diff --git a/src/zck_read_header.c b/src/zck_read_header.c index 7b96a96..b77c9b9 100644 --- a/src/zck_read_header.c +++ b/src/zck_read_header.c @@ -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); -- 2.30.2