1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- From 9234cdca6ee88badfc00297e72f13dac4e540c79 Mon Sep 17 00:00:00 2001
- From: Nick Clifton <nickc@redhat.com>
- Date: Fri, 1 Jul 2022 15:58:52 +0100
- Subject: [PATCH] Add a recursion limit to the demangle_const function in the
- Rust demangler.
- libiberty/
- PR demangler/105039
- * rust-demangle.c (demangle_const): Add recursion limit.
- Upstream-Status: Backport [https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=9234cdca6ee88badfc00297e72f13dac4e540c79]
- ---
- libiberty/rust-demangle.c | 29 ++++++++++++++++++++---------
- 1 file changed, 20 insertions(+), 9 deletions(-)
- diff --git a/libiberty/rust-demangle.c b/libiberty/rust-demangle.c
- index bb58d900e27..36afcfae278 100644
- --- a/libiberty/rust-demangle.c
- +++ b/libiberty/rust-demangle.c
- @@ -126,7 +126,7 @@ parse_integer_62 (struct rust_demangler *rdm)
- return 0;
-
- x = 0;
- - while (!eat (rdm, '_'))
- + while (!eat (rdm, '_') && !rdm->errored)
- {
- c = next (rdm);
- x *= 62;
- @@ -1148,6 +1148,15 @@ demangle_const (struct rust_demangler *rdm)
- if (rdm->errored)
- return;
-
- + if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
- + {
- + ++ rdm->recursion;
- + if (rdm->recursion > RUST_MAX_RECURSION_COUNT)
- + /* FIXME: There ought to be a way to report
- + that the recursion limit has been reached. */
- + goto fail_return;
- + }
- +
- if (eat (rdm, 'B'))
- {
- backref = parse_integer_62 (rdm);
- @@ -1158,7 +1167,7 @@ demangle_const (struct rust_demangler *rdm)
- demangle_const (rdm);
- rdm->next = old_next;
- }
- - return;
- + goto pass_return;
- }
-
- ty_tag = next (rdm);
- @@ -1167,7 +1176,7 @@ demangle_const (struct rust_demangler *rdm)
- /* Placeholder. */
- case 'p':
- PRINT ("_");
- - return;
- + goto pass_return;
-
- /* Unsigned integer types. */
- case 'h':
- @@ -1200,18 +1209,20 @@ demangle_const (struct rust_demangler *rdm)
- break;
-
- default:
- - rdm->errored = 1;
- - return;
- + goto fail_return;
- }
-
- - if (rdm->errored)
- - return;
- -
- - if (rdm->verbose)
- + if (!rdm->errored && rdm->verbose)
- {
- PRINT (": ");
- PRINT (basic_type (ty_tag));
- }
- +
- + fail_return:
- + rdm->errored = 1;
- + pass_return:
- + if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
- + -- rdm->recursion;
- }
-
- static void
- --
- 2.31.1
|