From 3548823b7c0ed8f985050d27d98c3f1145f0bea3 Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Thu, 13 Feb 2025 07:39:26 -0800 Subject: [PATCH] Revert "[libclang] Always Dup in createRef(StringRef) (#125020)" This reverts commit e76739eeb952940b2979c70ba44a28fecf592695. --- clang/docs/ReleaseNotes.rst | 3 --- clang/tools/libclang/CXString.cpp | 14 +++++++++++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index e41ad384b84f7..03bddbe3e983a 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -257,9 +257,6 @@ clang-format libclang -------- -- Fixed a buffer overflow in ``CXString`` implementation. The fix may result in - increased memory allocation. - Code Completion --------------- diff --git a/clang/tools/libclang/CXString.cpp b/clang/tools/libclang/CXString.cpp index aaa8f8eeb67a1..5e427957a1092 100644 --- a/clang/tools/libclang/CXString.cpp +++ b/clang/tools/libclang/CXString.cpp @@ -87,7 +87,19 @@ CXString createRef(StringRef String) { if (String.empty()) return createEmpty(); - return createDup(String); + // If the string is not nul-terminated, we have to make a copy. + + // FIXME: This is doing a one past end read, and should be removed! For memory + // we don't manage, the API string can become unterminated at any time outside + // our control. + + if (String.data()[String.size()] != 0) + return createDup(String); + + CXString Result; + Result.data = String.data(); + Result.private_flags = (unsigned) CXS_Unmanaged; + return Result; } CXString createDup(StringRef String) {