[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;
}