avoid double-close in unusual dotlock situations
authorDaniel Kahn Gillmor <dkg@fifthhorseman.net>
Fri, 19 Dec 2014 22:12:37 +0000 (17:12 -0500)
committerWerner Koch <wk@gnupg.org>
Mon, 22 Dec 2014 11:56:13 +0000 (12:56 +0100)
commit628b111fa679612e23c0d46505b1ecbbf091897d
tree7d8e5e5f396d97b47a2e3b0affdff8caf4cb38c4
parent351bca9047d748c3c4f7e9a3cdc476af127b1da3
avoid double-close in unusual dotlock situations

* common/dotlock.c: (dotlock_create_unix) avoid double-close()
 in unusual situations.

--

close(2) says:

 close() should not be retried after an EINTR since this  may
       cause a reused descriptor from another thread to be closed.

Before this patch was applied, if close(fd) failed with EINTR, it
would be closed again in the write_failed: block.

It could also have been closed a second time in the case that
(use_hardlinks_p (h->tname)) evaluated to something other than 0 or 1.

This patch avoids both of those scenarios.

Note that close() could still be called twice on the same file
descriptor if the first close(fd) fails but errno is not EINTR.  I'm
not sure the right thing to do in that scenario.  An alternate
resolution could be to unequivocally set fd to -1 after the first
failed close(fd), avoiding the errno == EINTR test.

Debian-Bug-Id: 773423
common/dotlock.c