aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gdbmdefs.h10
-rw-r--r--src/gdbmopen.c26
-rw-r--r--src/mmap.c6
3 files changed, 23 insertions, 19 deletions
diff --git a/src/gdbmdefs.h b/src/gdbmdefs.h
index 28995de..b5922e3 100644
--- a/src/gdbmdefs.h
+++ b/src/gdbmdefs.h
@@ -204,5 +204,15 @@ struct gdbm_file_info {
begins */
};
+/* Execute CODE without clobbering errno */
+#define SAVE_ERRNO(code) \
+ do \
+ { \
+ int __ec = errno; \
+ code; \
+ errno = __ec; \
+ } \
+ while (0) \
+
/* Now define all the routines in use. */
#include "proto.h"
diff --git a/src/gdbmopen.c b/src/gdbmopen.c
index 2029499..a8a488f 100644
--- a/src/gdbmopen.c
+++ b/src/gdbmopen.c
@@ -145,8 +145,8 @@ gdbm_open (const char *file, int block_size, int flags, int mode,
}
if (dbf->desc < 0)
{
- free (dbf->name);
- free (dbf);
+ SAVE_ERRNO (free (dbf->name);
+ free (dbf));
gdbm_errno = GDBM_FILE_OPEN_ERROR;
return NULL;
}
@@ -154,12 +154,10 @@ gdbm_open (const char *file, int block_size, int flags, int mode,
/* Get the status of the file. */
if (fstat (dbf->desc, &file_stat))
{
- int ec = errno;
- close (dbf->desc);
- free (dbf->name);
- free (dbf);
+ SAVE_ERRNO (close (dbf->desc);
+ free (dbf->name);
+ free (dbf));
gdbm_errno = GDBM_FILE_STAT_ERROR;
- errno = ec;
return NULL;
}
@@ -286,7 +284,7 @@ gdbm_open (const char *file, int block_size, int flags, int mode,
num_bytes = __write (dbf, dbf->header, dbf->header->block_size);
if (num_bytes != dbf->header->block_size)
{
- gdbm_close (dbf);
+ SAVE_ERRNO (gdbm_close (dbf));
gdbm_errno = GDBM_FILE_WRITE_ERROR;
return NULL;
}
@@ -295,7 +293,7 @@ gdbm_open (const char *file, int block_size, int flags, int mode,
num_bytes = __write (dbf, dbf->dir, dbf->header->dir_size);
if (num_bytes != dbf->header->dir_size)
{
- gdbm_close (dbf);
+ SAVE_ERRNO (gdbm_close (dbf));
gdbm_errno = GDBM_FILE_WRITE_ERROR;
return NULL;
}
@@ -304,7 +302,7 @@ gdbm_open (const char *file, int block_size, int flags, int mode,
num_bytes = __write (dbf, dbf->bucket, dbf->header->bucket_size);
if (num_bytes != dbf->header->bucket_size)
{
- gdbm_close (dbf);
+ SAVE_ERRNO (gdbm_close (dbf));
gdbm_errno = GDBM_FILE_WRITE_ERROR;
return NULL;
}
@@ -325,7 +323,7 @@ gdbm_open (const char *file, int block_size, int flags, int mode,
num_bytes = __read (dbf, &partial_header, sizeof (gdbm_file_header));
if (num_bytes != sizeof (gdbm_file_header))
{
- gdbm_close (dbf);
+ SAVE_ERRNO (gdbm_close (dbf));
gdbm_errno = GDBM_FILE_READ_ERROR;
return NULL;
}
@@ -365,7 +363,7 @@ gdbm_open (const char *file, int block_size, int flags, int mode,
dbf->header->block_size-sizeof (gdbm_file_header));
if (num_bytes != dbf->header->block_size-sizeof (gdbm_file_header))
{
- gdbm_close (dbf);
+ SAVE_ERRNO (gdbm_close (dbf));
gdbm_errno = GDBM_FILE_READ_ERROR;
return NULL;
}
@@ -383,7 +381,7 @@ gdbm_open (const char *file, int block_size, int flags, int mode,
file_pos = __lseek (dbf, dbf->header->dir, L_SET);
if (file_pos != dbf->header->dir)
{
- gdbm_close (dbf);
+ SAVE_ERRNO (gdbm_close (dbf));
gdbm_errno = GDBM_FILE_SEEK_ERROR;
return NULL;
}
@@ -391,7 +389,7 @@ gdbm_open (const char *file, int block_size, int flags, int mode,
num_bytes = __read (dbf, dbf->dir, dbf->header->dir_size);
if (num_bytes != dbf->header->dir_size)
{
- gdbm_close (dbf);
+ SAVE_ERRNO (gdbm_close (dbf));
gdbm_errno = GDBM_FILE_READ_ERROR;
return NULL;
}
diff --git a/src/mmap.c b/src/mmap.c
index 44101e9..8735624 100644
--- a/src/mmap.c
+++ b/src/mmap.c
@@ -134,10 +134,8 @@ _gdbm_mapped_remap (GDBM_FILE dbf, off_t size, int flag)
if (_gdbm_file_size (dbf, &file_size))
{
- int ec = errno;
+ SAVE_ERRNO (_gdbm_mapped_unmap (dbf));
gdbm_errno = GDBM_FILE_STAT_ERROR;
- _gdbm_mapped_unmap (dbf);
- errno = ec;
return -1;
}
@@ -332,9 +330,7 @@ _gdbm_mapped_lseek (GDBM_FILE dbf, off_t offset, int whence)
off_t file_size;
if (_gdbm_file_size (dbf, &file_size))
{
- int ec = errno;
gdbm_errno = GDBM_FILE_STAT_ERROR;
- errno = ec;
return -1;
}
needle = file_size - offset;

Return to:

Send suggestions and report system problems to the System administrator.