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