On Thu, Feb 26, 2026 at 11:15 AM Ruslan Valiyev <[email protected]> wrote:
>
> demangle_binder() parses the bound_lifetimes count as a base-62
> integer with no upper bound.  A crafted symbol can encode a huge
> lifetime count in very few bytes, causing OOM or CPU hang.
>
> Cap bound_lifetimes at 1024 and check rdm->errored in the loop
> so it bails out early on errors during iteration.

Pushed: https://gcc.gnu.org/pipermail/gcc-cvs/2026-February/450224.html

Thanks again for the patch.

Thanks,
Andrew

>
> libiberty/ChangeLog:
>
>         PR demangler/106641
>         * rust-demangle.c (demangle_binder): Reject bound_lifetimes
>         above 1024 to prevent resource exhaustion from crafted symbols.
>         Add rdm->errored check in the loop condition.
>         * testsuite/rust-demangle-expected: Add regression test.
>
> Signed-off-by: Ruslan Valiyev <[email protected]>
> ---
>  libiberty/rust-demangle.c                  | 9 ++++++++-
>  libiberty/testsuite/rust-demangle-expected | 6 ++++++
>  2 files changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/libiberty/rust-demangle.c b/libiberty/rust-demangle.c
> index 19070999654..013f14eebac 100644
> --- a/libiberty/rust-demangle.c
> +++ b/libiberty/rust-demangle.c
> @@ -651,10 +651,17 @@ demangle_binder (struct rust_demangler *rdm)
>      return;
>
>    bound_lifetimes = parse_opt_integer_62 (rdm, 'G');
> +  /* Reject implausibly large lifetime counts to prevent
> +     resource exhaustion from crafted symbols (PR demangler/106641).  */
> +  if (bound_lifetimes > 1024)
> +    {
> +      rdm->errored = 1;
> +      return;
> +    }
>    if (bound_lifetimes > 0)
>      {
>        PRINT ("for<");
> -      for (i = 0; i < bound_lifetimes; i++)
> +      for (i = 0; i < bound_lifetimes && !rdm->errored; i++)
>          {
>            if (i > 0)
>              PRINT (", ");
> diff --git a/libiberty/testsuite/rust-demangle-expected 
> b/libiberty/testsuite/rust-demangle-expected
> index b565084cfef..acadf7c9b83 100644
> --- a/libiberty/testsuite/rust-demangle-expected
> +++ b/libiberty/testsuite/rust-demangle-expected
> @@ -321,3 +321,9 @@ foo
>  --format=rust
>  _RNvC9backtrace3foo.llvm.A5310EB9
>  backtrace::foo
> +#
> +# PR demangler/106641: crafted symbol with huge lifetime count
> +# should not cause resource exhaustion.
> +--format=rust
> +_RINvC4te_C4tokpppppppppppFFFFFFGFpppppppppKj2_FFFFFFFFFFFFFE
> +_RINvC4te_C4tokpppppppppppFFFFFFGFpppppppppKj2_FFFFFFFFFFFFFE
> --
> 2.43.0
>

Reply via email to