aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2018-05-30 10:07:39 +0300
committerSergey Poznyakoff <gray@gnu.org>2018-05-30 10:07:39 +0300
commit5e2333e8119113c729874982eca32941162fe811 (patch)
tree45b37bebcda1dd593da3f28e5829ebf4a0b275f3
parenta2528b04a987bdbff4763edd2258622ad3141024 (diff)
downloadgdbm-5e2333e8119113c729874982eca32941162fe811.tar.gz
gdbm-5e2333e8119113c729874982eca32941162fe811.tar.bz2
Fix memory leaks in handling history (gdbmtool) and in gdbm_recover
-rw-r--r--src/gdbmtool.c59
-rw-r--r--src/input-rl.c1
-rw-r--r--src/recover.c1
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

Return to:

Send suggestions and report system problems to the System administrator.