Skip to content

Commit

Permalink
Rollup merge of rust-lang#76598 - ad-anssi:diagnostic_errors_fix, r=e…
Browse files Browse the repository at this point in the history
…stebank

Fixing memory exhaustion when formatting short code suggestion

Details can be found in issue rust-lang#76597. This PR replaces substractions with `saturating_sub`'s to avoid usize wrapping leading to memory exhaustion when formatting short suggestion messages.
  • Loading branch information
Dylan-DPC committed Sep 12, 2020
2 parents 9c9c642 + 62068a5 commit d53086a
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 4 deletions.
6 changes: 3 additions & 3 deletions compiler/rustc_errors/src/emitter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -959,15 +959,15 @@ impl EmitterWriter {
'_',
line_offset + pos,
width_offset + depth,
code_offset + annotation.start_col - left,
(code_offset + annotation.start_col).saturating_sub(left),
style,
);
}
_ if self.teach => {
buffer.set_style_range(
line_offset,
code_offset + annotation.start_col - left,
code_offset + annotation.end_col - left,
(code_offset + annotation.start_col).saturating_sub(left),
(code_offset + annotation.end_col).saturating_sub(left),
style,
annotation.is_primary,
);
Expand Down
6 changes: 5 additions & 1 deletion compiler/rustc_parse/src/parser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -694,9 +694,13 @@ impl<'a> Parser<'a> {
Ok(t) => {
// Parsed successfully, therefore most probably the code only
// misses a separator.
let mut exp_span = self.sess.source_map().next_point(sp);
if self.sess.source_map().is_multiline(exp_span) {
exp_span = sp;
}
expect_err
.span_suggestion_short(
self.sess.source_map().next_point(sp),
exp_span,
&format!("missing `{}`", token_str),
token_str,
Applicability::MaybeIncorrect,
Expand Down
11 changes: 11 additions & 0 deletions src/test/ui/issue-76597.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// run-rustfix

#![allow(dead_code)]
#![allow(unused_variables)]
fn f(
x: u8,
y: u8,
) {}
//~^^ ERROR: expected one of `!`, `(`, `)`, `+`, `,`, `::`, or `<`, found `y`

fn main() {}
11 changes: 11 additions & 0 deletions src/test/ui/issue-76597.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// run-rustfix

#![allow(dead_code)]
#![allow(unused_variables)]
fn f(
x: u8
y: u8,
) {}
//~^^ ERROR: expected one of `!`, `(`, `)`, `+`, `,`, `::`, or `<`, found `y`

fn main() {}
13 changes: 13 additions & 0 deletions src/test/ui/issue-76597.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
error: expected one of `!`, `(`, `)`, `+`, `,`, `::`, or `<`, found `y`
--> $DIR/issue-76597.rs:7:38
|
LL | ... x: u8
| -
| |
| expected one of 7 possible tokens
| help: missing `,`
LL | ... y: u8,
| ^ unexpected token

error: aborting due to previous error

0 comments on commit d53086a

Please sign in to comment.