summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kbx/keybox-defs.h3
-rw-r--r--kbx/keybox-dump.c6
-rw-r--r--kbx/keybox-file.c31
-rw-r--r--kbx/keybox-search.c45
-rw-r--r--kbx/keybox-update.c6
5 files changed, 54 insertions, 37 deletions
diff --git a/kbx/keybox-defs.h b/kbx/keybox-defs.h
index b8b83771a..154d4fca6 100644
--- a/kbx/keybox-defs.h
+++ b/kbx/keybox-defs.h
@@ -177,8 +177,7 @@ void _keybox_destroy_openpgp_info (keybox_openpgp_info_t info);
/*-- keybox-file.c --*/
-int _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp);
-int _keybox_read_blob2 (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted);
+int _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted);
int _keybox_write_blob (KEYBOXBLOB blob, FILE *fp);
/*-- keybox-search.c --*/
diff --git a/kbx/keybox-dump.c b/kbx/keybox-dump.c
index d24f117ab..aa1d93be7 100644
--- a/kbx/keybox-dump.c
+++ b/kbx/keybox-dump.c
@@ -581,7 +581,7 @@ _keybox_dump_file (const char *filename, int stats_only, FILE *outfp)
for (;;)
{
- rc = _keybox_read_blob (&blob, fp);
+ rc = _keybox_read_blob (&blob, fp, NULL);
if (gpg_err_code (rc) == GPG_ERR_TOO_LARGE
&& gpg_err_source (rc) == GPG_ERR_SOURCE_KEYBOX)
{
@@ -704,7 +704,7 @@ _keybox_dump_find_dups (const char *filename, int print_them, FILE *outfp)
}
dupitems_count = 0;
- while ( !(rc = _keybox_read_blob (&blob, fp)) )
+ while ( !(rc = _keybox_read_blob (&blob, fp, NULL)) )
{
unsigned char digest[20];
@@ -778,7 +778,7 @@ _keybox_dump_cut_records (const char *filename, unsigned long from,
if (!(fp = open_file (&filename, stderr)))
return gpg_error_from_syserror ();
- while ( !(rc = _keybox_read_blob (&blob, fp)) )
+ while ( !(rc = _keybox_read_blob (&blob, fp, NULL)) )
{
if (recno > to)
break; /* Ready. */
diff --git a/kbx/keybox-file.c b/kbx/keybox-file.c
index 0485e81b4..046e32123 100644
--- a/kbx/keybox-file.c
+++ b/kbx/keybox-file.c
@@ -45,10 +45,10 @@ ftello (FILE *stream)
-/* Read a block at the current position and return it in r_blob.
- r_blob may be NULL to simply skip the current block. */
+/* Read a block at the current position and return it in R_BLOB.
+ R_BLOB may be NULL to simply skip the current block. */
int
-_keybox_read_blob2 (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
+_keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
{
unsigned char *image;
size_t imagelen = 0;
@@ -56,7 +56,8 @@ _keybox_read_blob2 (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
int rc;
off_t off;
- *skipped_deleted = 0;
+ if (skipped_deleted)
+ *skipped_deleted = 0;
again:
if (r_blob)
*r_blob = NULL;
@@ -86,7 +87,8 @@ _keybox_read_blob2 (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
/* Special treatment for empty blobs. */
if (fseek (fp, imagelen-5, SEEK_CUR))
return gpg_error_from_syserror ();
- *skipped_deleted = 1;
+ if (skipped_deleted)
+ *skipped_deleted = 1;
goto again;
}
@@ -99,6 +101,14 @@ _keybox_read_blob2 (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
return gpg_error (GPG_ERR_TOO_LARGE);
}
+ if (!r_blob)
+ {
+ /* This blob shall be skipped. */
+ if (fseek (fp, imagelen-5, SEEK_CUR))
+ return gpg_error_from_syserror ();
+ return 0;
+ }
+
image = xtrymalloc (imagelen);
if (!image)
return gpg_error_from_syserror ();
@@ -111,19 +121,12 @@ _keybox_read_blob2 (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
return tmperr;
}
- rc = r_blob? _keybox_new_blob (r_blob, image, imagelen, off) : 0;
- if (rc || !r_blob)
+ rc = _keybox_new_blob (r_blob, image, imagelen, off);
+ if (rc)
xfree (image);
return rc;
}
-int
-_keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp)
-{
- int dummy;
- return _keybox_read_blob2 (r_blob, fp, &dummy);
-}
-
/* Write the block to the current file position */
int
diff --git a/kbx/keybox-search.c b/kbx/keybox-search.c
index 0bd4e0182..a5fc7fa9d 100644
--- a/kbx/keybox-search.c
+++ b/kbx/keybox-search.c
@@ -725,6 +725,23 @@ release_sn_array (struct sn_array_s *array, size_t size)
xfree (array);
}
+
+/* Helper to open the file. */
+static gpg_error_t
+open_file (KEYBOX_HANDLE hd)
+{
+
+ hd->fp = fopen (hd->kb->fname, "rb");
+ if (!hd->fp)
+ {
+ hd->error = gpg_error_from_syserror ();
+ return hd->error;
+ }
+
+ return 0;
+}
+
+
/*
@@ -822,12 +839,11 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc,
if (!hd->fp)
{
- hd->fp = fopen (hd->kb->fname, "rb");
- if (!hd->fp)
+ rc = open_file (hd);
+ if (rc)
{
- hd->error = gpg_error_from_syserror ();
xfree (sn_array);
- return hd->error;
+ return rc;
}
}
@@ -899,7 +915,7 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc,
int blobtype;
_keybox_release_blob (blob); blob = NULL;
- rc = _keybox_read_blob (&blob, hd->fp);
+ rc = _keybox_read_blob (&blob, hd->fp, NULL);
if (gpg_err_code (rc) == GPG_ERR_TOO_LARGE
&& gpg_err_source (rc) == GPG_ERR_SOURCE_KEYBOX)
{
@@ -1192,24 +1208,23 @@ keybox_offset (KEYBOX_HANDLE hd)
gpg_error_t
keybox_seek (KEYBOX_HANDLE hd, off_t offset)
{
- int err;
+ gpg_error_t err;
if (hd->error)
return hd->error; /* still in error state */
if (! hd->fp)
{
- if (offset == 0)
- /* No need to open the file. An unopened file is effectively at
- offset 0. */
- return 0;
-
- hd->fp = fopen (hd->kb->fname, "rb");
- if (!hd->fp)
+ if (!offset)
{
- hd->error = gpg_error_from_syserror ();
- return hd->error;
+ /* No need to open the file. An unopened file is effectively at
+ offset 0. */
+ return 0;
}
+
+ err = open_file (hd);
+ if (err)
+ return err;
}
err = fseeko (hd->fp, offset, SEEK_SET);
diff --git a/kbx/keybox-update.c b/kbx/keybox-update.c
index 0b0f56bce..580330f52 100644
--- a/kbx/keybox-update.c
+++ b/kbx/keybox-update.c
@@ -288,7 +288,7 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
}
/* Skip this blob. */
- rc = _keybox_read_blob (NULL, fp);
+ rc = _keybox_read_blob (NULL, fp, NULL);
if (rc)
{
fclose (fp);
@@ -665,7 +665,7 @@ keybox_compress (KEYBOX_HANDLE hd)
/* A quick test to see if we need to compress the file at all. We
schedule a compress run after 3 hours. */
- if ( !_keybox_read_blob (&blob, fp) )
+ if ( !_keybox_read_blob (&blob, fp, NULL) )
{
const unsigned char *buffer;
size_t length;
@@ -703,7 +703,7 @@ keybox_compress (KEYBOX_HANDLE hd)
cut_time = time(NULL) - 86400;
first_blob = 1;
skipped_deleted = 0;
- for (rc=0; !(read_rc = _keybox_read_blob2 (&blob, fp, &skipped_deleted));
+ for (rc=0; !(read_rc = _keybox_read_blob (&blob, fp, &skipped_deleted));
_keybox_release_blob (blob), blob = NULL )
{
unsigned int blobflags;