Skip to content

Commit 2ed1c09

Browse files
author
Greg Clayton
committed
<rdar://problem/12742973>
Forwarding a fix for a crasher in the demangler. llvm-svn: 169136
1 parent 2349531 commit 2ed1c09

File tree

1 file changed

+51
-30
lines changed

1 file changed

+51
-30
lines changed

lldb/source/Core/cxa_demangle.cpp

Lines changed: 51 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,14 @@ void display(__node* x, int indent = 0)
133133
{
134134
for (int i = 0; i < 2*indent; ++i)
135135
printf(" ");
136-
char* buf = (char*)malloc(x->size());
136+
size_t sz = x->size();
137+
char* buf = (char*)calloc(sz+10, 1);
137138
x->get_demangled_name(buf);
138-
printf("%s %s, %p\n", typeid(*x).name(), buf, x);
139+
printf("%s [%ld] %s, %p\n", typeid(*x).name(), sz, buf, x);
140+
if (strlen(buf) != sz)
141+
{
142+
printf("strlen(buf) = %ld and size = %ld\n", strlen(buf), sz);
143+
}
139144
free(buf);
140145
display(x->__left_, indent+1);
141146
display(x->__right_, indent+1);
@@ -3822,10 +3827,14 @@ class __list
38223827
}
38233828
virtual bool ends_with_template(bool parsing = false) const
38243829
{
3825-
if (__right_ != NULL)
3830+
if (__right_ && __right_->size() > 0)
3831+
{
38263832
return __right_->ends_with_template(parsing);
3827-
if (__left_ != NULL)
3833+
}
3834+
else if (__left_ && __left_->size() > 0)
3835+
{
38283836
return __left_->ends_with_template(parsing);
3837+
}
38293838
return false;
38303839
}
38313840
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
@@ -6969,50 +6978,62 @@ __demangle_tree::__parse_unnamed_type_name(const char* first, const char* last)
69696978
{
69706979
case 't':
69716980
case 'l':
6972-
first += 2;
6973-
6981+
{
6982+
const char* t = first + 2;
6983+
__node* params = 0;
69746984
if (type == 'l')
69756985
{
6976-
__root_ = 0;
6977-
if (first[0] == 'v')
6986+
if (*t == 'v')
69786987
{
69796988
// void lambda
6980-
++first;
6981-
if (first[0] == 'E')
6982-
++first;
6989+
++t;
6990+
if (t != last && *t == 'E')
6991+
++t;
69836992
else
69846993
return first;
69856994
}
69866995
else
69876996
{
6988-
while (first[0] && first[0] != 'E')
6997+
const char* t1 = __parse_type(t, last);
6998+
if (t1 == t || !__make<__list>(__root_))
6999+
return first;
7000+
params = __root_;
7001+
__node* prev = params;
7002+
t = t1;
7003+
while (true)
69897004
{
6990-
const char *old = first;
6991-
first = __parse_type(first, last);
6992-
if (first == old)
7005+
t1 = __parse_type(t, last);
7006+
if (t1 == t)
69937007
break;
7008+
if (!__make<__list>(__root_))
7009+
return first;
7010+
t = t1;
7011+
prev->__right_ = __root_;
7012+
__root_->__size_ = prev->__size_ + 1;
7013+
prev = __root_;
69947014
}
6995-
if (first[0] == 'E')
6996-
++first;
6997-
else
7015+
if (t == last || *t != 'E')
69987016
return first;
7017+
++t;
69997018
}
70007019
}
7001-
const char *number_start = first;
7002-
first = __parse_number(first, last);
7003-
const char *number_end = first;
7004-
if (first[0] == '_')
7005-
{
7006-
++first;
7007-
}
7008-
else
7020+
const char* number_start = t;
7021+
const char* number_end = __parse_number(t, last);
7022+
if (number_end == last || *number_end != '_')
70097023
return first;
7010-
7024+
t = number_end + 1;
70117025
if (type == 'l')
7012-
__make<__lambda_node>(__root_, number_start, static_cast<size_t>(number_end - number_start));
7026+
{
7027+
if (!__make<__lambda_node>(params, number_start, static_cast<size_t>(number_end - number_start)))
7028+
return first;
7029+
}
70137030
else
7014-
__make<__unnamed>(number_start, static_cast<size_t>(number_end - number_start));
7015-
7031+
{
7032+
if (!__make<__unnamed>(number_start, static_cast<size_t>(number_end - number_start)))
7033+
return first;
7034+
}
7035+
first = t;
7036+
}
70167037
break;
70177038
}
70187039
}

0 commit comments

Comments
 (0)