From e09a07b3d32d171849d8c3a16b8d61ff3d63a01e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Wed, 4 Jan 2023 15:04:06 +0100 Subject: [PATCH] Fix segmentation fault if a NOBITS section is specified as a source section --- src/elfpatch.c | 10 +++++++++- src/main.c | 7 +++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/elfpatch.c b/src/elfpatch.c index 390284f..7e9c3a0 100644 --- a/src/elfpatch.c +++ b/src/elfpatch.c @@ -423,8 +423,16 @@ int elf_patch_compute_crc_over_section(elfpatch_handle_t *ep, const char *sectio } print_debug("Section data length: %lu\n", data->d_size); - if (!data->d_size) + if (!data->d_size) { print_err("Section %s contains no data.\n", section); + return -2; + } + + /* NOBIT sections have a length but no data in the file. Abort in this case */ + if (!data->d_buf) { + print_err("Section %s does not contain loadable data.\n", section); + return -2; + } /* If big endian or granularity is byte, simply compute CRC. No reordering is necessary */ if (!little_endian || granularity == GRANULARITY_BYTE) { diff --git a/src/main.c b/src/main.c index 97c2047..bc14947 100644 --- a/src/main.c +++ b/src/main.c @@ -407,12 +407,14 @@ int main(int argc, char **argv) /* Check if all sections are present */ if (check_all_sections_present(ep, cmd_opts.section_list)) { ret = -2; - goto free_cmds; + goto ret_close_elf; } /* Compute CRCs over sections */ crcs = (uint32_t *)malloc(sl_list_length(cmd_opts.section_list) * sizeof(uint32_t)); - compute_crcs(ep, cmd_opts.section_list, &cmd_opts, crcs); + if (compute_crcs(ep, cmd_opts.section_list, &cmd_opts, crcs)) { + goto ret_close_elf; + } if (reporting_get_verbosity()) { print_crcs(cmd_opts.section_list, crcs); @@ -427,6 +429,7 @@ int main(int argc, char **argv) } } +ret_close_elf: elf_patch_close_and_free(ep); free_cmds: