diff --git a/src/knot/ctl/knotc_main.c b/src/knot/ctl/knotc_main.c
index a85081cfa112e2d65d0a839d10bf672395c6edef..84af1bc3f79f8d012e285487d2bc100626acd8c1 100644
--- a/src/knot/ctl/knotc_main.c
+++ b/src/knot/ctl/knotc_main.c
@@ -402,7 +402,7 @@ static int tsig_parse_file(knot_tsig_key_t *k, const char *f)
 int main(int argc, char **argv)
 {
 	/* Parse command line arguments */
-	int c = 0, li = 0;
+	int c = 0, li = 0, rc = 0;
 	unsigned flags = F_NULL;
 	char *config_fn = NULL;
 	char *default_config = conf_find_default();
@@ -478,30 +478,26 @@ int main(int argc, char **argv)
 			config_fn = strdup(optarg);
 			break;
 		case 'V':
+			rc = 0;
 			printf("%s, version %s\n", "Knot DNS", PACKAGE_VERSION);
-			log_close();
-			free(config_fn);
-			free(default_config);
-			return 0;
+			goto exit;
 		case 'h':
 		case '?':
+			rc = 0;
+			help(argc, argv);
+			goto exit;
 		default:
+			rc = 1;
 			help(argc, argv);
-			log_close();
-			free(config_fn);
-			free(default_config);
-			return 1;
+			goto exit;
 		}
 	}
 
 	/* Check if there's at least one remaining non-option. */
 	if (argc - optind < 1) {
+		rc = 1;
 		help(argc, argv);
-		knot_tsig_key_free(&r_key);
-		log_close();
-		free(config_fn);
-		free(default_config);
-		return 1;
+		goto exit;
 	}
 
 	/* Find requested command. */
@@ -516,11 +512,8 @@ int main(int argc, char **argv)
 	/* Command not found. */
 	if (!cmd->name) {
 		log_server_error("Invalid command: '%s'\n", argv[optind]);
-		knot_tsig_key_free(&r_key);
-		log_close();
-		free(config_fn);
-		free(default_config);
-		return 1;
+		rc = 1;
+		goto exit;
 	}
 
 	/* Open config, allow if not exists. */
@@ -566,8 +559,9 @@ int main(int argc, char **argv)
 	}
 
 	/* Execute command. */
-	int rc = cmd->cb(argc - optind - 1, argv + optind + 1, flags);
+	rc = cmd->cb(argc - optind - 1, argv + optind + 1, flags);
 
+exit:
 	/* Finish */
 	knot_tsig_key_free(&r_key);
 	log_close();