aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2021-08-11 23:52:18 +0300
committerSergey Poznyakoff <gray@gnu.org>2021-08-12 08:06:17 +0300
commitd19407eaa4b00a724c4ff3744c2f49269183da26 (patch)
tree5dce577ffd0387f83ef76661850ee1d1d0ba0692 /src
parentf77b0273db2d1f0cc1ba2d3256acfab1bda1f584 (diff)
downloadgdbm-d19407eaa4b00a724c4ff3744c2f49269183da26.tar.gz
gdbm-d19407eaa4b00a724c4ff3744c2f49269183da26.tar.bz2
gdbmtool: bugfixes
* src/gdbmshell.c (datum_free): New function. Use it whenever a datum's dptr needs to be freed. (gdbmshell_run): Initialize last_cmd and last_args at the start and free last_args before returning. * src/util.c (vgetyn): Copy ap to a temporary va_list
Diffstat (limited to 'src')
-rw-r--r--src/gdbmshell.c37
-rw-r--r--src/util.c7
2 files changed, 25 insertions, 19 deletions
diff --git a/src/gdbmshell.c b/src/gdbmshell.c
index c405664..998e40e 100644
--- a/src/gdbmshell.c
+++ b/src/gdbmshell.c
@@ -39,6 +39,12 @@ static GDBM_FILE gdbm_file = NULL; /* Database to operate upon */
static datum key_data; /* Current key */
static datum return_data; /* Current data */
+static void
+datum_free (datum *dp)
+{
+ free (dp->dptr);
+ dp->dptr = NULL;
+}
static void
closedb (void)
@@ -52,13 +58,8 @@ closedb (void)
file_descr = -1;
}
- free (key_data.dptr);
- key_data.dptr = NULL;
- key_data.dsize = 0;
-
- free (return_data.dptr);
- return_data.dptr = NULL;
- return_data.dsize = 0;
+ datum_free (&key_data);
+ datum_free (&return_data);
}
static int
@@ -441,7 +442,7 @@ fetch_handler (struct command_param *param, struct command_environ *cenv)
{
datum_format (cenv->fp, &return_data, dsdef[DS_CONTENT]);
fputc ('\n', cenv->fp);
- free (return_data.dptr);
+ datum_free (&return_data);
}
else if (gdbm_errno == GDBM_ITEM_NOT_FOUND)
terror ("%s", _("No such item found."));
@@ -465,8 +466,7 @@ store_handler (struct command_param *param,
static void
firstkey_handler (struct command_param *param, struct command_environ *cenv)
{
- if (key_data.dptr != NULL)
- free (key_data.dptr);
+ datum_free (&key_data);
key_data = gdbm_firstkey (gdbm_file);
if (key_data.dptr != NULL)
{
@@ -477,7 +477,7 @@ firstkey_handler (struct command_param *param, struct command_environ *cenv)
datum_format (cenv->fp, &return_data, dsdef[DS_CONTENT]);
fputc ('\n', cenv->fp);
- free (return_data.dptr);
+ datum_free (&return_data);
}
else if (gdbm_errno == GDBM_ITEM_NOT_FOUND)
fprintf (cenv->fp, _("No such item found.\n"));
@@ -491,8 +491,7 @@ nextkey_handler (struct command_param *param, struct command_environ *cenv)
{
if (param->argc == 1)
{
- if (key_data.dptr != NULL)
- free (key_data.dptr);
+ datum_free (&key_data);
key_data.dptr = emalloc (PARAM_DATUM (param, 0).dsize);
key_data.dsize = PARAM_DATUM (param, 0).dsize;
memcpy (key_data.dptr, PARAM_DATUM (param, 0).dptr, key_data.dsize);
@@ -500,7 +499,7 @@ nextkey_handler (struct command_param *param, struct command_environ *cenv)
return_data = gdbm_nextkey (gdbm_file, key_data);
if (return_data.dptr != NULL)
{
- free (key_data.dptr);
+ datum_free (&key_data);
key_data = return_data;
datum_format (cenv->fp, &key_data, dsdef[DS_KEY]);
fputc ('\n', cenv->fp);
@@ -509,13 +508,12 @@ nextkey_handler (struct command_param *param, struct command_environ *cenv)
datum_format (cenv->fp, &return_data, dsdef[DS_CONTENT]);
fputc ('\n', cenv->fp);
- free (return_data.dptr);
+ datum_free (&return_data);
}
else if (gdbm_errno == GDBM_ITEM_NOT_FOUND)
{
terror ("%s", _("No such item found."));
- free (key_data.dptr);
- key_data.dptr = NULL;
+ datum_free (&key_data);
}
else
terror (_("Can't find key: %s"), gdbm_strerror (gdbm_errno));
@@ -2376,6 +2374,9 @@ gdbmshell_run (int (*init) (void *, instream_t *), void *data)
variable_set ("open", VART_STRING, "wrcreat");
variable_set ("pager", VART_STRING, getenv ("PAGER"));
+ last_cmd = NULL;
+ gdbmarglist_init (&last_args, NULL);
+
lex_trace (0);
rc = init (data, &instream);
@@ -2404,6 +2405,8 @@ gdbmshell_run (int (*init) (void *, instream_t *), void *data)
instream_close (instream);
}
+ gdbmarglist_free (&last_args);
+
for (i = 0; i < DS_MAX; i++)
{
dsegm_list_free (dsdef[i]);
diff --git a/src/util.c b/src/util.c
index aa56dc4..509524a 100644
--- a/src/util.c
+++ b/src/util.c
@@ -72,7 +72,8 @@ vgetyn (const char *prompt, va_list ap)
{
int state = 0;
int c, resp;
-
+ va_list aq;
+
do
{
switch (state)
@@ -104,7 +105,9 @@ vgetyn (const char *prompt, va_list ap)
break;
case 0:
- vfprintf (stdout, prompt, ap);
+ va_copy (aq, ap);
+ vfprintf (stdout, prompt, aq);
+ va_end (aq);
fprintf (stdout, " [y/n]?");
fflush (stdout);
state = 1;

Return to:

Send suggestions and report system problems to the System administrator.