diff options
-rw-r--r-- | libcxxabi/src/cxa_demangle.cpp | 12 | ||||
-rw-r--r-- | libcxxabi/test/test_demangle.pass.cpp | 3 |
2 files changed, 4 insertions, 11 deletions
diff --git a/libcxxabi/src/cxa_demangle.cpp b/libcxxabi/src/cxa_demangle.cpp index ed43cb2c915..402ee0c032a 100644 --- a/libcxxabi/src/cxa_demangle.cpp +++ b/libcxxabi/src/cxa_demangle.cpp @@ -4979,22 +4979,12 @@ __cxa_demangle(const char *mangled_name, char *buf, size_t *n, int *status) { return nullptr; } - size_t len = std::strlen(mangled_name); - if (len < 2 || strncmp(mangled_name, "_Z", 2)) - { - if (len < 4 || strncmp(mangled_name, "___Z", 4)) - { - if (status) - *status = invalid_mangled_name; - return nullptr; - } - } - size_t internal_size = buf != nullptr ? *n : 0; arena<bs> a; Db db(a); db.template_param.emplace_back(a); int internal_status = success; + size_t len = std::strlen(mangled_name); demangle(mangled_name, mangled_name + len, db, internal_status); if (internal_status == success && db.fix_forward_references && diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp index af16b561eb5..effe5c030e1 100644 --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/test/test_demangle.pass.cpp @@ -29594,6 +29594,9 @@ const char* cases[][2] = // NOTE: disable this test since it is a negative test case, you cannot demangle a non-mangled symbol // {"\x6D", nullptr}, // This use to crash with ASAN {"_ZTIU4_farrVKPi", "typeinfo for int* const volatile restrict _far"}, + + // mangled names can include type manglings too, which don't start with _Z: + {"i", "int"}, }; const unsigned N = sizeof(cases) / sizeof(cases[0]); |