Hi Aleksei, On Tue, Feb 14, 2023 at 08:30:02PM +0000, Aleksei Vetrov via Elfutils-devel wrote: > It is expected from libdw to return strings that are null-terminated to > avoid overflowing ELF data. > > * Add calculation of a safe prefix inside string sections, where any > string will be null-terminated. > > * Check if offset overflows the safe prefix in dwarf_formstring.
This is a very nice sanity/hardening fix. > + /* If the section contains string data, we want to know a size of a prefix > + where any string will be null-terminated. */ > + enum string_section_index string_section_idx = > scn_to_string_section_idx[cnt]; > + if (string_section_idx < STR_SCN_IDX_last) > + { > + size_t size = data->d_size; > + /* Reduce the size by the number of non-zero bytes at the end of the > + section. */ > + while (size > 0 && *((const char *) data->d_buf + size - 1) != '\0') > + --size; > + result->string_section_size[string_section_idx] = size; > + } Checking from the end is smart. In the normal case the debug string section will end with a zero terminator (or zero padding), so this should be really quick. > @@ -171,7 +174,7 @@ dwarf_formstring (Dwarf_Attribute *attrp) > else > off = read_8ubyte_unaligned (dbg, datap); > > - if (off > dbg->sectiondata[IDX_debug_str]->d_size) > + if (off >= data_size) > goto invalid_offset; > } O, the original check was actually one off. Looks good. Pushed as is. Thanks, Mark