aboutsummaryrefslogtreecommitdiffstats
path: root/dirmngr/dirmngr.c
diff options
context:
space:
mode:
authorDaniel Kahn Gillmor <[email protected]>2016-10-29 05:25:05 +0000
committerDaniel Kahn Gillmor <[email protected]>2019-07-20 18:16:19 +0000
commit24507b15672dd873916f7242e59651e417fe0c0a (patch)
tree33e575afdeadb7954e6153a95eea07fd77ac8ab5 /dirmngr/dirmngr.c
parentAvoid simple memory dumps via ptrace (diff)
downloadgnupg-24507b15672dd873916f7242e59651e417fe0c0a.tar.gz
gnupg-24507b15672dd873916f7242e59651e417fe0c0a.zip
dirmngr: hkp: Avoid potential race condition when some hosts die.
* dirmngr/ks-engine-hkp.c (select_random_host): Use atomic pass through the host table instead of risking out-of-bounds write. -- Multiple threads may write to hosttable[x]->dead while select_random_host() is running. For example, a housekeeping thread might clear the ->dead bit on some entries, or another connection to dirmngr might manually mark a host as alive. If one or more hosts are resurrected between the two loops over a given table in select_random_host(), then the allocation of tbl might not be large enough, resulting in a write past the end of tbl on the second loop. This change collapses the two loops into a single loop to avoid this discrepancy: each host's "dead" bit is now only checked once. As Werner points out, this isn't currently strictly necessary, since npth will not switch threads unless a blocking system call is made, and no blocking system call is made in these two loops. However, in a subsequent change in this series, we will call a function in this loop, and that function may sometimes write(2), or call other functions, which may themselves block. Keeping this as a single-pass loop avoids the need to keep track of what might block and what might not. Signed-off-by: Daniel Kahn Gillmor <[email protected]> Gbp-Pq: Topic dirmngr-idling Gbp-Pq: Name dirmngr-hkp-Avoid-potential-race-condition-when-some.patch
Diffstat (limited to 'dirmngr/dirmngr.c')
0 files changed, 0 insertions, 0 deletions