diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2021-08-11 23:52:18 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2021-08-12 08:06:17 +0300 |
commit | d19407eaa4b00a724c4ff3744c2f49269183da26 (patch) | |
tree | 5dce577ffd0387f83ef76661850ee1d1d0ba0692 /src | |
parent | f77b0273db2d1f0cc1ba2d3256acfab1bda1f584 (diff) | |
download | gdbm-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.c | 37 | ||||
-rw-r--r-- | src/util.c | 7 |
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]); @@ -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; |