From a6c4d6413ae0af3b3ed0d697618699233c8607cc Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Fri, 5 May 2023 11:37:44 +0200 Subject: [PATCH] kbx: Use wrapper functions for es_fclose and es_fopen. * kbx/keybox-defs.h (KEYBOX_LL_OPEN_READ) (KEYBOX_LL_OPEN_UPDATE, KEYBOX_LL_OPEN_CREATE): New. * kbx/keybox-init.c (_keybox_ll_open): New. Replace all keybox use of es_fopen by this function. (_keybox_ll_close): New. Replace all keybox use of es_fclose by this function. -- Note that this has not been done for the utilities and the backend-kbx of keyboxd. --- kbx/keybox-defs.h | 8 +++ kbx/keybox-init.c | 45 +++++++++++++++- kbx/keybox-search.c | 30 +++-------- kbx/keybox-update.c | 125 ++++++++++++++++++++++---------------------- 4 files changed, 120 insertions(+), 88 deletions(-) diff --git a/kbx/keybox-defs.h b/kbx/keybox-defs.h index 51ba8cd0e..3768beb3d 100644 --- a/kbx/keybox-defs.h +++ b/kbx/keybox-defs.h @@ -136,6 +136,14 @@ typedef struct _keybox_openpgp_info *keybox_openpgp_info_t; /* } keybox_opt; */ /*-- keybox-init.c --*/ + +#define KEYBOX_LL_OPEN_READ 0 +#define KEYBOX_LL_OPEN_UPDATE 1 +#define KEYBOX_LL_OPEN_CREATE 2 +gpg_error_t _keybox_ll_open (estream_t *rfp, const char *fname, + unsigned int mode); +gpg_error_t _keybox_ll_close (estream_t fp); + void _keybox_close_file (KEYBOX_HANDLE hd); diff --git a/kbx/keybox-init.c b/kbx/keybox-init.c index 48af5c7a1..0e37e3d9e 100644 --- a/kbx/keybox-init.c +++ b/kbx/keybox-init.c @@ -180,7 +180,7 @@ keybox_release (KEYBOX_HANDLE hd) _keybox_release_blob (hd->saved_found.blob); if (hd->fp) { - es_fclose (hd->fp); + _keybox_ll_close (hd->fp); hd->fp = NULL; } xfree (hd->word_match.name); @@ -236,6 +236,47 @@ keybox_set_ephemeral (KEYBOX_HANDLE hd, int yes) } +/* Low-level open function to be used for keybox files. This function + * also manages custom buffering. On success 0 is returned and a new + * file pointer stored at RFP; on error an error code is returned and + * NULL is stored at RFP. MODE is one of + * KEYBOX_LL_OPEN_READ(0) := fopen mode is "rb" + * KEYBOX_LL_OPEN_UPDATE := fopen mode is "r+b" + * KEYBOX_LL_OPEN_CREATE := fopen mode is "wb" + */ +gpg_error_t +_keybox_ll_open (estream_t *rfp, const char *fname, unsigned int mode) +{ + estream_t fp; + + *rfp = NULL; + + fp = es_fopen (fname, + mode == KEYBOX_LL_OPEN_CREATE + ? "wb,sysopen,sequential" : + mode == KEYBOX_LL_OPEN_UPDATE + ? "r+b,sysopen,sequential" : + "rb,sysopen,sequential"); + if (!fp) + return gpg_error_from_syserror (); + + *rfp = fp; + return 0; +} + + +/* Wrapper around es_fclose to be used for file opened with + * _keybox_ll_open. */ +gpg_error_t +_keybox_ll_close (estream_t fp) +{ + if (fp && es_fclose (fp)) + return gpg_error_from_syserror (); + return 0; +} + + + /* Close the file of the resource identified by HD. For consistent results this function closes the files of all handles pointing to the resource identified by HD. */ @@ -253,7 +294,7 @@ _keybox_close_file (KEYBOX_HANDLE hd) { if (roverhd->fp) { - es_fclose (roverhd->fp); + _keybox_ll_close (roverhd->fp); roverhd->fp = NULL; } } diff --git a/kbx/keybox-search.c b/kbx/keybox-search.c index 7645fba4f..31ea0ba60 100644 --- a/kbx/keybox-search.c +++ b/kbx/keybox-search.c @@ -873,28 +873,12 @@ release_sn_array (struct sn_array_s *array, size_t size) } -/* Helper to open the file. */ -static gpg_error_t -open_file (KEYBOX_HANDLE hd) -{ - - hd->fp = es_fopen (hd->kb->fname, "rb,sysopen,sequential"); - if (!hd->fp) - { - hd->error = gpg_error_from_syserror (); - return hd->error; - } - - return 0; -} - - /* - - The search API - -*/ + * + * The search API + * + */ gpg_error_t keybox_search_reset (KEYBOX_HANDLE hd) @@ -914,7 +898,7 @@ keybox_search_reset (KEYBOX_HANDLE hd) { /* Ooops. Seek did not work. Close so that the search will * open the file again. */ - es_fclose (hd->fp); + _keybox_ll_close (hd->fp); hd->fp = NULL; } } @@ -992,7 +976,7 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc, if (!hd->fp) { - rc = open_file (hd); + rc = _keybox_ll_open (&hd->fp, hd->kb->fname, 0); if (rc) { xfree (sn_array); @@ -1480,7 +1464,7 @@ keybox_seek (KEYBOX_HANDLE hd, off_t offset) return 0; } - err = open_file (hd); + err = _keybox_ll_open (&hd->fp, hd->kb->fname, 0); if (err) return err; } diff --git a/kbx/keybox-update.c b/kbx/keybox-update.c index eab961a3e..be49e7b4a 100644 --- a/kbx/keybox-update.c +++ b/kbx/keybox-update.c @@ -78,10 +78,9 @@ create_tmp_file (const char *template, err = keybox_tmp_names (template, 0, r_bakfname, r_tmpfname); if (!err) { - *r_fp = es_fopen (*r_tmpfname, "wb,sysopen,sequential"); - if (!*r_fp) + err = _keybox_ll_open (r_fp, *r_tmpfname, KEYBOX_LL_OPEN_CREATE); + if (err) { - err = gpg_error_from_syserror (); xfree (*r_tmpfname); *r_tmpfname = NULL; xfree (*r_bakfname); @@ -174,31 +173,32 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, if ((ec = gnupg_access (fname, W_OK))) return gpg_error (ec); - fp = es_fopen (fname, "rb,sysopen,sequential"); - if (mode == FILECOPY_INSERT && !fp && errno == ENOENT) + rc = _keybox_ll_open (&fp, fname, 0); + if (mode == FILECOPY_INSERT && gpg_err_code (rc) == GPG_ERR_ENOENT) { /* Insert mode but file does not exist: - Create a new keybox file. */ - newfp = es_fopen (fname, "wb,sysopen,sequential"); - if (!newfp ) - return gpg_error_from_syserror (); + * Create a new keybox file. */ + rc = _keybox_ll_open (&newfp, fname, KEYBOX_LL_OPEN_CREATE); + if (rc) + return rc; rc = _keybox_write_header_blob (newfp, for_openpgp); if (rc) { - es_fclose (newfp); + _keybox_ll_close (newfp); return rc; } rc = _keybox_write_blob (blob, newfp, NULL); if (rc) { - es_fclose (newfp); + _keybox_ll_close (newfp); return rc; } - if ( es_fclose (newfp) ) - return gpg_error_from_syserror (); + rc = _keybox_ll_close (newfp); + if (rc) + return rc; /* if (chmod( fname, S_IRUSR | S_IWUSR )) */ /* { */ @@ -218,7 +218,7 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, rc = create_tmp_file (fname, &bakfname, &tmpfname, &newfp); if (rc) { - es_fclose (fp); + _keybox_ll_close (fp); goto leave; } @@ -242,16 +242,16 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, if (es_fwrite (buffer, nread, 1, newfp) != 1) { rc = gpg_error_from_syserror (); - es_fclose (fp); - es_fclose (newfp); + _keybox_ll_close (fp); + _keybox_ll_close (newfp); goto leave; } } if (es_ferror (fp)) { rc = gpg_error_from_syserror (); - es_fclose (fp); - es_fclose (newfp); + _keybox_ll_close (fp); + _keybox_ll_close (newfp); goto leave; } } @@ -275,16 +275,16 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, if (es_fwrite (buffer, nread, 1, newfp) != 1) { rc = gpg_error_from_syserror (); - es_fclose (fp); - es_fclose (newfp); + _keybox_ll_close (fp); + _keybox_ll_close (newfp); goto leave; } } if (es_ferror (fp)) { rc = gpg_error_from_syserror (); - es_fclose (fp); - es_fclose (newfp); + _keybox_ll_close (fp); + _keybox_ll_close (newfp); goto leave; } @@ -292,8 +292,8 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, rc = _keybox_read_blob (NULL, fp, NULL); if (rc) { - es_fclose (fp); - es_fclose (newfp); + _keybox_ll_close (fp); + _keybox_ll_close (newfp); goto leave; } } @@ -304,8 +304,8 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, rc = _keybox_write_blob (blob, newfp, NULL); if (rc) { - es_fclose (fp); - es_fclose (newfp); + _keybox_ll_close (fp); + _keybox_ll_close (newfp); goto leave; } } @@ -318,32 +318,30 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, if (es_fwrite (buffer, nread, 1, newfp) != 1) { rc = gpg_error_from_syserror (); - es_fclose (fp); - es_fclose (newfp); + _keybox_ll_close (fp); + _keybox_ll_close (newfp); goto leave; } } if (es_ferror (fp)) { rc = gpg_error_from_syserror (); - es_fclose (fp); - es_fclose (newfp); + _keybox_ll_close (fp); + _keybox_ll_close (newfp); goto leave; } } /* Close both files. */ - if (es_fclose(fp)) + rc = _keybox_ll_close (fp); + if (rc) { - rc = gpg_error_from_syserror (); - es_fclose (newfp); - goto leave; - } - if (es_fclose(newfp)) - { - rc = gpg_error_from_syserror (); + _keybox_ll_close (newfp); goto leave; } + rc = _keybox_ll_close (newfp); + if (rc) + goto leave; rc = rename_tmp_file (bakfname, tmpfname, fname, secret); @@ -502,6 +500,7 @@ keybox_update_cert (KEYBOX_HANDLE hd, ksba_cert_t cert, int keybox_set_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int value) { + gpg_error_t err; off_t off; const char *fname; estream_t fp; @@ -536,9 +535,10 @@ keybox_set_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int value) off += flag_pos; _keybox_close_file (hd); - fp = es_fopen (hd->kb->fname, "r+b,sysopen,sequential"); - if (!fp) - return gpg_error_from_syserror (); + + err = _keybox_ll_open (&fp, fname, KEYBOX_LL_OPEN_UPDATE); + if (err) + return err; ec = 0; if (es_fseeko (fp, off, SEEK_SET)) @@ -566,10 +566,11 @@ keybox_set_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int value) } } - if (es_fclose (fp)) + err = _keybox_ll_close (fp); + if (err) { if (!ec) - ec = gpg_err_code_from_syserror (); + ec = gpg_err_code (err); } return gpg_error (ec); @@ -583,7 +584,7 @@ keybox_delete (KEYBOX_HANDLE hd) off_t off; const char *fname; estream_t fp; - int rc; + int rc, rc2; if (!hd) return gpg_error (GPG_ERR_INV_VALUE); @@ -601,9 +602,9 @@ keybox_delete (KEYBOX_HANDLE hd) off += 4; _keybox_close_file (hd); - fp = es_fopen (hd->kb->fname, "r+b,sysopen,sequential"); - if (!fp) - return gpg_error_from_syserror (); + rc = _keybox_ll_open (&fp, hd->kb->fname, KEYBOX_LL_OPEN_UPDATE); + if (rc) + return rc; if (es_fseeko (fp, off, SEEK_SET)) rc = gpg_error_from_syserror (); @@ -612,10 +613,11 @@ keybox_delete (KEYBOX_HANDLE hd) else rc = 0; - if (es_fclose (fp)) + rc2 = _keybox_ll_close (fp); + if (rc2) { if (!rc) - rc = gpg_error_from_syserror (); + rc = rc2; } return rc; @@ -628,7 +630,7 @@ int keybox_compress (KEYBOX_HANDLE hd) { gpg_err_code_t ec; - int read_rc, rc; + int read_rc, rc, rc2; const char *fname; estream_t fp, newfp; char *bakfname = NULL; @@ -656,14 +658,11 @@ keybox_compress (KEYBOX_HANDLE hd) if ((ec = gnupg_access (fname, W_OK))) return gpg_error (ec); - fp = es_fopen (fname, "rb,sysopen,sequential"); - if (!fp && errno == ENOENT) + rc = _keybox_ll_open (&fp, fname, 0); + if (gpg_err_code (rc) == GPG_ERR_ENOENT) return 0; /* Ready. File has been deleted right after the access above. */ - if (!fp) - { - rc = gpg_error_from_syserror (); - return rc; - } + if (rc) + return rc; /* A quick test to see if we need to compress the file at all. We schedule a compress run after 3 hours. */ @@ -679,7 +678,7 @@ keybox_compress (KEYBOX_HANDLE hd) if ( (last_maint + 3*3600) > make_timestamp () ) { - es_fclose (fp); + _keybox_ll_close (fp); _keybox_release_blob (blob); return 0; /* Compress run not yet needed. */ } @@ -693,7 +692,7 @@ keybox_compress (KEYBOX_HANDLE hd) rc = create_tmp_file (fname, &bakfname, &tmpfname, &newfp); if (rc) { - es_fclose (fp); + _keybox_ll_close (fp); return rc;; } @@ -782,10 +781,10 @@ keybox_compress (KEYBOX_HANDLE hd) rc = read_rc; /* Close both files. */ - if (es_fclose(fp) && !rc) - rc = gpg_error_from_syserror (); - if (es_fclose(newfp) && !rc) - rc = gpg_error_from_syserror (); + if ((rc2 = _keybox_ll_close (fp)) && !rc) + rc = rc2; + if ((rc2 = _keybox_ll_close (newfp)) && !rc) + rc = rc2; /* Rename or remove the temporary file. */ if (rc || !any_changes)