From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11666 invoked by alias); 20 Aug 2018 01:30:24 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 11017 invoked by uid 89); 20 Aug 2018 01:30:05 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.2 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_SOFTFAIL autolearn=ham version=3.3.2 spammy=H*MI:sk:2018082, relocate, H*RU:sk:barracu, HX-HELO:sk:barracu X-HELO: barracuda.ebox.ca Received: from barracuda.ebox.ca (HELO barracuda.ebox.ca) (96.127.255.19) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 20 Aug 2018 01:30:03 +0000 Received: from smtp.ebox.ca (smtp.electronicbox.net [96.127.255.82]) by barracuda.ebox.ca with ESMTP id oj1ftUi5cCLWA7lH (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 19 Aug 2018 21:29:53 -0400 (EDT) Received: from simark.lan (unknown [192.222.164.54]) by smtp.ebox.ca (Postfix) with ESMTP id 77A0B441D64; Sun, 19 Aug 2018 21:29:53 -0400 (EDT) From: Simon Marchi To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH 2/2] Make read_program_headers_from_bfd return a gdb::byte_vector Date: Mon, 20 Aug 2018 01:30:00 -0000 Message-Id: <20180820012947.10928-2-simon.marchi@polymtl.ca> In-Reply-To: <20180820012947.10928-1-simon.marchi@polymtl.ca> References: <20180820012947.10928-1-simon.marchi@polymtl.ca> X-IsSubscribed: yes X-SW-Source: 2018-08/txt/msg00447.txt.bz2 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/solib-svr4.c | 58 ++++++++++++++++++------------------------------ 1 file changed, 21 insertions(+), 37 deletions(-) diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 79b5322dea4e..38c88b5b00d2 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.18.0