In commit:
commit
633cf2548bcd3dafe297e21a1dd3574240280d48
Date: Wed May 9 15:42:28 2018 -0600
Remove cleanups from mdebugread.c
the following change was made in the function parse_partial_symbols in
mdebugread.c:
- fdr_to_pst = XCNEWVEC (struct pst_map, hdr->ifdMax + 1);
- old_chain = make_cleanup (xfree, fdr_to_pst);
+ gdb::def_vector<struct pst_map> fdr_to_pst_holder (hdr->ifdMax + 1);
+ fdr_to_pst = fdr_to_pst_holder.data ();
The problem with this change is that XCNEWVEC calls xcalloc, which in
turn calls calloc, and calloc zero initializes the allocated memory.
In contrast, the new line gdb::def_vector<struct pst_map> specifically
does not initialize the underlying memory.
This is a problem because, later on in this same function, we
increment the n_globals field within 'struct pst_map' objects stored
in the vector. The incrementing is now being done from an
uninitialized starting point.
In this commit we switch from using gdb::def_vector to using
std::vector, this alone should be enough to ensure that the fields are
initialized to zero.
However, for extra clarity, I have also added initial values in the
'struct pst_map' to make it crystal clear how the struct will start
up.
This issue was reported on the mailing list here:
https://sourceware.org/pipermail/gdb-patches/2021-November/183693.html
Co-Authored-By: Lightning <lightningth@gmail.com>
struct pst_map
{
- legacy_psymtab *pst; /* the psymtab proper */
- long n_globals; /* exported globals (external symbols) */
- long globals_offset; /* cumulative */
+ legacy_psymtab *pst = nullptr; /* the psymtab proper */
+ long n_globals = 0; /* exported globals (external symbols) */
+ long globals_offset = 0; /* cumulative */
};
/* Allocate the map FDR -> PST.
Minor hack: -O3 images might claim some global data belongs
to FDR -1. We`ll go along with that. */
- gdb::def_vector<struct pst_map> fdr_to_pst_holder (hdr->ifdMax + 1);
+ std::vector<struct pst_map> fdr_to_pst_holder (hdr->ifdMax + 1);
fdr_to_pst = fdr_to_pst_holder.data ();
fdr_to_pst++;
{