From d1012b8e33aaebe988aaf0723d26ddef9e155dbf Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Wed, 22 Aug 2018 14:18:08 -0400 Subject: [PATCH] Make read_program_headers_from_bfd return a gdb::byte_vector This patch makes read_program_headers_from_bfd return a gdb::byte_vector instead of a plain pointer. gdb/ChangeLog: * solib-svr4.c (read_program_headers_from_bfd): Return gdb::optional. (svr4_exec_displacement): Adjust. --- gdb/ChangeLog | 6 +++++ gdb/solib-svr4.c | 58 ++++++++++++++++++------------------------------ 2 files changed, 27 insertions(+), 37 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ddd8720e120..61b4e29a80f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2018-08-22 Simon Marchi + + * solib-svr4.c (read_program_headers_from_bfd): Return + gdb::optional. + (svr4_exec_displacement): Adjust. + 2018-08-22 Simon Marchi * solib-svr4.c (read_program_header): Return diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 358d7e7cc6c..bfef217f3fc 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -2471,28 +2471,20 @@ enable_break (struct svr4_info *info, int from_tty) return 0; } -/* Read the ELF program headers from ABFD. Return the contents and - set *PHDRS_SIZE to the size of the program headers. */ +/* Read the ELF program headers from ABFD. */ -static gdb_byte * -read_program_headers_from_bfd (bfd *abfd, int *phdrs_size) +static gdb::optional +read_program_headers_from_bfd (bfd *abfd) { - Elf_Internal_Ehdr *ehdr; - gdb_byte *buf; - - ehdr = elf_elfheader (abfd); - - *phdrs_size = ehdr->e_phnum * ehdr->e_phentsize; - if (*phdrs_size == 0) - return NULL; + Elf_Internal_Ehdr *ehdr = elf_elfheader (abfd); + int phdrs_size = ehdr->e_phnum * ehdr->e_phentsize; + if (phdrs_size == 0) + return {}; - buf = (gdb_byte *) xmalloc (*phdrs_size); + gdb::byte_vector buf (phdrs_size); if (bfd_seek (abfd, ehdr->e_phoff, SEEK_SET) != 0 - || bfd_bread (buf, *phdrs_size, abfd) != *phdrs_size) - { - xfree (buf); - return NULL; - } + || bfd_bread (buf.data (), phdrs_size, abfd) != phdrs_size) + return {}; return buf; } @@ -2586,16 +2578,15 @@ svr4_exec_displacement (CORE_ADDR *displacementp) if (bfd_get_flavour (exec_bfd) == bfd_target_elf_flavour) { - /* Be optimistic and clear OK only if GDB was able to verify the headers + /* Be optimistic and return 0 only if GDB was able to verify the headers really do not match. */ - int phdrs2_size, ok = 1; - gdb_byte *buf2; int arch_size; gdb::optional phdrs_target = read_program_header (-1, &arch_size, NULL); - buf2 = read_program_headers_from_bfd (exec_bfd, &phdrs2_size); - if (phdrs_target && buf2 != NULL) + gdb::optional phdrs_binary + = read_program_headers_from_bfd (exec_bfd); + if (phdrs_target && phdrs_binary) { enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); @@ -2612,9 +2603,9 @@ svr4_exec_displacement (CORE_ADDR *displacementp) relocate BUF and BUF2 just by the EXEC_BFD vs. target memory content offset for the verification purpose. */ - if (phdrs_target->size () != phdrs2_size + if (phdrs_target->size () != phdrs_binary->size () || bfd_get_arch_size (exec_bfd) != arch_size) - ok = 0; + return 0; else if (arch_size == 32 && phdrs_target->size () >= sizeof (Elf32_External_Phdr) && phdrs_target->size () % sizeof (Elf32_External_Phdr) == 0) @@ -2672,7 +2663,7 @@ svr4_exec_displacement (CORE_ADDR *displacementp) phdrp = &((Elf32_External_Phdr *) phdrs_target->data ())[i]; buf_vaddr_p = (gdb_byte *) &phdrp->p_vaddr; buf_paddr_p = (gdb_byte *) &phdrp->p_paddr; - phdr2p = &((Elf32_External_Phdr *) buf2)[i]; + phdr2p = &((Elf32_External_Phdr *) phdrs_binary->data ())[i]; /* PT_GNU_STACK is an exception by being never relocated by prelink as its addresses are always zero. */ @@ -2747,8 +2738,7 @@ svr4_exec_displacement (CORE_ADDR *displacementp) continue; } - ok = 0; - break; + return 0; } } else if (arch_size == 64 @@ -2807,7 +2797,7 @@ svr4_exec_displacement (CORE_ADDR *displacementp) phdrp = &((Elf64_External_Phdr *) phdrs_target->data ())[i]; buf_vaddr_p = (gdb_byte *) &phdrp->p_vaddr; buf_paddr_p = (gdb_byte *) &phdrp->p_paddr; - phdr2p = &((Elf64_External_Phdr *) buf2)[i]; + phdr2p = &((Elf64_External_Phdr *) phdrs_binary->data ())[i]; /* PT_GNU_STACK is an exception by being never relocated by prelink as its addresses are always zero. */ @@ -2882,18 +2872,12 @@ svr4_exec_displacement (CORE_ADDR *displacementp) continue; } - ok = 0; - break; + return 0; } } else - ok = 0; + return 0; } - - xfree (buf2); - - if (!ok) - return 0; } if (info_verbose) -- 2.30.2