summaryrefslogtreecommitdiffstats
path: root/clang/tools/libclang/CXString.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/tools/libclang/CXString.cpp')
-rw-r--r--clang/tools/libclang/CXString.cpp29
1 files changed, 18 insertions, 11 deletions
diff --git a/clang/tools/libclang/CXString.cpp b/clang/tools/libclang/CXString.cpp
index f13a5a0415d..476c12429c7 100644
--- a/clang/tools/libclang/CXString.cpp
+++ b/clang/tools/libclang/CXString.cpp
@@ -77,18 +77,25 @@ CXString cxstring::createDup(const char *String) {
return Str;
}
-CXString cxstring::createCXString(StringRef String, bool DupString) {
+CXString cxstring::createRef(StringRef String) {
+ // If the string is not nul-terminated, we have to make a copy.
+ // This is doing a one past end read, and should be removed!
+ if (!String.empty() && String.data()[String.size()] != 0)
+ return cxstring::createDup(String);
+
CXString Result;
- if (DupString || (!String.empty() && String.data()[String.size()] != 0)) {
- char *Spelling = static_cast<char *>(malloc(String.size() + 1));
- memmove(Spelling, String.data(), String.size());
- Spelling[String.size()] = 0;
- Result.data = Spelling;
- Result.private_flags = (unsigned) CXS_Malloc;
- } else {
- Result.data = String.data();
- Result.private_flags = (unsigned) CXS_Unmanaged;
- }
+ Result.data = String.data();
+ Result.private_flags = (unsigned) CXS_Unmanaged;
+ return Result;
+}
+
+CXString cxstring::createDup(StringRef String) {
+ CXString Result;
+ char *Spelling = static_cast<char *>(malloc(String.size() + 1));
+ memmove(Spelling, String.data(), String.size());
+ Spelling[String.size()] = 0;
+ Result.data = Spelling;
+ Result.private_flags = (unsigned) CXS_Malloc;
return Result;
}
OpenPOWER on IntegriCloud