aboutsummaryrefslogtreecommitdiff
path: root/src/mmap.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2018-05-19 17:19:20 +0300
committerSergey Poznyakoff <gray@gnu.org>2018-05-19 17:28:35 +0300
commit2ed5403c82833c8977171972b6779ec92bcc086f (patch)
treed7c4b170b8ecc08e32e46653e07f45643c929669 /src/mmap.c
parentd228fddf791187b44839b8d8c40478f3577812a2 (diff)
downloadgdbm-2ed5403c82833c8977171972b6779ec92bcc086f.tar.gz
gdbm-2ed5403c82833c8977171972b6779ec92bcc086f.tar.bz2
Improve error checking
* src/bucket.c (_gdbm_get_bucket): Improve validation. * src/fullio.c (_gdbm_full_read,_gdbm_full_write): Don't overwrite an already set error. * src/gdbm.h.in (GDBM_WRONG_OFF_T): Merge with GDBM_BAD_FILE_OFFSET. (GDBM_BAD_HEADER): New error code. * src/gdbmdump.c (_gdbm_dump_ascii): Check for database error code. * src/gdbmerrno.c (gdbm_errlist): Add GDBM_BAD_HEADER * src/gdbmopen.c (validate_header: Imporve logic. (_gdbm_init_cache): Initialize bucket_cache * src/gdbmseq.c (gdbm_firstkey): Check return value from _gdbm_get_bucket. * src/mmap.c (_gdbm_mapped_remap): Bail out if current position is bigger than file size.
Diffstat (limited to 'src/mmap.c')
-rw-r--r--src/mmap.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/mmap.c b/src/mmap.c
index fd8a72b..9a7d400 100644
--- a/src/mmap.c
+++ b/src/mmap.c
@@ -233,7 +233,12 @@ _gdbm_mapped_remap (GDBM_FILE dbf, off_t size, int flag)
dbf->mapped_pos += dbf->mapped_off;
dbf->mapped_off = 0;
}
-
+ if (pos > file_size)
+ {
+ errno = EINVAL;
+ GDBM_SET_ERRNO (dbf, GDBM_FILE_SEEK_ERROR, TRUE);
+ return -1;
+ }
return _gdbm_internal_remap (dbf, size);
}
@@ -271,6 +276,10 @@ _gdbm_mapped_read (GDBM_FILE dbf, void *buffer, size_t len)
{
int rc;
+ if (dbf->need_recovery)
+ return -1;
+
+ /* Disable memory mapping and retry */
dbf->memory_mapping = FALSE;
if (lseek (dbf->desc, pos, SEEK_SET) != pos)
return total > 0 ? total : -1;
@@ -321,6 +330,9 @@ _gdbm_mapped_write (GDBM_FILE dbf, void *buffer, size_t len)
{
int rc;
+ if (dbf->need_recovery)
+ return -1;
+
dbf->memory_mapping = FALSE;
if (lseek (dbf->desc, pos, SEEK_SET) != pos)
return total > 0 ? total : -1;

Return to:

Send suggestions and report system problems to the System administrator.