5379: Guard against infinite macro expansions r=matklad a=matklad

closes #4463



bors r+
🤖

Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2020-07-14 16:32:43 +00:00 committed by GitHub
commit a50c64a4f1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 0 deletions

View File

@ -717,6 +717,11 @@ fn collect_macro_expansion(
macro_call_id: MacroCallId, macro_call_id: MacroCallId,
depth: usize, depth: usize,
) { ) {
if depth > 100 {
mark::hit!(macro_expansion_overflow);
log::warn!("macro expansion is too deep");
return;
}
let file_id: HirFileId = macro_call_id.as_file(); let file_id: HirFileId = macro_call_id.as_file();
let item_tree = self.db.item_tree(file_id); let item_tree = self.db.item_tree(file_id);
let mod_dir = self.mod_dirs[&module_id].clone(); let mod_dir = self.mod_dirs[&module_id].clone();

View File

@ -660,3 +660,27 @@ fn expand_multiple_derive() {
); );
assert_eq!(map.modules[map.root].scope.impls().len(), 2); assert_eq!(map.modules[map.root].scope.impls().len(), 2);
} }
#[test]
fn macro_expansion_overflow() {
mark::check!(macro_expansion_overflow);
compute_crate_def_map(
"
macro_rules! a {
($e:expr; $($t:tt)*) => {
b!($($t)*);
};
() => {};
}
macro_rules! b {
(static = $e:expr; $($t:tt)*) => {
a!($e; $($t)*);
};
() => {};
}
b! { static = #[] (); }
",
);
}