Skip to content

Commit

Permalink
[dlang] Fix buffer stomping behaviour of dlang_parse_real
Browse files Browse the repository at this point in the history
  • Loading branch information
ibuclaw committed Apr 16, 2017
1 parent 507bf91 commit 959b9c8
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 17 deletions.
25 changes: 8 additions & 17 deletions libiberty/d-demangle.c
Original file line number Diff line number Diff line change
Expand Up @@ -1026,9 +1026,6 @@ dlang_parse_integer (string *decl, const char *mangled, char type)
static const char *
dlang_parse_real (string *decl, const char *mangled)
{
char buffer[64];
int len = 0;

/* Handle NAN and +-INF. */
if (strncmp (mangled, "NAN", 3) == 0)
{
Expand All @@ -1052,50 +1049,44 @@ dlang_parse_real (string *decl, const char *mangled)
/* Hexadecimal prefix and leading bit. */
if (*mangled == 'N')
{
buffer[len++] = '-';
string_append (decl, "-");
mangled++;
}

if (!ISXDIGIT (*mangled))
return NULL;

buffer[len++] = '0';
buffer[len++] = 'x';
buffer[len++] = *mangled;
buffer[len++] = '.';
string_append (decl, "0x");
string_appendn (decl, mangled, 1);
string_append (decl, ".");
mangled++;

/* Significand. */
while (ISXDIGIT (*mangled))
{
buffer[len++] = *mangled;
string_appendn (decl, mangled, 1);
mangled++;
}

/* Exponent. */
if (*mangled != 'P')
return NULL;

buffer[len++] = 'p';
string_append (decl, "p");
mangled++;

if (*mangled == 'N')
{
buffer[len++] = '-';
string_append (decl, "-");
mangled++;
}

while (ISDIGIT (*mangled))
{
buffer[len++] = *mangled;
string_appendn (decl, mangled, 1);
mangled++;
}

/* Write out the demangled hexadecimal, rather than trying to
convert the buffer into a floating-point value. */
buffer[len] = '\0';
len = strlen (buffer);
string_appendn (decl, buffer, len);
return mangled;
}

Expand Down
4 changes: 4 additions & 0 deletions libiberty/testsuite/d-demangle-expected
Original file line number Diff line number Diff line change
Expand Up @@ -838,6 +838,10 @@ _D8demangle52__T4testVrcN0C4CCCCCCCCCCCCCDP4c0B666666666666666P6Zv
demangle.test!(-0x0.C4CCCCCCCCCCCCCDp4+0x0.B666666666666666p6i)
#
--format=dlang
_D8demangle91__T4testVde000111222333444555666777888999AAABBBCCCDDDEEEFFFP000111222333444555666777888999Zv
demangle.test!(0x0.00111222333444555666777888999AAABBBCCCDDDEEEFFFp000111222333444555666777888999)
#
--format=dlang
_D8demangle22__T4testVG3ua3_616263Zv
demangle.test!("abc")
#
Expand Down

0 comments on commit 959b9c8

Please sign in to comment.