diagnostic: Fix stupid bug in Formatter::format
That would cause OOB reads.
Fixed: tint:836
Change-Id: I6e44ab5d140e99a701c190c13ed6aaba762e19d4
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/53660
Auto-Submit: Ben Clayton <bclayton@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/diagnostic/formatter.cc b/src/diagnostic/formatter.cc
index 7461ba9..4b20879 100644
--- a/src/diagnostic/formatter.cc
+++ b/src/diagnostic/formatter.cc
@@ -212,7 +212,8 @@
state.set_style({Color::kDefault, false});
for (size_t line_num = rng.begin.line;
- (line_num <= rng.end.line) && (src.file_content->lines.size() + 1);
+ (line_num <= rng.end.line) &&
+ (line_num <= src.file_content->lines.size());
line_num++) {
auto& line = src.file_content->lines[line_num - 1];
auto line_len = line.size();
diff --git a/src/diagnostic/formatter_test.cc b/src/diagnostic/formatter_test.cc
index 8495dc9..6f62243 100644
--- a/src/diagnostic/formatter_test.cc
+++ b/src/diagnostic/formatter_test.cc
@@ -216,6 +216,17 @@
ASSERT_EQ(expect, got);
}
+TEST_F(DiagFormatterTest, RangeOOB) {
+ Formatter fmt{{true, true, true, true}};
+ diag::List list;
+ list.add_error("oob", Source{{{10, 20}, {30, 20}}, &file});
+ auto got = fmt.format(list);
+ auto* expect = R"(file.name:10:20 error: oob
+
+)";
+ ASSERT_EQ(expect, got);
+}
+
} // namespace
} // namespace diag
} // namespace tint