[Top][All Lists]
[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