diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-05-24 11:35:24 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-05-24 11:35:24 +0300 |
commit | 371bb85fe378ffd0ed6ddc81985d450cef5835a3 (patch) | |
tree | 6ab2d142b7aa1f9b29ec50b891c8293774964209 /src/mmap.c | |
parent | f82d0b213fd2cdce80dc891906fba8d589115664 (diff) | |
download | gdbm-371bb85fe378ffd0ed6ddc81985d450cef5835a3.tar.gz gdbm-371bb85fe378ffd0ed6ddc81985d450cef5835a3.tar.bz2 |
More error checking; improve gdbm_recover
* Makefile.am (set-dist-date): New rule
(dist-hook): Catch FIXMEs in NEWS.
* NEWS: Updated.
* src/findkey.c (gdbm_bucket_element_valid_p): New function.
(_gdbm_read_entry): Validate the retrieved bucket element.
* src/gdbm.h.in (gdbm_recovery): New member: duplicate_keys.
(GDBM_BAD_HASH_TABLE): New error code.
* src/gdbmdefs.h (TYPE_WIDTH,SIGNED_TYPE_MAXIMUM)
(OFF_T_MAX): New defines.
(off_t_sum_ok): New function.
(gdbm_bucket_element_valid_p): New prototype.
* src/gdbmerrno.c: Support for GDBM_BAD_HASH_TABLE code.
* src/gdbmtool.c (recover_handler): Fix argument counting.
New argument 'summary' prints statistics summary at the end
of the run.
(export_handler,import_handler): Fix argument counting.
* src/mmap.c (SUM_FILE_SIZE): Rewrite as inlined function.
Add error checking.
(_gdbm_mapped_remap): More error checking.
* src/recover.c (run_recovery): Don't bail out on GDBM_CANNOT_REPLACE.
(gdbm_recover): Initialize duplicate_keys
* src/systems.h: Include limits.h
Diffstat (limited to 'src/mmap.c')
-rw-r--r-- | src/mmap.c | 22 |
1 files changed, 20 insertions, 2 deletions
@@ -41,14 +41,21 @@ | |||
41 | ((off) >= (dbf)->mapped_off \ | 41 | ((off) >= (dbf)->mapped_off \ |
42 | && ((off) - (dbf)->mapped_off) < (dbf)->mapped_size) | 42 | && ((off) - (dbf)->mapped_off) < (dbf)->mapped_size) |
43 | /* Return true if the current region needs to be remapped */ | 43 | /* Return true if the current region needs to be remapped */ |
44 | # define _GDBM_NEED_REMAP(dbf) \ | 44 | # define _GDBM_NEED_REMAP(dbf) \ |
45 | (!(dbf)->mapped_region || (dbf)->mapped_pos == (dbf)->mapped_size) | 45 | (!(dbf)->mapped_region || (dbf)->mapped_pos == (dbf)->mapped_size) |
46 | /* Return the sum of the currently mapped size and DELTA */ | 46 | /* Return the sum of the currently mapped size and DELTA */ |
47 | # define SUM_FILE_SIZE(dbf, delta) \ | 47 | static inline off_t |
48 | ((dbf)->mapped_off + (dbf)->mapped_size + (delta)) | 48 | SUM_FILE_SIZE (GDBM_FILE dbf, off_t delta) |
49 | { | ||
50 | if (delta >= 0 | ||
51 | && off_t_sum_ok (dbf->mapped_off, dbf->mapped_size) | ||
52 | && off_t_sum_ok (dbf->mapped_off + dbf->mapped_size, delta)) | ||
53 | return dbf->mapped_off + dbf->mapped_size + delta; | ||
54 | return -1; | ||
55 | } | ||
49 | 56 | ||
50 | /* Store the size of the GDBM file DBF in *PSIZE. | 57 | /* Store the size of the GDBM file DBF in *PSIZE. |
51 | Return 0 on success and -1 on failure. */ | 58 | Return 0 on success and -1 on failure. */ |
52 | int | 59 | int |
53 | _gdbm_file_size (GDBM_FILE dbf, off_t *psize) | 60 | _gdbm_file_size (GDBM_FILE dbf, off_t *psize) |
54 | { | 61 | { |
@@ -179,12 +186,23 @@ _gdbm_file_extend (GDBM_FILE dbf, off_t size) | |||
179 | The function returns 0 on success, -1 on failure. */ | 186 | The function returns 0 on success, -1 on failure. */ |
180 | int | 187 | int |
181 | _gdbm_mapped_remap (GDBM_FILE dbf, off_t size, int flag) | 188 | _gdbm_mapped_remap (GDBM_FILE dbf, off_t size, int flag) |
182 | { | 189 | { |
183 | off_t file_size, pos; | 190 | off_t file_size, pos; |
184 | 191 | ||
192 | if (size < 0) | ||
193 | { | ||
194 | errno = EINVAL; | ||
195 | GDBM_SET_ERRNO (dbf, GDBM_FILE_SEEK_ERROR, TRUE); | ||
196 | return -1; | ||
197 | } | ||
198 | |||
199 | if (size < dbf->mapped_size) | ||
200 | /* Nothing to do */ | ||
201 | return 0; | ||
202 | |||
185 | if (_gdbm_file_size (dbf, &file_size)) | 203 | if (_gdbm_file_size (dbf, &file_size)) |
186 | { | 204 | { |
187 | SAVE_ERRNO (_gdbm_mapped_unmap (dbf)); | 205 | SAVE_ERRNO (_gdbm_mapped_unmap (dbf)); |
188 | return -1; | 206 | return -1; |
189 | } | 207 | } |
190 | 208 | ||