1
0
Fork 0
mirror of git://git.gnupg.org/gnupg.git synced 2025-07-03 22:56:33 +02:00

agent: Update the key file only if not changed.

* common/name-value.c (struct name_value_container): Add flag
"modified".
(nvc_modified): New.
(nvc_new): Set flag.
(_nvc_add): Set flag.
(nvc_delete): Set flag.
(nvc_set): Set flag unless value did not change.
(nve_set): Add arg PK.  Change the caller.
* agent/findkey.c (agent_write_private_key): Update only if modified.
--

This helps software which uses a file system watcher to track changes
to private keys.  In particular smartcard triggered changes are a
problem for such software because this may at worst trigger another
smartcard read.

GnuPG-bug-id: 6829
This commit is contained in:
Werner Koch 2023-11-21 08:34:04 +01:00
parent e43bd2a7a7
commit cf2d3f7ba0
No known key found for this signature in database
GPG key ID: E3FDFF218E45B72B
3 changed files with 56 additions and 9 deletions

View file

@ -146,6 +146,8 @@ agent_write_private_key (const unsigned char *grip,
}
}
nvc_modified (pk, 1); /* Clear that flag after a read. */
if (!pk)
{
/* Key is still in the old format or does not exist - create a
@ -242,7 +244,7 @@ agent_write_private_key (const unsigned char *grip,
; /* No need to update Token entry. */
else
{
err = nve_set (item, token);
err = nve_set (pk, item, token);
if (err)
goto leave;
}
@ -263,6 +265,13 @@ agent_write_private_key (const unsigned char *grip,
goto leave;
}
/* Check whether we need to write the file at all. */
if (!nvc_modified (pk, 0))
{
err = 0;
goto leave;
}
/* Create a temporary file for writing. */
tmpfname = fname_from_keygrip (grip, 1);
fp = tmpfname ? es_fopen (tmpfname, "wbx,mode=-rw") : NULL;