[clang-format] Fix an off-by-1 bug with -length option (#143302)

Also validate the argument value.

Fixes #56245

NOKEYCHECK=True
GitOrigin-RevId: 1fae5918b3d6fbed8ce6d8a2edf31bdf304ca8db
diff --git a/ClangFormat.cpp b/ClangFormat.cpp
index 24ad3cb..c0efbb7 100644
--- a/ClangFormat.cpp
+++ b/ClangFormat.cpp
@@ -284,7 +284,7 @@
   if (Offsets.size() == 1 && EmptyLengths) {
     Length = Sources.getFileOffset(Sources.getLocForEndOfFile(ID)) - Offsets[0];
   } else if (Offsets.size() != Lengths.size()) {
-    errs() << "error: number of -offset and -length arguments must match.\n";
+    errs() << "error: number of -offset and -length arguments must match\n";
     return true;
   }
   for (unsigned I = 0, E = Offsets.size(), CodeSize = Code->getBufferSize();
@@ -296,12 +296,16 @@
     }
     if (!EmptyLengths)
       Length = Lengths[I];
-    if (Offset + Length > CodeSize) {
-      errs() << "error: invalid length " << Length << ", offset + length ("
-             << Offset + Length << ") is outside the file.\n";
+    if (Length == 0) {
+      errs() << "error: length should be at least 1\n";
       return true;
     }
-    Ranges.push_back(tooling::Range(Offset, Length));
+    if (Offset + Length > CodeSize) {
+      errs() << "error: invalid length " << Length << ", offset + length ("
+             << Offset + Length << ") is outside the file\n";
+      return true;
+    }
+    Ranges.push_back(tooling::Range(Offset, Length - 1));
   }
   return false;
 }