gpg: Fix TOCTTOU when updating keyblocks.
authorNeal H. Walfield <neal@g10code.com>
Tue, 15 Dec 2015 19:05:20 +0000 (20:05 +0100)
committerNeal H. Walfield <neal@g10code.com>
Tue, 22 Dec 2015 14:03:51 +0000 (15:03 +0100)
commitdc417bf0c555a7416d0aedde6645fd1087660f92
tree4cee54836db3b65ea727a6528625b461d6995515
parent02eb9fc9d5863abcfed6af704e618f8cac7cc2e8
gpg: Fix TOCTTOU when updating keyblocks.

* g10/keydb.c (keydb_update_keyblock): Don't replace the record at the
current offset.  After taking the lock, extract the fingerprint from
the keyblock, find it and then replace it.

--
Signed-off-by: Neal H. Walfield <neal@g10code.com>
GnuPG-bug-id: 2193

Between locating the record to update and actually updating the
keyblock, it is possible that another process modifies the keyring,
which causes the update to corrupt the keyring.  This is due to a time
of check to time of use bug.  The fix is straightforward: both
operations must be done while holding the lock.  This changes the
semantics of the function slightly, but no callers need to be
modified.  Further, it now becomes impossible to replace key A with B;
this function will only ever update B.
g10/keydb.c
g10/keydb.h