blob: e13a996209f6ac778897ac9318782f987216df28 [file] [log] [blame]
Patrick Williams2194f502022-10-16 14:26:09 -05001From 9234cdca6ee88badfc00297e72f13dac4e540c79 Mon Sep 17 00:00:00 2001
2From: Nick Clifton <nickc@redhat.com>
3Date: Fri, 1 Jul 2022 15:58:52 +0100
4Subject: [PATCH] Add a recursion limit to the demangle_const function in the
5 Rust demangler.
6
7libiberty/
8 PR demangler/105039
9 * rust-demangle.c (demangle_const): Add recursion limit.
10
11Upstream-Status: Backport [https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=9234cdca6ee88badfc00297e72f13dac4e540c79]
Andrew Geissler9347dd42023-03-03 12:38:41 -060012Signed-off-by: Sumit Garg <sumit.garg@linaro.org>
Patrick Williams2194f502022-10-16 14:26:09 -050013---
14 libiberty/rust-demangle.c | 29 ++++++++++++++++++++---------
15 1 file changed, 20 insertions(+), 9 deletions(-)
16
17diff --git a/libiberty/rust-demangle.c b/libiberty/rust-demangle.c
18index bb58d900e27..36afcfae278 100644
19--- a/libiberty/rust-demangle.c
20+++ b/libiberty/rust-demangle.c
21@@ -126,7 +126,7 @@ parse_integer_62 (struct rust_demangler *rdm)
22 return 0;
23
24 x = 0;
25- while (!eat (rdm, '_'))
26+ while (!eat (rdm, '_') && !rdm->errored)
27 {
28 c = next (rdm);
29 x *= 62;
30@@ -1148,6 +1148,15 @@ demangle_const (struct rust_demangler *rdm)
31 if (rdm->errored)
32 return;
33
34+ if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
35+ {
36+ ++ rdm->recursion;
37+ if (rdm->recursion > RUST_MAX_RECURSION_COUNT)
38+ /* FIXME: There ought to be a way to report
39+ that the recursion limit has been reached. */
40+ goto fail_return;
41+ }
42+
43 if (eat (rdm, 'B'))
44 {
45 backref = parse_integer_62 (rdm);
46@@ -1158,7 +1167,7 @@ demangle_const (struct rust_demangler *rdm)
47 demangle_const (rdm);
48 rdm->next = old_next;
49 }
50- return;
51+ goto pass_return;
52 }
53
54 ty_tag = next (rdm);
55@@ -1167,7 +1176,7 @@ demangle_const (struct rust_demangler *rdm)
56 /* Placeholder. */
57 case 'p':
58 PRINT ("_");
59- return;
60+ goto pass_return;
61
62 /* Unsigned integer types. */
63 case 'h':
64@@ -1200,18 +1209,20 @@ demangle_const (struct rust_demangler *rdm)
65 break;
66
67 default:
68- rdm->errored = 1;
69- return;
70+ goto fail_return;
71 }
72
73- if (rdm->errored)
74- return;
75-
76- if (rdm->verbose)
77+ if (!rdm->errored && rdm->verbose)
78 {
79 PRINT (": ");
80 PRINT (basic_type (ty_tag));
81 }
82+
83+ fail_return:
84+ rdm->errored = 1;
85+ pass_return:
86+ if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
87+ -- rdm->recursion;
88 }
89
90 static void
91--
922.31.1
93