diff options
author | pgowda <pgowda.cve@gmail.com> | 2022-07-11 19:54:25 +0530 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2022-07-14 10:08:57 +0100 |
commit | d22eb3c31a244e8dcdeb99fc01702d803d4a3e4b (patch) | |
tree | 951cd080b01499fcf5e0fb5524ea69a5ec197a40 /meta/recipes-devtools/gcc | |
parent | 981b711405a0908274e2e7185d030b3c7301e920 (diff) | |
download | poky-d22eb3c31a244e8dcdeb99fc01702d803d4a3e4b.tar.gz |
gcc: Backport a fix for gcc bug 105039
Backport a fix from:
https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=9234cdca6ee88badfc00297e72f13dac4e540c79
which fixes rust recursion issues in the demangler.
(From OE-Core rev: bd2c8ed2d3ddec21cfcc44b26feee0285e0cd441)
Signed-off-by: pgowda <pgowda.cve@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-devtools/gcc')
-rw-r--r-- | meta/recipes-devtools/gcc/gcc-12.1.inc | 1 | ||||
-rw-r--r-- | meta/recipes-devtools/gcc/gcc/0026-rust-recursion-limit.patch | 92 |
2 files changed, 93 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-12.1.inc b/meta/recipes-devtools/gcc/gcc-12.1.inc index 250b587e78..8c6c4a0305 100644 --- a/meta/recipes-devtools/gcc/gcc-12.1.inc +++ b/meta/recipes-devtools/gcc/gcc-12.1.inc | |||
@@ -63,6 +63,7 @@ SRC_URI = "${BASEURI} \ | |||
63 | file://0023-libatomic-Do-not-enforce-march-on-aarch64.patch \ | 63 | file://0023-libatomic-Do-not-enforce-march-on-aarch64.patch \ |
64 | file://0024-Fix-install-path-of-linux64.h.patch \ | 64 | file://0024-Fix-install-path-of-linux64.h.patch \ |
65 | file://0025-Move-sched.h-include-ahead-of-user-headers.patch \ | 65 | file://0025-Move-sched.h-include-ahead-of-user-headers.patch \ |
66 | file://0026-rust-recursion-limit.patch \ | ||
66 | " | 67 | " |
67 | SRC_URI[sha256sum] = "62fd634889f31c02b64af2c468f064b47ad1ca78411c45abe6ac4b5f8dd19c7b" | 68 | SRC_URI[sha256sum] = "62fd634889f31c02b64af2c468f064b47ad1ca78411c45abe6ac4b5f8dd19c7b" |
68 | 69 | ||
diff --git a/meta/recipes-devtools/gcc/gcc/0026-rust-recursion-limit.patch b/meta/recipes-devtools/gcc/gcc/0026-rust-recursion-limit.patch new file mode 100644 index 0000000000..bbe2f18f6f --- /dev/null +++ b/meta/recipes-devtools/gcc/gcc/0026-rust-recursion-limit.patch | |||
@@ -0,0 +1,92 @@ | |||
1 | From 9234cdca6ee88badfc00297e72f13dac4e540c79 Mon Sep 17 00:00:00 2001 | ||
2 | From: Nick Clifton <nickc@redhat.com> | ||
3 | Date: Fri, 1 Jul 2022 15:58:52 +0100 | ||
4 | Subject: [PATCH] Add a recursion limit to the demangle_const function in the | ||
5 | Rust demangler. | ||
6 | |||
7 | libiberty/ | ||
8 | PR demangler/105039 | ||
9 | * rust-demangle.c (demangle_const): Add recursion limit. | ||
10 | |||
11 | Upstream-Status: Backport [https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=9234cdca6ee88badfc00297e72f13dac4e540c79] | ||
12 | --- | ||
13 | libiberty/rust-demangle.c | 29 ++++++++++++++++++++--------- | ||
14 | 1 file changed, 20 insertions(+), 9 deletions(-) | ||
15 | |||
16 | diff --git a/libiberty/rust-demangle.c b/libiberty/rust-demangle.c | ||
17 | index bb58d900e27..36afcfae278 100644 | ||
18 | --- a/libiberty/rust-demangle.c | ||
19 | +++ b/libiberty/rust-demangle.c | ||
20 | @@ -126,7 +126,7 @@ parse_integer_62 (struct rust_demangler *rdm) | ||
21 | return 0; | ||
22 | |||
23 | x = 0; | ||
24 | - while (!eat (rdm, '_')) | ||
25 | + while (!eat (rdm, '_') && !rdm->errored) | ||
26 | { | ||
27 | c = next (rdm); | ||
28 | x *= 62; | ||
29 | @@ -1148,6 +1148,15 @@ demangle_const (struct rust_demangler *rdm) | ||
30 | if (rdm->errored) | ||
31 | return; | ||
32 | |||
33 | + if (rdm->recursion != RUST_NO_RECURSION_LIMIT) | ||
34 | + { | ||
35 | + ++ rdm->recursion; | ||
36 | + if (rdm->recursion > RUST_MAX_RECURSION_COUNT) | ||
37 | + /* FIXME: There ought to be a way to report | ||
38 | + that the recursion limit has been reached. */ | ||
39 | + goto fail_return; | ||
40 | + } | ||
41 | + | ||
42 | if (eat (rdm, 'B')) | ||
43 | { | ||
44 | backref = parse_integer_62 (rdm); | ||
45 | @@ -1158,7 +1167,7 @@ demangle_const (struct rust_demangler *rdm) | ||
46 | demangle_const (rdm); | ||
47 | rdm->next = old_next; | ||
48 | } | ||
49 | - return; | ||
50 | + goto pass_return; | ||
51 | } | ||
52 | |||
53 | ty_tag = next (rdm); | ||
54 | @@ -1167,7 +1176,7 @@ demangle_const (struct rust_demangler *rdm) | ||
55 | /* Placeholder. */ | ||
56 | case 'p': | ||
57 | PRINT ("_"); | ||
58 | - return; | ||
59 | + goto pass_return; | ||
60 | |||
61 | /* Unsigned integer types. */ | ||
62 | case 'h': | ||
63 | @@ -1200,18 +1209,20 @@ demangle_const (struct rust_demangler *rdm) | ||
64 | break; | ||
65 | |||
66 | default: | ||
67 | - rdm->errored = 1; | ||
68 | - return; | ||
69 | + goto fail_return; | ||
70 | } | ||
71 | |||
72 | - if (rdm->errored) | ||
73 | - return; | ||
74 | - | ||
75 | - if (rdm->verbose) | ||
76 | + if (!rdm->errored && rdm->verbose) | ||
77 | { | ||
78 | PRINT (": "); | ||
79 | PRINT (basic_type (ty_tag)); | ||
80 | } | ||
81 | + | ||
82 | + fail_return: | ||
83 | + rdm->errored = 1; | ||
84 | + pass_return: | ||
85 | + if (rdm->recursion != RUST_NO_RECURSION_LIMIT) | ||
86 | + -- rdm->recursion; | ||
87 | } | ||
88 | |||
89 | static void | ||
90 | -- | ||
91 | 2.31.1 | ||
92 | |||