diff --git a/crates/native-c/src/demangle.c b/crates/native-c/src/demangle.c index bb36fe4..e4eb399 100644 --- a/crates/native-c/src/demangle.c +++ b/crates/native-c/src/demangle.c @@ -1,6 +1,8 @@ // Code for demangling Rust symbols. This code is mostly // a line-by-line translation of the Rust code in `rustc-demangle`. +// you can find the latest version of this code in https://github.com/rust-lang/rustc-demangle + #include #include #include @@ -1707,10 +1709,8 @@ NODISCARD static demangle_status rust_demangle_legacy_demangle(const char *s, si if (chars_len == 0) { return DemangleInvalid; } - char c = *chars++; - chars_len--; - - while (c != 'E') { + char c; + while ((c = *chars) != 'E') { // Decode an identifier element's length if (c < '0' || c > '9') { return DemangleInvalid; @@ -1726,25 +1726,25 @@ NODISCARD static demangle_status rust_demangle_legacy_demangle(const char *s, si return DemangleInvalid; } len += d; + + chars++; + chars_len--; if (chars_len == 0) { return DemangleInvalid; } - c = *chars++; - chars_len--; + c = *chars; } // Advance by the length - for (size_t i = 0; i < len; i++) { - if (chars_len == 0) { - return DemangleInvalid; - } - c = *chars++; - chars_len--; + if (chars_len <= len) { + return DemangleInvalid; } + chars += len; + chars_len -= len; elements++; } *res = (struct demangle_legacy) { inner, inner_len, elements }; - *rest = chars; + *rest = chars + 1; return DemangleOk; }