summaryrefslogtreecommitdiff
path: root/libiberty
diff options
context:
space:
mode:
authorjimb <jimb@138bc75d-0d04-0410-961f-82ee72b054a4>1999-04-20 11:00:27 +0000
committerjimb <jimb@138bc75d-0d04-0410-961f-82ee72b054a4>1999-04-20 11:00:27 +0000
commit0f08678d51cd32812341eabf2608827de9f4687b (patch)
treecf246382e124c581afa4e2ac223308416eb5459e /libiberty
parent9404c470dba6042b342bf27461371f4715653aa6 (diff)
downloadgcc-0f08678d51cd32812341eabf2608827de9f4687b.tar.gz
Fix from Dale Hawkins:
* cplus-dem.c (mop_up): Set typevec_size to zero, so it'll be reallocated properly if we use it again. * cplus-dem.c (demangle_fund_type): Check for buffer overrun. Be stricter about syntax. Always null-terminate string. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@26562 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libiberty')
-rw-r--r--libiberty/cplus-dem.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/libiberty/cplus-dem.c b/libiberty/cplus-dem.c
index a48492240d9..e834d2a6a9c 100644
--- a/libiberty/cplus-dem.c
+++ b/libiberty/cplus-dem.c
@@ -880,6 +880,7 @@ mop_up (work, declp, success)
{
free ((char *) work -> typevec);
work -> typevec = NULL;
+ work -> typevec_size = 0;
}
if (work->tmpl_argvec)
{
@@ -3377,14 +3378,22 @@ demangle_fund_type (work, mangled, result)
{
int i;
++(*mangled);
- for (i = 0; **mangled && **mangled != '_'; ++(*mangled), ++i)
+ for (i = 0;
+ (i < sizeof (buf) - 1 && **mangled && **mangled != '_');
+ ++(*mangled), ++i)
buf[i] = **mangled;
+ if (**mangled != '_')
+ {
+ success = 0;
+ break;
+ }
buf[i] = '\0';
++(*mangled);
}
else
{
strncpy (buf, *mangled, 2);
+ buf[2] = '\0';
*mangled += 2;
}
sscanf (buf, "%x", &dec);