]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/symtab] Fix race condition in just_read_cus
authorTom de Vries <tdevries@suse.de>
Fri, 15 Jul 2022 16:46:03 +0000 (18:46 +0200)
committerTom de Vries <tdevries@suse.de>
Thu, 21 Jul 2022 13:06:40 +0000 (15:06 +0200)
Race condition between:
...
  Read of size 8 at 0x7b640001f2c8 by thread T1:
    #0 std::vector<dwarf2_per_cu_data*, std::allocator<dwarf2_per_cu_data*>
    >::push_back(dwarf2_per_cu_data* const&)
    /usr/include/c++/12/bits/stl_vector.h:1278 (gdb+0x888ad6)
    #1 process_full_comp_unit gdb/dwarf2/read.c:8451 (gdb+0x8397d0)
    #2 process_queue_item gdb/dwarf2/read.c:7592 (gdb+0x8359f5)
...
and:
...
  Previous write of size 8 at 0x7b640001f2c8 by main thread:
    #0 std::vector<dwarf2_per_cu_data*, std::allocator<dwarf2_per_cu_data*>
    >::push_back(dwarf2_per_cu_data* const&)
    /usr/include/c++/12/bits/stl_vector.h:1283 (gdb+0x888b52)
    #1 process_full_comp_unit gdb/dwarf2/read.c:8451 (gdb+0x8397d0)
    #2 process_queue_item gdb/dwarf2/read.c:7592 (gdb+0x8359f5)
...

Fix this by doing the just_read_cus push_back in a lock.

gdb/dwarf2/read.c

index 11ba01c6b01a89ddf2b3d931f22fa58bfa8f0250..66f3ca01caf43e6a8412c173f082599d44db1ddd 100644 (file)
@@ -8463,8 +8463,14 @@ process_full_comp_unit (dwarf2_cu *cu, enum language pretend_language)
 
   per_objfile->set_symtab (cu->per_cu, cust);
 
-  /* Push it for inclusion processing later.  */
-  per_objfile->per_bfd->just_read_cus.push_back (cu->per_cu);
+#if CXX_STD_THREAD
+  {
+    static std::mutex just_read_cus_lock;
+    std::lock_guard<std::mutex> guard (just_read_cus_lock);
+#endif
+    /* Push it for inclusion processing later.  */
+    per_objfile->per_bfd->just_read_cus.push_back (cu->per_cu);
+  }
 
   /* Not needed any more.  */
   cu->reset_builder ();