From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18984 invoked by alias); 13 Sep 2003 17:53:34 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 18976 invoked from network); 13 Sep 2003 17:53:33 -0000 Received: from unknown (HELO zenia.home) (12.223.225.216) by sources.redhat.com with SMTP; 13 Sep 2003 17:53:33 -0000 Received: by zenia.home (Postfix, from userid 5433) id 1E38520758; Sat, 13 Sep 2003 12:51:30 -0500 (EST) To: Kevin Buettner Cc: gdb-patches@sources.redhat.com Subject: Re: [RFA] dwarf2read.c: Add complaint for out of bounds DW_AT_ranges attribute References: <1030910212021.ZM18957@localhost.localdomain> From: Jim Blandy Date: Sat, 13 Sep 2003 17:53:00 -0000 In-Reply-To: <1030910212021.ZM18957@localhost.localdomain> Message-ID: User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.3 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2003-09/txt/msg00293.txt.bz2 Looks good. Kevin Buettner writes: > This one's almost obvious... > > GDB for the FR-V target was segfaulting when issued the "maint > check-symtabs" command. Clearly this is an indication that something > is wrong with the toolchain elsewhere, but GDB should not segfault > when it encounters bad debug info. > > Okay? > > * dwarf2read.c (dwarf2_get_pc_bounds): Complain if offset > associated with DW_AT_ranges attribute is out of bounds. > > Index: dwarf2read.c > =================================================================== > RCS file: /cvs/src/src/gdb/dwarf2read.c,v > retrieving revision 1.101 > diff -u -p -r1.101 dwarf2read.c > --- dwarf2read.c 9 Sep 2003 23:23:05 -0000 1.101 > +++ dwarf2read.c 10 Sep 2003 21:11:27 -0000 > @@ -2253,7 +2253,7 @@ dwarf2_get_pc_bounds (struct die_info *d > unsigned int addr_size = cu_header->addr_size; > CORE_ADDR mask = ~(~(CORE_ADDR)1 << (addr_size * 8 - 1)); > /* Value of the DW_AT_ranges attribute is the offset in the > - .debug_renges section. */ > + .debug_ranges section. */ > unsigned int offset = DW_UNSND (attr); > /* Base address selection entry. */ > CORE_ADDR base; > @@ -2266,6 +2266,14 @@ dwarf2_get_pc_bounds (struct die_info *d > > found_base = cu_header->base_known; > base = cu_header->base_address; > + > + if (offset >= dwarf_ranges_size) > + { > + complaint (&symfile_complaints, > + "Offset %d out of bounds for DW_AT_ranges attribute", > + offset); > + return 0; > + } > buffer = dwarf_ranges_buffer + offset; > > /* Read in the largest possible address. */