This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
RE: [RFC-v5] Fix .text section offset for windows DLL (was Calling __stdcall functions in the inferior)
- From: "Pierre Muller" <pierre dot muller at ics-cnrs dot unistra dot fr>
- To: "'Pedro Alves'" <palves at redhat dot com>
- Cc: "'GDB Patches'" <gdb-patches at sourceware dot org>
- Date: Thu, 13 Dec 2012 17:54:47 +0100
- Subject: RE: [RFC-v5] Fix .text section offset for windows DLL (was Calling __stdcall functions in the inferior)
- References: <20121024194517.GK3555@adacore.com> <20121105171121.GA2972@adacore.com> <50991f5f.8382440a.1100.ffff82abSMTPIN_ADDED@mx.google.com> <509ABA17.30507@redhat.com> <000301cdbd96$f5cd9f10$e168dd30$@muller@ics-cnrs.unistra.fr> <20121122173019.GF9964@adacore.com> <15690.5992342674$1353883881@news.gmane.org> <87624si9ur.fsf@fleche.redhat.com> <001501cdccaf$ad85e9b0$0891bd10$@muller@ics-cnrs.unistra.fr> <20121207071035.GG31477@adacore.com> <50C20A66.70002@gmail.com> <29545.4593528577$1354894901@news.gmane.org> <50C21696.7040006@gmail.com> <50c21914.a750420a.2ec3.ffffe4ffSMTPIN_ADDED_BROKEN@mx.google.com> <50C222D5.4000802@redhat.com> <50C22C20.8090906@redhat.com> <008101cdd920$907e7580$b17b6080$@muller@ics-cnrs.unistra.fr> <50C9B6E0.1050709@redhat.com> <00a201cdd931$b0ee13f0$12ca3bd0$@muller@ics-cnrs.unistra.fr> <50C9E742.1030207@redhat.com> <001201cdd941$f9d83450$ed889cf0$@muller@ics-cnrs.unistra.fr> <50C9EE3A.20601@redhat.com> <50CA0582.5070107@redhat.com>
> -----Message d'origine-----
> De : gdb-patches-owner@sourceware.org [mailto:gdb-patches-
> owner@sourceware.org] De la part de Pedro Alves
> Envoyà : jeudi 13 dÃcembre 2012 17:43
> Ã : Pedro Alves
> Cc : Pierre Muller; 'GDB Patches'
> Objet : Re: [RFC-v5] Fix .text section offset for windows DLL (was Calling
> __stdcall functions in the inferior)
>
> Oh, the problem was really there, but I got confused pointing
> at where it is :-). It's in pe_text_section_offset itself:
>
> /* Get the rva and size of the export section. */
> for (i = 0; i < nsections; i++)
> {
> char sname[8];
> unsigned long secptr1 = secptr + 40 * i;
> unsigned long vaddr = pe_get32 (abfd, secptr1 + 12);
>
> bfd_seek (abfd, (file_ptr) secptr1, SEEK_SET);
> bfd_bread (sname, (bfd_size_type) 8, abfd);
> if (strcmp (sname, ".text") == 0)
> return vaddr;
> }
>
> So sname should be 9 bytes, and be null terminated after the bfd_bread here
> too.
You are right once more...
Strange, because I really thought I copied it from the other
function...
> Want to give it a go?
OK, we were probably lucky because
most DLL's have their .text section as first section, so that we never get to
8 char long names...
ChangeLog entry:
2012-12-13 Pierre Muller <muller@sourceware.org>
* coff-pe-read.c (pe_text_section_offset): Increase size of sname
local variable and zero terminate it to avoid possible problems
in strcmp.
Index: coff-pe-read.c
===================================================================
RCS file: /cvs/src/src/gdb/coff-pe-read.c,v
retrieving revision 1.21
diff -u -r1.21 coff-pe-read.c
--- coff-pe-read.c 13 Dec 2012 15:11:36 -0000 1.21
+++ coff-pe-read.c 13 Dec 2012 16:49:13 -0000
@@ -672,12 +672,13 @@ pe_text_section_offset (struct bfd *abfd
/* Get the rva and size of the export section. */
for (i = 0; i < nsections; i++)
{
- char sname[8];
+ char sname[SCNNMLEN + 1];
unsigned long secptr1 = secptr + 40 * i;
unsigned long vaddr = pe_get32 (abfd, secptr1 + 12);
bfd_seek (abfd, (file_ptr) secptr1, SEEK_SET);
- bfd_bread (sname, (bfd_size_type) 8, abfd);
+ bfd_bread (sname, (bfd_size_type) SCNNMLEN, abfd);
+ sname[SCNNMLEN] = '\0';
if (strcmp (sname, ".text") == 0)
return vaddr;
}