Use rust_demangle to fix a crash

PR rust/30211 points out a crash caused by a particular completion.
This turns out to happen because a Rust minsym winds up in a
C++-specific path in strncmp_iw_with_mode, which ultimately causes the
completer to pass invalid arguments to string::append.

This patch fixes the bug by reordering the language constants so that
Rust comes before C++, and then using rust_demangle.  This ensures
that minsyms are correctly marked as "Rust", avoiding this code and
thus the crash.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=20367
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30211
Reviewed-By: Andrew Burgess <aburgess@redhat.com>
This commit is contained in:
Tom Tromey 2023-03-19 09:13:10 -06:00
parent 0fea10f327
commit 6e7eef7216
3 changed files with 8 additions and 6 deletions

View file

@ -204,9 +204,8 @@ extern void quit_serial_event_clear (void);
these languages, so some symbols could be successfully demangled by these languages, so some symbols could be successfully demangled by
several languages. For that reason, the constants here are sorted several languages. For that reason, the constants here are sorted
in the order we'll attempt demangling them. For example: Rust uses in the order we'll attempt demangling them. For example: Rust uses
C++ mangling, so must come after C++; Ada must come last (see a C++-compatible mangling, so must come before C++; Ada must come
ada_sniff_from_mangled_name). (Keep this order in sync with the last (see ada_sniff_from_mangled_name). */
'languages' array in language.c.) */
enum language enum language
{ {
@ -214,6 +213,7 @@ enum language
language_auto, /* Placeholder for automatic setting */ language_auto, /* Placeholder for automatic setting */
language_c, /* C */ language_c, /* C */
language_objc, /* Objective-C */ language_objc, /* Objective-C */
language_rust, /* Rust */
language_cplus, /* C++ */ language_cplus, /* C++ */
language_d, /* D */ language_d, /* D */
language_go, /* Go */ language_go, /* Go */
@ -222,7 +222,6 @@ enum language
language_asm, /* Assembly language */ language_asm, /* Assembly language */
language_pascal, /* Pascal */ language_pascal, /* Pascal */
language_opencl, /* OpenCL */ language_opencl, /* OpenCL */
language_rust, /* Rust */
language_minimal, /* All other languages, minimal support only */ language_minimal, /* All other languages, minimal support only */
language_ada, /* Ada */ language_ada, /* Ada */
nr_languages nr_languages

View file

@ -93,7 +93,7 @@ public:
(const char *mangled, gdb::unique_xmalloc_ptr<char> *demangled) (const char *mangled, gdb::unique_xmalloc_ptr<char> *demangled)
const override const override
{ {
*demangled = gdb_demangle (mangled, DMGL_PARAMS | DMGL_ANSI); demangled->reset (rust_demangle (mangled, 0));
return *demangled != NULL; return *demangled != NULL;
} }
@ -102,7 +102,7 @@ public:
gdb::unique_xmalloc_ptr<char> demangle_symbol (const char *mangled, gdb::unique_xmalloc_ptr<char> demangle_symbol (const char *mangled,
int options) const override int options) const override
{ {
return gdb_demangle (mangled, options); return gdb::unique_xmalloc_ptr<char> (rust_demangle (mangled, options));
} }
/* See language.h. */ /* See language.h. */

View file

@ -59,3 +59,6 @@ gdb_test "print *self" " = 23"
gdb_test "info functions HasMethods::new" \ gdb_test "info functions HasMethods::new" \
"fn methods::HasMethods::new\\(\\) -> methods::HasMethods;" "fn methods::HasMethods::new\\(\\) -> methods::HasMethods;"
# Regression test for PR rust/20367 and PR rust/30211. This used to
# crash.
gdb_test_no_output "complete break what"