[llvm-branch-commits] [clang] release/23.x: [Clang][Frontend] Fix fix-it size overflow in emitted .dia (#216075) (PR #216816)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Aug 17 11:55:01 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: llvmbot
<details>
<summary>Changes</summary>
Backport bb123b2
Requested by: @<!-- -->jansvoboda11
---
Full diff: https://github.com/llvm/llvm-project/pull/216816.diff
3 Files Affected:
- (modified) clang/lib/Frontend/SerializedDiagnosticPrinter.cpp (+1-1)
- (added) clang/test/Misc/serialized-diags-large-fixit.m (+45)
- (modified) clang/tools/libclang/CXLoadedDiagnostic.cpp (-3)
``````````diff
diff --git a/clang/lib/Frontend/SerializedDiagnosticPrinter.cpp b/clang/lib/Frontend/SerializedDiagnosticPrinter.cpp
index 58d080f5504c2..20bfd35e2a7d3 100644
--- a/clang/lib/Frontend/SerializedDiagnosticPrinter.cpp
+++ b/clang/lib/Frontend/SerializedDiagnosticPrinter.cpp
@@ -500,7 +500,7 @@ void SDiagsWriter::EmitBlockInfoBlock() {
Abbrev = std::make_shared<BitCodeAbbrev>();
Abbrev->Add(BitCodeAbbrevOp(RECORD_FIXIT));
AddRangeLocationAbbrev(*Abbrev);
- Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Text size.
+ Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16)); // Text size.
Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // FixIt text.
Abbrevs.set(RECORD_FIXIT, Stream.EmitBlockInfoAbbrev(BLOCK_DIAG,
Abbrev));
diff --git a/clang/test/Misc/serialized-diags-large-fixit.m b/clang/test/Misc/serialized-diags-large-fixit.m
new file mode 100644
index 0000000000000..b2fb1fed07d00
--- /dev/null
+++ b/clang/test/Misc/serialized-diags-large-fixit.m
@@ -0,0 +1,45 @@
+// RUN: %clang -fsyntax-only -fobjc-runtime=macosx-10.8 \
+// RUN: -Wno-objc-root-class --serialize-diagnostics %t.dia %s 2>&1 \
+// RUN: | FileCheck %s --check-prefix=TEXT
+// RUN: c-index-test -read-diagnostics %t.dia 2>&1 \
+// RUN: | FileCheck %s --check-prefix=SERIALIZED
+
+// Form an identifier larger than 64 KiB without making the test file enormous.
+#define CAT_IMPL(A, B) A##B
+#define CAT(A, B) CAT_IMPL(A, B)
+#define A0 a
+#define A1 CAT(A0, A0)
+#define A2 CAT(A1, A1)
+#define A3 CAT(A2, A2)
+#define A4 CAT(A3, A3)
+#define A5 CAT(A4, A4)
+#define A6 CAT(A5, A5)
+#define A7 CAT(A6, A6)
+#define A8 CAT(A7, A7)
+#define A9 CAT(A8, A8)
+#define A10 CAT(A9, A9)
+#define A11 CAT(A10, A10)
+#define A12 CAT(A11, A11)
+#define A13 CAT(A12, A12)
+#define A14 CAT(A13, A13)
+#define A15 CAT(A14, A14)
+#define A16 CAT(A15, A15)
+#define LARGE_IDENTIFIER CAT(A16, z)
+
+ at protocol Protocol
+ at property int LARGE_IDENTIFIER;
+ at end
+
+ at interface MyClass <Protocol>
+ at end
+
+ at implementation MyClass
+ at end
+
+// TEXT: warning: auto property synthesis will not synthesize property
+// TEXT: note: add a '@synthesize' directive
+// SERIALIZED: warning: auto property synthesis will not synthesize property
+// SERIALIZED: note: add a '@synthesize' directive
+// SERIALIZED: FIXIT:
+// SERIALIZED-SAME: z;
+// SERIALIZED: Number of diagnostics: 1
diff --git a/clang/tools/libclang/CXLoadedDiagnostic.cpp b/clang/tools/libclang/CXLoadedDiagnostic.cpp
index ed89a6a7754da..bfb02d4dcf49d 100644
--- a/clang/tools/libclang/CXLoadedDiagnostic.cpp
+++ b/clang/tools/libclang/CXLoadedDiagnostic.cpp
@@ -366,9 +366,6 @@ DiagLoader::visitFixitRecord(const serialized_diags::Location &Start,
CXSourceRange SR;
if (std::error_code EC = readRange(Start, End, SR))
return EC;
- // FIXME: Why do we care about long strings?
- if (CodeToInsert.size() > 65536)
- return reportInvalidFile("Out-of-bounds string in FIXIT");
CurrentDiags.back()->FixIts.push_back(
std::make_pair(SR, TopDiags->copyString(CodeToInsert)));
return std::error_code();
``````````
</details>
https://github.com/llvm/llvm-project/pull/216816
More information about the llvm-branch-commits
mailing list