diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-05-30 10:07:39 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-05-30 10:07:39 +0300 |
commit | 5e2333e8119113c729874982eca32941162fe811 (patch) | |
tree | 45b37bebcda1dd593da3f28e5829ebf4a0b275f3 | |
parent | a2528b04a987bdbff4763edd2258622ad3141024 (diff) | |
download | gdbm-5e2333e8119113c729874982eca32941162fe811.tar.gz gdbm-5e2333e8119113c729874982eca32941162fe811.tar.bz2 |
Fix memory leaks in handling history (gdbmtool) and in gdbm_recover
-rw-r--r-- | src/gdbmtool.c | 59 | ||||
-rw-r--r-- | src/input-rl.c | 1 | ||||
-rw-r--r-- | src/recover.c | 1 |
3 files changed, 35 insertions, 26 deletions
diff --git a/src/gdbmtool.c b/src/gdbmtool.c index feca51e..46e3555 100644 --- a/src/gdbmtool.c +++ b/src/gdbmtool.c @@ -43,6 +43,18 @@ int open_mode; /* Default open mode */ unsigned input_line; +static void +closedb (void) +{ + if (gdbm_file) + { + gdbm_close (gdbm_file); + gdbm_file = NULL; + free (file_name); + file_name = NULL; + } +} + static int opendb (char *dbname) { @@ -110,7 +122,7 @@ opendb (char *dbname) } static int -checkdb () +checkdb (void) { if (!gdbm_file) { @@ -124,6 +136,13 @@ checkdb () } return 0; } + +static int +checkdb_begin (struct handler_param *param GDBM_ARG_UNUSED, + size_t *exp_count GDBM_ARG_UNUSED) +{ + return checkdb (); +} size_t bucket_print_lines (hash_bucket *bucket) @@ -358,14 +377,7 @@ void open_handler (struct handler_param *param) { char *name = tildexpand (PARAM_STRING (param, 0)); - if (file_name) - { - gdbm_close (gdbm_file); - gdbm_file = NULL; - free (file_name); - file_name = NULL; - } - + closedb (); if (opendb (name) == 0) file_name = name; else @@ -379,12 +391,7 @@ close_handler (struct handler_param *param) if (!gdbm_file) terror (_("nothing to close")); else - { - gdbm_close (gdbm_file); - gdbm_file = NULL; - free (file_name); - file_name = NULL; - } + closedb (); } @@ -928,8 +935,7 @@ list_handler (struct handler_param *param) void quit_handler (struct handler_param *param GDBM_ARG_UNUSED) { - if (gdbm_file != NULL) - gdbm_close (gdbm_file); + closedb (); input_done (); exit (EXIT_OK); } @@ -1167,19 +1173,19 @@ struct command struct command command_tab[] = { #define S(s) #s, sizeof (#s) - 1 { S(count), T_CMD, - checkdb, count_handler, NULL, + checkdb_begin, count_handler, NULL, { { NULL } }, FALSE, REPEAT_NEVER, N_("count (number of entries)") }, { S(delete), T_CMD, - checkdb, delete_handler, NULL, + checkdb_begin, delete_handler, NULL, { { N_("KEY"), GDBM_ARG_DATUM, DS_KEY }, { NULL } }, FALSE, REPEAT_NEVER, N_("delete a record") }, { S(export), T_CMD, - checkdb, export_handler, NULL, + checkdb_begin, export_handler, NULL, { { N_("FILE"), GDBM_ARG_STRING }, { "[truncate]", GDBM_ARG_STRING }, { "[binary|ascii]", GDBM_ARG_STRING }, @@ -1188,7 +1194,7 @@ struct command command_tab[] = { REPEAT_NEVER, N_("export") }, { S(fetch), T_CMD, - checkdb, fetch_handler, NULL, + checkdb_begin, fetch_handler, NULL, { { N_("KEY"), GDBM_ARG_DATUM, DS_KEY }, { NULL } }, FALSE, REPEAT_NEVER, @@ -1209,14 +1215,14 @@ struct command command_tab[] = { REPEAT_NEVER, N_("list") }, { S(next), T_CMD, - checkdb, nextkey_handler, NULL, + checkdb_begin, nextkey_handler, NULL, { { N_("[KEY]"), GDBM_ARG_DATUM, DS_KEY }, { NULL } }, FALSE, REPEAT_NOARG, N_("nextkey") }, { S(store), T_CMD, - checkdb, store_handler, NULL, + checkdb_begin, store_handler, NULL, { { N_("KEY"), GDBM_ARG_DATUM, DS_KEY }, { N_("DATA"), GDBM_ARG_DATUM, DS_CONTENT }, { NULL } }, @@ -1224,19 +1230,19 @@ struct command command_tab[] = { REPEAT_NEVER, N_("store") }, { S(first), T_CMD, - checkdb, firstkey_handler, NULL, + checkdb_begin, firstkey_handler, NULL, { { NULL } }, FALSE, REPEAT_NEVER, N_("firstkey") }, { S(reorganize), T_CMD, - checkdb, reorganize_handler, NULL, + checkdb_begin, reorganize_handler, NULL, { { NULL } }, FALSE, REPEAT_NEVER, N_("reorganize") }, { S(recover), T_CMD, - checkdb, recover_handler, NULL, + checkdb_begin, recover_handler, NULL, { { "[verbose]", GDBM_ARG_STRING }, { "[summary]", GDBM_ARG_STRING }, { "[backup]", GDBM_ARG_STRING }, @@ -2162,6 +2168,7 @@ main (int argc, char *argv[]) if (input_context_push (input)) exit (EXIT_FATAL); res = yyparse (); + closedb (); input_done (); return res; } diff --git a/src/input-rl.c b/src/input-rl.c index 695d351..e239939 100644 --- a/src/input-rl.c +++ b/src/input-rl.c @@ -48,6 +48,7 @@ retrieve_history (char *str) return 1; case 0: + free (out); break; case 1: diff --git a/src/recover.c b/src/recover.c index 8f05f71..074c76f 100644 --- a/src/recover.c +++ b/src/recover.c @@ -168,6 +168,7 @@ _gdbm_finish_transfer (GDBM_FILE dbf, GDBM_FILE new_dbf, dbf->bucket_changed = new_dbf->bucket_changed; dbf->second_changed = new_dbf->second_changed; + free (new_dbf->name); free (new_dbf); #if HAVE_MMAP |