From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10598 invoked by alias); 28 Jul 2009 15:16:46 -0000 Received: (qmail 10542 invoked by uid 22791); 28 Jul 2009 15:16:45 -0000 X-SWARE-Spam-Status: No, hits=-2.5 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from qnxmail.qnx.com (HELO qnxmail.qnx.com) (209.226.137.76) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 28 Jul 2009 15:16:39 +0000 Received: from Nebula.ott.qnx.com (nebula.ott.qnx.com [10.42.3.30]) by hub.ott.qnx.com (8.9.3/8.9.3) with ESMTP id LAA10402; Tue, 28 Jul 2009 11:16:32 -0400 Received: from [127.0.0.1] ([10.42.161.192]) by Nebula.ott.qnx.com with Microsoft SMTPSVC(6.0.3790.3959); Tue, 28 Jul 2009 11:16:37 -0400 Message-ID: <4A6F1647.70907@qnx.com> Date: Tue, 28 Jul 2009 16:37:00 -0000 From: Aleksandar Ristovski User-Agent: Thunderbird 2.0.0.22 (Windows/20090605) MIME-Version: 1.0 To: Pedro Alves CC: gdb-patches@sourceware.org Subject: Re: [patch] Set bfd field in target_section References: <200907281534.41605.pedro@codesourcery.com> <4A6F0F05.1060705@qnx.com> <200907281606.05571.pedro@codesourcery.com> In-Reply-To: <200907281606.05571.pedro@codesourcery.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-IsSubscribed: yes 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 X-SW-Source: 2009-07/txt/msg00683.txt.bz2 Pedro Alves wrote: > On Tuesday 28 July 2009 15:45:25, Aleksandar Ristovski wrote: >> Pedro Alves wrote: >>> On Tuesday 28 July 2009 15:28:33, Aleksandar Ristovski wrote: >>>> Hello, >>>> >>>> I believe this is related to Pedro's patch from 03-Jun-09. I >>>> didn't see where we set target_section.bfd field - maybe I >>>> am overlooking something, but in bfd-target, in function >>>> target_bfd_xclose we will call bfd_close >>>> (table->sections->bfd); bfd_close doesn't like NULL argument. >>>> >>>> Am I missing something, or is this (the patch) missing? >>> Doesn't add_to_section_table set the bfd in each new >>> target section? >> Indeed it does. However, the problem is if we don't find any >> sections in a bfd, it will exit and will leave bfd field 0. > > Right, but table->sections will be equal to table->sections_end, > meaning the table is empty. Your fix isn't correct, since you > should never write to *sections_end, which is one-past-the-end > of the sections in the table. In the degenerate case of > bfd_count_sections == 0 (not 0 ALLOC sections), xmalloc will > still return something non-NULL, but, writing to this pointer > invokes undefined behaviour. > >> I get this situation at the moment because I broke my >> xfer_partial, but I think it could happen in general? > > Testing finished succesfully, so I've applied the patch > with this ChangeLog entry. Let me know if something is still wrong. > > 2009-07-28 Pedro Alves > > * bfd-target.c (target_bfd_xclose): Only close the bfd if the > section table is not empty. > (target_bfd_reopen): If the section table ends up empty, close the > bfd here. > I think now you broke it in a different way. Now we can end up trying to read from a closed bfd. And just wondering, why not simply: Index: gdb/exec.c =================================================================== RCS file: /cvs/src/src/gdb/exec.c,v retrieving revision 1.90 diff -u -p -r1.90 exec.c --- gdb/exec.c 2 Jul 2009 17:21:06 -0000 1.90 +++ gdb/exec.c 28 Jul 2009 14:58:16 -0000 @@ -381,6 +381,7 @@ add_to_section_table (bfd *abfd, struct struct target_section **table_pp = (struct target_section **) table_pp_char; flagword aflag; + (*table_pp)->bfd = abfd; /* Check the section flags, but do not discard zero-length sections, since some symbols may still be attached to this section. For instance, we encountered on sparc-solaris 2.10 a shared library with an empty .bss @@ -390,7 +391,6 @@ add_to_section_table (bfd *abfd, struct if (!(aflag & SEC_ALLOC)) return; - (*table_pp)->bfd = abfd; (*table_pp)->the_bfd_section = asect; (*table_pp)->addr = bfd_section_vma (abfd, asect); (*table_pp)->endaddr = (*table_pp)->addr + bfd_section_size (abfd, asect); -- Aleksandar Ristovski QNX Software Systems