aboutsummaryrefslogtreecommitdiff
path: root/src
AgeCommit message (Collapse)AuthorFiles
2024-03-18BugfixSergey Poznyakoff1
* src/gdbmload.c (get_dump_line): Fix possible buffer underflow. Return error code. Return number of bytes read in the memory location passed by the second argument. All uses changed
2023-01-22Update copyright yearsSergey Poznyakoff38
2022-06-09Fix binary dump format for key and/or data of zero size.Sergey Poznyakoff2
Fixes https://puszcza.gnu.org.ua/bugs/?565 * src/gdbmexp.c (gdbm_export_to_file): Check for positive size before attempting to write. * src/gdbmimp.c (gdbm_import_from_file): Check for positive size before attempting to read.
2022-02-21Make sure attempts to lock the file never blockSergey Poznyakoff2
* src/gdbmdefs.h: Minor change. * src/lock.c: Clean up the code. Use F_TLOCK for lockf(), to avoid blocking.
2022-01-25Fix possible heap buffer overflowSergey Poznyakoff1
* src/bucket.c (_gdbm_split_bucket): When splitting the bucket, check if hash values are within allowed range.
2022-01-08BugfixesSergey Poznyakoff2
* src/bucket.c (_gdbm_cache_init): Accept sizes greater than the directory size. * src/gdbmsetopt.c (setopt_gdbm_getdbformat): Return 0 on success.
2022-01-07Minor fixSergey Poznyakoff1
* src/bucket.c (lru_unlink_elem): Take into account the possibility that dbf->cache_mru can be NULL.
2022-01-06Speed up flushing the bucket cache on diskSergey Poznyakoff11
The implementation of _gdbm_cache_flush becomes prohibitively inefficient during extensive updates of large databases. The bug was reported at https://github.com/Perl/perl5/issues/19306. To fix it, make sure that all changed cache entries are placed at the head of the cache_mru list, forming a contiguous sequence. This way a potentially long iteration over all cache entries can be cut off at the first entry with ca_changed == FALSE. This commit also gets rid of several superfluous fields in struct gdbm_file_info: - cache_entry Not needed, because the most recently used cache entry (cache_mru) is always the current one. - bucket_changed dbf->cache_mru->ca_changed reflects the status of the current bucket. - second_changed Not needed because _gdbm_cache_flush, which flushes all changed buckets, is now invoked unconditionally by _gdbm_end_update (and also whenever dbf->cache_mru changes). * src/gdbmdefs.h (struct gdbm_file_info): Remove cache_entry. The current cache entry is cache_mru. Remove bucket_changed, and second_changed. All uses changed. * src/proto.h (_gdbm_current_bucket_changed): New inline function. * src/bucket.c (_gdbm_cache_flush): Assume all changed elements form a contiguous sequence beginning with dbf->cache_mru. (set_cache_entry): Remove. All callers changed. (lru_link_elem,lru_unlink_elem): Update dbf->bucket as necessary. (cache_lookup): If the obtained bucket is not changed and is going to become current, flush all changed cache elements. * src/update.c (_gdbm_end_update): Call _gdbm_cache_flush unconditionally. * src/findkey.c: Use dbf->cache_mru instead of the removed dbf->cache_entry. * src/gdbmseq.c: Likewise. * tools/gdbmshell.c (_gdbm_print_bucket_cache): Likewise. * src/falloc.c: Use _gdbm_current_bucket_changed to mark the current bucket as changed. * src/gdbmstore.c: Likewise. * src/gdbmdelete.c: Likewise. Use _gdbm_current_bucket_changed. * tests/gtcacheopt.c: Fix typo. * tests/gtload.c: New option: -cachesize
2022-01-02Update copyright yearsSergey Poznyakoff38
2021-11-20Rearrange the directory structureSergey Poznyakoff24
Sources for the libgdbm library reside in src/. Sources for building accompanying tools are moved to the tools/ subdirectory.
2021-11-18Fix typosSergey Poznyakoff11
2021-11-18Fix shell command in gdbmtoolSergey Poznyakoff2
Trailing whitespace was erroneously recognized as argument. * src/lex.l (string_end): Optionally return NULL if the collected string is of zero length. When leaving the SHELL condition, don't return T_WORD for trailing whitespace. * src/gdbmshell.c (shell_handler): Perror after failed execv.
2021-11-18Fix gdbmtool import commandSergey Poznyakoff1
* src/gdbmshell.c (import_handler): Fix option addressing (see https://puszcza.gnu.org.ua/bugs/?535). Fix freeing of the uninitialized variable.
2021-11-18Word wrapping output functions for gdbm appsSergey Poznyakoff5
* src/Makefile.am (libgdbmapp_a_SOURCES): Add wordwrap.c * src/wordwrap.c: New file. * tests/Makefile.am: Add t_wordwrap and wordspit.at * tests/testsuite.at: Add new test. * tests/t_wordwrap.c: New file. * src/gdbmshell.c (help_handler): Use wordwrap functions. * src/parseopt.c: Rewrite help output using wordwrap. Add support for the ARGP_HELP_FMT environment variable. Make sure no empty strings are ever passed to gettext.
2021-11-16Minor fixSergey Poznyakoff1
2021-11-16Fix memory leaks in gdbmshellSergey Poznyakoff7
* configure.ac: Don't use $YACC and $LEX (undefined since f4c143fbdf). * src/gdbmshell.c (run_command): Free arglist if not saved to last_args. * src/gdbmtool.c (gdbmtool_init): Correctly report unrecognized long options. * src/gdbmtool.h (YY_LOCATION_PRINT): Define to locus_print. (locus_print): New proto. * src/gram.y: Define destructors for various symbols. * src/lex.l: Save source file names in a linked list. Don't free source name in input_context_pop, because yypush might refer to it via yyloc stack even after readinf eof (e.g. when printing location). The collected list is freed at program exit. (locus_print): New function. * src/parseopt.c (parseopt_free): New function. (parseopt_first): Call parseopt_free. (parseopt_next): Call parseopt_free, depending on the result. * src/var.c (variable) <freehook>: New member. (errormask_freehook): New function. Set it as freehook for errorexit and errormask. (variables_free): Call freehook, if defined.
2021-11-16gdbmtool: bugfixesSergey Poznyakoff1
2021-11-15gdbmshell: fix exit on error and improve directory/bucket inspection.Sergey Poznyakoff1
Output from the "dir" command includes, for each directory entry, the corresponding hash prefix. The "bucket" command, when used without arguments, assumes current bucket. Its output includes: bucket local depth, number of directory entries pointing to that bucket (references), and, if the latter is greater than one, indexes to the first and last directory entries where it is referenced. New command "sibling" inspects the sibling bucket of the current one, i.e. the bucket corresponding to the hash prefix with the last bit inverted.
2021-11-14Switch to hash table cache implementationSergey Poznyakoff9
* src/cachetree.c: Remove. * src/Makefile.am: Remove cachetree.c * doc/gdbm.texi: Document the changes. * src/bucket.c (cache_tab_lookup_slot) (cache_tab_resize): New function. (cache_elem_new): Initialize ca_coll. (cache_elem_free, cache_lookup) (_gdbm_cache_init,_gdbm_cache_free): Rewrite with hash-based cache lookup. (_gdbm_fetch_data): Remove unused function. * src/gdbm.h.in (GDBM_GETDBFORMAT, GDBM_GETDIRDEPTH) (GDBM_GETBUCKETSIZE, GDBM_GETCACHEAUTO, GDBM_SETCACHEAUTO): New option codes. * src/gdbmdefs.h (cache_node): Remove. (cache_elem): Remove ca_node. Add ca_coll (collision resolution pointer). (gdbm_file_info): New members: cache_auto, cache_bits, cache. * src/gdbmopen.c (gdbm_fd_open): Change cache initialization. * src/gdbmsetopt.c (GDBM_GETDBFORMAT,GDBM_GETDIRDEPTH) (GDBM_GETBUCKETSIZE,GDBM_GETCACHEAUTO) (GDBM_SETCACHEAUTO): Implement new options. (setopt_gdbm_getflags): Reflect the state of GDBM_CLOEXEC and GDBM_NUMSYNC. * src/proto.h (_gdbm_fetch_data,_gdbm_cache_tree_alloc) (_gdbm_cache_tree_destroy,_gdbm_cache_tree_delete) (_gdbm_cache_tree_lookup): Remove protos. * src/recover.c (_gdbm_finish_transfer): Restore original cache settings. * tests/Makefile.am: Add new test. * tests/testsuite.at: Likewise. * tests/gtcacheopt.c: New file. * tests/setopt02.at: New test case.
2021-10-18gdbm_recover does not disable crash toleranceSergey Poznyakoff1
* src/recover.c (_gdbm_finish_transfer): Remove call to _gdbmsync_done. * doc/gdbm.texi: Reflect the changes.
2021-10-17Change build process: explicitly require bison and flexSergey Poznyakoff3
2021-09-19Fix key verification in sequential access.Sergey Poznyakoff3
This fixes https://oss-fuzz.com/testcase-detail/6317999997452288 and improves 4046a0af. * src/bucket.c (gdbm_dir_entry_valid_p): Move to proto. * src/proto.h (gdbm_dir_entry_valid_p): New inline function. * src/gdbmseq.c (gdbm_valid_key_p): Use gdbm_dir_entry_valid_p to validate the buffer index. Reorder the checks.
2021-09-16Fix computation of dbf->avail->count after pushing new avail block.Sergey Poznyakoff1
This is a very long-standing bug that caused a loss of an avail entry if the original avail table had odd number of entries. * src/falloc.c (push_avail_block): Fix computation of dbf->avail->count.
2021-09-16Fix typoSergey Poznyakoff1
2021-09-09Add missing includeSergey Poznyakoff1
* src/gdbmtool.h: Include string.h
2021-09-09Fix stack overflow in print_usageSergey Poznyakoff1
* src/parseopt.c (print_usage): Fix length calculation for long options.
2021-09-07Determine if st_mtim is present in struct statSergey Poznyakoff3
* configure.ac: Check for st_mtim and st_mtimespec in struct stat. The former is POSIX, the latter is used instead of it on some systems (reportedly, Darwin and NetBSD). * src/systems.h [!HAVE_STRUCT_STAT_ST_MTIM]: Use st_mtimespec if available. * src/gdbmshell.c (print_snapshot): Fall back to st_mtime if nanosecond precision is not available. * src/gdbmsync.c (timespec_cmp): Take two pointers to struct stat as arguments. Use the right time field, depending on the configuration settings. All uses changed.
2021-09-05Fix file header validationSergey Poznyakoff1
* src/gdbmopen.c (validate_header_std) (validate_header_numsync): Check if bucket_size is > 0.
2021-09-03Change semantics of the errorexit variable.Sergey Poznyakoff4
The "errorexit" variable is a string variable with the same syntax as errormask. If a GDBM error is reported and the corresponding gdbm_errno value is listed in this variable, further script execution is aborted. Setting it as boolean value is equivalent to set errorexit="all". * src/gdbmshell.c (all handlers): Return a GDBMSHELL_* error code. (closedb): Unset the fd variable only after closing the database. (run_command): If handler reported GDBM error and gdbm_errno is listed in the errorexit variable, return 1 (which will cause YYABORT in parser). * src/gdbmtool.h (VAR_ERR_GDBM): New variable error code. (variable_has_errno): New function. (gdbm_error_is_masked): Rewrite using variable_has_errno. * src/gram.y: Abort if run_command or run_last_command return !0. Handle VAR_ERR_GDBM. * src/var.c (variable): New member: data. (errorexit variable): Change type to VART_STRING; install sethook and typeconv. (variable_unset): When unsetting string variable, free and reset its value. (cachesize_sethook,centfree_sethook) (coalesce_sethook): Return VAR_ERR_GDBM on gdbmshell_setopt error. (errormask_sethook): Keep the mask vector in the data member. Handle conversions from boolean. (errorexit_sethook): Call errormask_sethook unless in interactive session.
2021-09-03Minor changeSergey Poznyakoff1
* src/gdbmshell.c (command_type): Change initializer. (gdbmshell_run): Initialize the .len member.
2021-09-03gdbmtool: new command "perror"; new options -t, -T; improve timing outputSergey Poznyakoff2
* doc/gdbm.texi: Document the perror command. * src/gdbmshell.c: New command: perror. (run_command): In timing mode, print also user and system CPU times. Print traces on stderr. * src/gdbmtool.c: New options: -t (--trace) and -T (--timing).
2021-09-03gdbmtool: optionally print command trace (controlled by the "trace" variable)Sergey Poznyakoff2
* src/gdbmshell.c (run_command): Print command trace if requested. Prefix timing info with the name of the command. * src/var.c: New variable: trace.
2021-09-03gdbmtool: optionally print real execution time at the end of each commandSergey Poznyakoff2
* src/gdbmshell.c (run_command): Print real execution time, if the "timing" variable is set. * src/var.c: New boolean variable: timing
2021-09-03run_command: use error code from beginSergey Poznyakoff1
2021-09-03Allow for [+-]all in the errormask valueSergey Poznyakoff1
2021-09-03New gdbmtool variables: errorexit and errormask.Sergey Poznyakoff5
Boolean errorexit controls whether script terminates upon first erroneous return from run_command or its derivatives. The variable can be set only in non-interactive mode. errormask is a comma-delimited list of GDBM error codes that are masked, i.e. that won't trigger a diagnostic message if they occur. * src/gdbmshell.c (all handlers): Return integer value indicating success (0) or failure (!0). * src/gdbmtool.h (input_context_drain): New function. (run_last_command): Return integer. * src/gram.y: abort if run_command returns error and "errorexit" is set. * src/input-argv.c (instream_argv_read): Bugfix. * src/lex.l (input_context_drain): New function. * src/var.c: New variables: errorexit and errormask.
2021-08-18Minor fixSergey Poznyakoff1
* src/input-argv.c ((instream_argv_read): Fix escaping of special characters.
2021-08-13Revise gdbmtool error messagesSergey Poznyakoff3
* src/gdbmshell.c: Revise error messages. Use dberror where appropriate. * src/gdbmtool.h (dberror): New proto. * src/gram.y (dberror): New function.
2021-08-13gdbmtool: always provide stdin streamSergey Poznyakoff6
* src/Makefile.am (libgdbmapp_a_SOURCES): Add input-std.c * src/gdbmshell.c (input_history_begin): Improve diagnostic message. * src/gdbmtool.c (instream_default_create): New define. (gdbmtool_init): Use instream_default_create. * src/gdbmtool.h [WITH_READLINE] (instream_readline_create_: New proto. (input_stream_name): New proto. * src/input-rl.c (instream_stdin_create): Rename to instream_readline_create. Fall back to instream_stdin_create if stdin is not connected to a tty. * src/lex.l (input_stream_name): New function.
2021-08-13Re-implement input history handling to minimize linking requirementsSergey Poznyakoff9
Applications using gbdmshell don't need to link with libreadline, unless they use instream_stdin_create with readline support. * src/gdbmshell.c (input_history_begin) (input_history_handler): New functions. (gdbmshell_run): Remove calls to input_init()/input_done(). * src/gdbmtool.h (instream): New fields: in_history_size, in_history_get. (input_init,input_done): Remove. (instream_history_size,instream_history_get): New functions. (input_history_handler,input_history_begin): Remove. * src/input-rl.c: Incorporate history handling into the stream itself. * src/input-std.c (input_init,input_done): Remove placeholders. * src/lex.l (input_history_size,input_history_get): New functions.
2021-08-12Fix NULL dereference in gdbmshell. Undefine "fd" upon closing the database.Sergey Poznyakoff2
2021-08-12gdbmtool: setting database option affects the current databaseSergey Poznyakoff3
* src/gdbmshell.c (gdbmshell_setopt): New function. * src/gdbmtool.h (gdbmshell_setopt): New proto. * src/var.c: Provide set hooks for: cachesize, coalesce, and centfree.
2021-08-12gdbmshell: get rid of remaining globalsSergey Poznyakoff5
Use gdbmshell variables instead * src/gdbmshell.c (file_name, file_descr) (open_mode, open_format): Remove globals. (opendb,checkdb) (open_handler,import_handler) (status_handler): Use variables instead of globals. (command_tab): Mark the "open" parameter as optional. * src/gdbmtool.c (gdbmtool_init): Use variables instead of globals. * src/gdbmtool.h (file_name, file_descr) (open_mode, open_format): Remove globals. * src/lex.l: Use variables instead of globals. * src/var.c (variable): Rename hook to sethook. New field: typeconv. (vartab): New variables: "filename", "fd". (variable_get): Use typeconv if provided. * tests/gdbmtool/base.exp: Fix expected output. * tests/gdbmtool00.at: Likewise. * tests/gdbmtool01.at: Likewise.
2021-08-12gdbmtool: bugfixesSergey Poznyakoff2
* 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
2021-08-11Fix duplicated mmap in gdbm_recoverSergey Poznyakoff1
* src/recover.c (_gdbm_finish_transfer): Reuse memory mapping from the intermediate dbm structure.
2021-08-11Minor fixSergey Poznyakoff1
* src/gdbmshell.c (opendb): Force GDBM_CLOERROR when calling gdbm_fd_open.
2021-08-11Minor change in argv streamSergey Poznyakoff1
* src/input-argv.c (instream_argv_read): Don't treat = specially.
2021-08-11Fix memory leaks in gdbm_fd_openSergey Poznyakoff1
* src/gdbmopen.c (gdbm_fd_open): Close the database before returning on error.
2021-08-10Move gdbmtool shell functions to the library.Sergey Poznyakoff6
* src/Makefile.am (libgdbmapp_a_SOURCES): Move gdbm shell support to the library. * src/gdbmtool.c: Move shell support to another file. * src/gdbmtool.h (file_descr): New extern. (gdbmshell, gdbmshell_run) (variables_init, variables_free): New functions. * src/gdbmtool.supp: New file. * src/var.c (VAR_IS_SET): Change definition. (variable): New member: init. (variable_set): Change meaning of VARF_INIT. (variables_free,variables_init): New protos. * src/gdbmtool.c: New file.
2021-08-10gdbmtool: separate command parameters and environmentSergey Poznyakoff3

Return to:

Send suggestions and report system problems to the System administrator.