bug-gnu-utils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Binutils 2.10 error


From: Nick Clifton
Subject: Re: Binutils 2.10 error
Date: Tue, 7 Nov 2000 11:33:16 -0800

Hi Josh,

: As you can see nil and test are the EXACT same file, however nil.s
: produces an error.  It seems to be that the gstabs option is unable
: to deal with three letter filenames.  If this is the case than the
: bug should either be fixed, or it should produce a more helpful
: message than local label undefined. 

It is a bug alright.  And it is not just three letter filenames.  It
would have happened with your four letter file name if there had been
a backslash or two in it.  It also happens with one letter or two
letter filenames as well.

Anyway the patch below fixes this problem and I will be checking it
into the CVS repository shortly.  I will also send it to Phillip
Blundell as well, in case there is time to get it into the 2.10.1
release.

Cheers
        Nick

2000-11-07  Nick Clifton  <address@hidden>

        * stabs.c (generate_asm_file): Increase length of xmalloc'ed
        buffer in order to avoid buffer overflows.

Index: gas/stabs.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gas/stabs.c,v
retrieving revision 1.28
diff -p -r1.28 stabs.c
*** stabs.c     2000/10/13 17:32:40     1.28
--- stabs.c     2000/11/07 19:30:15
*************** generate_asm_file (type, file)
*** 497,548 ****
    static char *last_file;
    static int label_count;
    char *hold;
-   char *buf = xmalloc (2 * strlen (file) + 10);
    char sym[30];
! 
    /* Rather than try to do this in some efficient fashion, we just
       generate a string and then parse it again.  That lets us use the
       existing stabs hook, which expect to see a string, rather than
       inventing new ones.  */
- 
    hold = input_line_pointer;
  
!   if (last_file == NULL
!       || strcmp (last_file, file) != 0)
      {
!       char *tmp = file;
!       char *endp = file + strlen(file);
!       char *bufp = buf;
! 
!       sprintf (sym, "%sF%d", FAKE_LABEL_NAME, label_count);
!       ++label_count;
! 
!       *bufp++ = '"';
!       while (tmp < endp)
!         {
!           char *bslash = strchr (tmp, '\\');
!           int len = (bslash ? (bslash - tmp + 1) : strlen (tmp));
!           /* double all backslashes, since demand_copy_C_string (used by
!              s_stab to extract the part in quotes) will try to replace them as
!              escape sequences.  backslash may appear in a filespec.  */
!           strncpy (bufp, tmp, len);
!           tmp += len;
!           bufp += len;
!           if (bslash != NULL)
!             *bufp++ = '\\';
!         }
!       sprintf (bufp, "\",%d,0,0,%s\n", type, sym);
!       input_line_pointer = buf;
!       s_stab ('s');
!       colon (sym);
! 
!       if (last_file != NULL)
!       free (last_file);
!       last_file = xstrdup (file);
      }
  
!   input_line_pointer = hold;
    free (buf);
  }
  
  /* Generate stabs debugging information for the current line.  This is
--- 497,558 ----
    static char *last_file;
    static int label_count;
    char *hold;
    char sym[30];
!   char *buf;
!   char *tmp = file;
!   char *endp = file + strlen (file);
!   char *bufp = buf;
!   
!   if (last_file != NULL
!       && strcmp (last_file, file) == 0)
!     return;
!   
    /* Rather than try to do this in some efficient fashion, we just
       generate a string and then parse it again.  That lets us use the
       existing stabs hook, which expect to see a string, rather than
       inventing new ones.  */
    hold = input_line_pointer;
+ 
+   sprintf (sym, "%sF%d", FAKE_LABEL_NAME, label_count);
+   ++label_count;
  
!   /* Allocate enough space for the file name (possibly extended with
!      doubled up backslashes), the symbol name, and the other characters
!      that make up a stabs file directive.  */
!   bufp = buf = xmalloc (2 * strlen (file) + strlen (sym) + 12);
!   
!   *bufp++ = '"';
! 
!   while (tmp < endp)
      {
!       char *bslash = strchr (tmp, '\\');
!       int len = (bslash ? (bslash - tmp + 1) : strlen (tmp));
!       
!       /* Double all backslashes, since demand_copy_C_string (used by
!        s_stab to extract the part in quotes) will try to replace them as
!        escape sequences.  backslash may appear in a filespec.  */
!       strncpy (bufp, tmp, len);
!       
!       tmp += len;
!       bufp += len;
! 
!       if (bslash != NULL)
!       *bufp++ = '\\';
      }
  
!   sprintf (bufp, "\",%d,0,0,%s\n", type, sym);
! 
!   input_line_pointer = buf;
!   s_stab ('s');
!   colon (sym);
! 
!   if (last_file != NULL)
!     free (last_file);
!   last_file = xstrdup (file);
!   
    free (buf);
+ 
+   input_line_pointer = hold;
  }
  
  /* Generate stabs debugging information for the current line.  This is



reply via email to

[Prev in Thread] Current Thread [Next in Thread]