diff --git a/src/elfpatch.c b/src/elfpatch.c index e1f7ef1..978f8e6 100644 --- a/src/elfpatch.c +++ b/src/elfpatch.c @@ -232,9 +232,6 @@ static int elf_patch_update_info(elfpatch_handle_t *ep) { Elf_Kind ek; const char *type_string = "unrecognized"; - size_t header_count = 0ull; - GElf_Phdr phdr; - size_t i; ret_val_if_ep_err(ep, -1001); @@ -276,20 +273,6 @@ static int elf_patch_update_info(elfpatch_handle_t *ep) return -1; } - /* Get program headers */ - if ( elf_getphdrnum(ep->elf, &header_count) != 0) { - print_err("Error reading count of program headers: %s\n", elf_errmsg(-1)); - return -1; - } - - for (i = 0ull; i < header_count; i++) { - if (gelf_getphdr(ep->elf, (int)i, &phdr) != &phdr) { - print_err("Error reading program header (%zu): %s\n", i, elf_errmsg(-1)); - return -1; - } - print_debug("Read program header %zu\n", i); - } - return 0; } @@ -440,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) { @@ -543,6 +534,11 @@ int elf_patch_write_crcs_to_section(elfpatch_handle_t *ep, const char *section, /* Get data object of section */ output_sec_data = elf_getdata(output_section->scn, NULL); sec_bytes = (uint8_t *)output_sec_data->d_buf; + if (!sec_bytes) { + print_err("Output section '%s' does not contain loadable data. It has to be allocated in the ELF file\n", + section); + goto ret_err; + } /* Check the start and end magics */ if (check_start_magic) { 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: