https://sourceware.org/bugzilla/show_bug.cgi?id=33382
Bug ID: 33382
Summary: Investigate unlock/wrlock pattern
Product: elfutils
Version: unspecified
Status: NEW
Severity: normal
Priority: P2
Component: general
Assignee: unassigned at sourceware dot org
Reporter: mark at klomp dot org
CC: elfutils-devel at sourceware dot org
Target Milestone: ---
There are various unlock/rwlock patterns in the code where a read lock has been
taken, a condition is detected that needs writing to the datastructure, the
read lock is dropped and the write lock is acquired.
This might be OK if the condition is rechecked after acquiring the write lock
to make sure there wasn't another thread racing past the unlock and relock that
changed the data structures. But this doesn't always happen, see e.g.
elf_getdata_rawchunk.c: Fix dummy chunk insertion race condition
https://patchwork.sourceware.org/project/elfutils/patch/[email protected]/
We should audit this pattern and make sure the code contains comments why it is
correct:
- libdw/libdw_alloc.c (__libdw_alloc_tail)
Looks correct, condition is rechecked
- libelf/elf32_getehdr.c (getehdr_impl)
Might be correct, goto again which rechecks condition
- libelf/elf32_getshdr.c (getshdr_rdlock)
Does reload result and rechecks.
- libelf/elf_begin.c (lock_dup_elf)
Looks racy. But depends on caller and what the called dup_elf does.
- libelf/elf_getdata.c (__libelf_set_data_list_rdlock):
Looks OK. Rechecks condition.
(__elf_getdata_rdlock):
Comment says it is OK, but I don't get it.
- libelf/elf_strptr.c (elf_strptr):
Looks correct, condition is rechecked.
Random other observation:
- dwflst_process_tracker.c (dwflst_tracker_end)
/* HACK to allow iteration of dynamicsizehash_concurrent. */
/* XXX Based on lib/dynamicsizehash_concurrent.c free(). */
Investigate.
--
You are receiving this mail because:
You are on the CC list for the bug.