On Tue, Dec 11, 2018 at 2:14 AM Tom de Vries <tdevr...@suse.de> wrote: > > Read the elf file pointed at by the .gnu_debugaltlink section, and verify that > the build id matches. > > 2018-11-11 Tom de Vries <tdevr...@suse.de> > > * elf.c (elf_add): Add and handle with_buildid_data and > with_buildid_size parameters. Handle .gnu_debugaltlink section. > (phdr_callback, backtrace_initialize): Add arguments to elf_add calls. > ---
@@ -2899,6 +2918,27 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor, > } > } > > + if (!debugaltlink_view_valid > + && strcmp (name, ".gnu_debugaltlink") == 0) > + { > + const char *debugaltlink_data; > + size_t debugaltlink_name_len; > + > + if (!backtrace_get_view (state, descriptor, shdr->sh_offset, > + shdr->sh_size, error_callback, data, > + &debugaltlink_view)) > + goto fail; > + > + debugaltlink_view_valid = 1; > + debugaltlink_data = (const char *) debugaltlink_view.data; > + debugaltlink_name = debugaltlink_data; > + debugaltlink_name_len = strnlen (debugaltlink_data, shdr->sh_size); > + debugaltlink_buildid_data = (debugaltlink_data > + + debugaltlink_name_len > + + 1); > + debugaltlink_buildid_size = shdr->sh_size - debugaltlink_name_len - > 1; > + } > + This doesn't look quite right. debugaltlink_buildid_size is unsigned. If there is some misunderstanding of the format it's possible for strnlen to return shdr->sh_size. If it does, debugaltlink_buildid_size will be set to a very large value. > + if (debugaltlink_name != NULL) > + { > + int d; > + > + d = elf_open_debugfile_by_debuglink (state, filename, > debugaltlink_name, > + 0, error_callback, data); > + if (d >= 0) > + { > + int ret; > + > + ret = elf_add (state, filename, d, base_address, error_callback, > data, > + fileline_fn, found_sym, found_dwarf, 0, 1, > + debugaltlink_buildid_data, > debugaltlink_buildid_size); > + backtrace_release_view (state, &debugaltlink_view, error_callback, > + data); > + debugaltlink_view_valid = 0; > + if (ret < 0) > + { > + backtrace_close (d, error_callback, data); > + return ret; > + } > + } > + else > + { > + error_callback (data, > + "Could not open .gnu_debugaltlink", 0); > + /* Don't goto fail, but try continue without the info in the > + .gnu_debugaltlink. */ > + } > + } The strings passed to error_callback always start with a lowercase letter (unless they start with something like ELF) because the callback will most likely print them with some prefix. More seriously, we don't call error_callback in any cases that correspond to this. We just carry on. Is there any reason to call error_callback here? Ian