aboutsummaryrefslogtreecommitdiffstats
path: root/g10/keyring.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2016-08-03 13:31:27 +0000
committerWerner Koch <[email protected]>2016-08-03 13:31:27 +0000
commit48a2c93a1886589d1a0e2a4a2173e0e81311200b (patch)
tree80cee1c6eb19941ab9676482f9eb4984d7360e83 /g10/keyring.c
parentcommon: New file utilproto.c (diff)
downloadgnupg-48a2c93a1886589d1a0e2a4a2173e0e81311200b.tar.gz
gnupg-48a2c93a1886589d1a0e2a4a2173e0e81311200b.zip
gpg,gpgsm: Block signals during keyring/keybox update.
* kbx/keybox-util.c (keybox_file_rename): Add arg BLOCK_SIGNALS. * kbx/keybox-update.c (rename_tmp_file): Block all signals when doing a double rename. * g10/keyring.c (rename_tmp_file): Block all signals during the double rename. -- This might fix Debian-bug-id: 831510 Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'g10/keyring.c')
-rw-r--r--g10/keyring.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/g10/keyring.c b/g10/keyring.c
index 0611b2eb9..aa73290b2 100644
--- a/g10/keyring.c
+++ b/g10/keyring.c
@@ -1338,6 +1338,7 @@ static int
rename_tmp_file (const char *bakfname, const char *tmpfname, const char *fname)
{
int rc = 0;
+ int block = 0;
/* Invalidate close caches. */
if (iobuf_ioctl (NULL, IOBUF_IOCTL_INVALIDATE_CACHE, 0, (char*)tmpfname ))
@@ -1349,12 +1350,18 @@ rename_tmp_file (const char *bakfname, const char *tmpfname, const char *fname)
iobuf_ioctl (NULL, IOBUF_IOCTL_INVALIDATE_CACHE, 0, (char*)fname );
/* First make a backup file. */
- rc = keybox_file_rename (fname, bakfname);
+ block = 1;
+ rc = keybox_file_rename (fname, bakfname, &block);
if (rc)
goto fail;
/* then rename the file */
- rc = keybox_file_rename (tmpfname, fname);
+ rc = keybox_file_rename (tmpfname, fname, NULL);
+ if (block)
+ {
+ gnupg_unblock_all_signals ();
+ block = 0;
+ }
if (rc)
{
register_secured_file (fname);
@@ -1379,6 +1386,8 @@ rename_tmp_file (const char *bakfname, const char *tmpfname, const char *fname)
return 0;
fail:
+ if (block)
+ gnupg_unblock_all_signals ();
return rc;
}