]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/symtab] Fix data race in add_compunit_symtab_to_objfile
authorTom de Vries <tdevries@suse.de>
Fri, 15 Jul 2022 17:02:26 +0000 (19:02 +0200)
committerTom de Vries <tdevries@suse.de>
Thu, 21 Jul 2022 13:06:40 +0000 (15:06 +0200)
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.

gdb/symfile.c

index d2fd08cd65ad62b2439cc5a98a3728ae51c86b94..649b4bf2288b55e1394edd936b032873d08bb0fa 100644 (file)
@@ -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<std::mutex> guard (add_compunit_symtab_to_objfile_lock);
+#endif
   cu->next = cu->objfile ()->compunit_symtabs;
   cu->objfile ()->compunit_symtabs = cu;
 }