gdb: fix "passing NULL to memcpy" UBsan error in dwarf2/cooked-index.c
authorSimon Marchi <simon.marchi@efficios.com>
Tue, 12 Apr 2022 18:37:24 +0000 (14:37 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Tue, 12 Apr 2022 18:42:02 +0000 (14:42 -0400)
Reading a simple file compiled with :

    $ gcc -DONE=1 -gdwarf-4 -g3  test.c
    $ gcc --version
    gcc (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0

I get:

    Reading symbols from /tmp/cwd/a.out...
    /home/smarchi/src/binutils-gdb/gdb/dwarf2/cooked-index.c:332:11: runtime error: null pointer passed as argument 2, which is declared to never be null

It looks like even if the size is 0 (the size of the `entries` vector is
0), we shouldn't be passing a NULL pointer to memcpy.  And
`entries.data ()` returns NULL.

Fix that by using std::vector::insert to insert the items of entries
into m_entries.  I haven't checked, but it should essentially compile
down to a memcpy, since the vector elements are trivially copyiable.

Change-Id: I75f1c901e9b522e42e89eb5936e2c70d68eb21e5

gdb/dwarf2/cooked-index.c

index 784c06ea04ba3b8d2e4ae978a8c280635ee8b218..b66ef5a1c6481bd3d1a15448043993058f163d5e 100644 (file)
@@ -327,10 +327,8 @@ cooked_index_vector::finalize ()
        m_entries = std::move (entries);
       else
        {
-         size_t old_size = m_entries.size ();
-         m_entries.resize (m_entries.size () + entries.size ());
-         memcpy (m_entries.data () + old_size,
-                 entries.data (), entries.size () * sizeof (entries[0]));
+         m_entries.reserve (m_entries.size () + entries.size ());
+         m_entries.insert (m_entries.end (), entries.begin (), entries.end ());
        }
     }