From: Tom de Vries Date: Fri, 15 Jul 2022 17:02:26 +0000 (+0200) Subject: [gdb/symtab] Fix data race in add_compunit_symtab_to_objfile X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4f005db8e084bc9825145f048b3b48b35673b2fb;p=thirdparty%2Fbinutils-gdb.git [gdb/symtab] Fix data race in add_compunit_symtab_to_objfile Data race bewteen: ... Read of size 8 at 0x7b4000006d20 by thread T3: #0 add_compunit_symtab_to_objfile(compunit_symtab*) gdb/symfile.c:2852 (gdb+0xe89cff) #1 buildsym_compunit::end_compunit_symtab_with_blockvector(block*, int, int) gdb/buildsym.c:1018 (gdb+0x63e857) #2 buildsym_compunit::end_compunit_symtab_from_static_block(block*, int, int) gdb/buildsym.c:1052 (gdb+0x63e8cd) #3 process_full_comp_unit gdb/dwarf2/read.c:8414 (gdb+0x8396b6) #4 process_queue_item gdb/dwarf2/read.c:7592 (gdb+0x8359f5) ... and: ... Previous write of size 8 at 0x7b4000006d20 by thread T4: #0 add_compunit_symtab_to_objfile(compunit_symtab*) gdb/symfile.c:2853 (gdb+0xe89d35) #1 buildsym_compunit::end_compunit_symtab_with_blockvector(block*, int, int) gdb/buildsym.c:1018 (gdb+0x63e857) #2 buildsym_compunit::end_compunit_symtab_from_static_block(block*, int, int) gdb/buildsym.c:1052 (gdb+0x63e8cd) #3 process_full_comp_unit gdb/dwarf2/read.c:8414 (gdb+0x8396b6) #4 process_queue_item gdb/dwarf2/read.c:7592 (gdb+0x8359f5) ... Fix this by adding a lock in add_compunit_symtab_to_objfile. --- diff --git a/gdb/symfile.c b/gdb/symfile.c index d2fd08cd65a..649b4bf2288 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -2849,6 +2849,10 @@ allocate_compunit_symtab (struct objfile *objfile, const char *name) void add_compunit_symtab_to_objfile (struct compunit_symtab *cu) { +#if CXX_STD_THREAD + static std::mutex add_compunit_symtab_to_objfile_lock; + std::lock_guard guard (add_compunit_symtab_to_objfile_lock); +#endif cu->next = cu->objfile ()->compunit_symtabs; cu->objfile ()->compunit_symtabs = cu; }