Skip to content

Commit

Permalink
[lldb] Correctly escape newlines and backslashes in the JSON serializer
Browse files Browse the repository at this point in the history
JSON serializer fails to escape newlines and backslashes. Let's fix that.

Differential Revision: https://reviews.llvm.org/D34322

llvm-svn: 311483
  • Loading branch information
kubamracek committed Aug 22, 2017
1 parent 6bb45f7 commit 20bce85
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 2 deletions.
4 changes: 4 additions & 0 deletions lldb/lldb.xcodeproj/project.pbxproj
Expand Up @@ -768,6 +768,7 @@
8C26C4261C3EA5F90031DF7C /* TSanRuntime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C26C4241C3EA4340031DF7C /* TSanRuntime.cpp */; };
8C2D6A53197A1EAF006989C9 /* MemoryHistory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C2D6A52197A1EAF006989C9 /* MemoryHistory.cpp */; };
8C2D6A5E197A250F006989C9 /* MemoryHistoryASan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C2D6A5A197A1FDC006989C9 /* MemoryHistoryASan.cpp */; };
8C3BD9A01EF5D1FF0016C343 /* JSONTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C3BD99F1EF5D1B50016C343 /* JSONTest.cpp */; };
8C3BD9961EF45DA50016C343 /* MainThreadCheckerRuntime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C3BD9951EF45D9B0016C343 /* MainThreadCheckerRuntime.cpp */; };
8CCB017E19BA28A80009FD44 /* ThreadCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CCB017A19BA283D0009FD44 /* ThreadCollection.cpp */; };
8CCB018219BA4E270009FD44 /* SBThreadCollection.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CCB018119BA4E210009FD44 /* SBThreadCollection.h */; settings = {ATTRIBUTES = (Public, ); }; };
Expand Down Expand Up @@ -2653,6 +2654,7 @@
8C2D6A54197A1EBE006989C9 /* MemoryHistory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MemoryHistory.h; path = include/lldb/Target/MemoryHistory.h; sourceTree = "<group>"; };
8C2D6A5A197A1FDC006989C9 /* MemoryHistoryASan.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MemoryHistoryASan.cpp; sourceTree = "<group>"; };
8C2D6A5B197A1FDC006989C9 /* MemoryHistoryASan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryHistoryASan.h; sourceTree = "<group>"; };
8C3BD99F1EF5D1B50016C343 /* JSONTest.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = JSONTest.cpp; sourceTree = "<group>"; };
8C3BD9931EF45D9B0016C343 /* MainThreadCheckerRuntime.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MainThreadCheckerRuntime.h; sourceTree = "<group>"; };
8C3BD9951EF45D9B0016C343 /* MainThreadCheckerRuntime.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = MainThreadCheckerRuntime.cpp; sourceTree = "<group>"; };
8CCB017A19BA283D0009FD44 /* ThreadCollection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ThreadCollection.cpp; path = source/Target/ThreadCollection.cpp; sourceTree = "<group>"; };
Expand Down Expand Up @@ -3392,6 +3394,7 @@
23CB15041D66CD9200EDDDE1 /* Inputs */,
2321F9441BDD346100BA9A93 /* StringExtractorTest.cpp */,
2321F9451BDD346100BA9A93 /* TaskPoolTest.cpp */,
8C3BD99F1EF5D1B50016C343 /* JSONTest.cpp */,
2321F9461BDD346100BA9A93 /* UriParserTest.cpp */,
);
path = Utility;
Expand Down Expand Up @@ -7177,6 +7180,7 @@
9A2057121F3B824B00F6C293 /* SymbolFileDWARFTests.cpp in Sources */,
9A20573A1F3B8E7E00F6C293 /* MainLoopTest.cpp in Sources */,
23CB15351D66DA9300EDDDE1 /* UriParserTest.cpp in Sources */,
8C3BD9A01EF5D1FF0016C343 /* JSONTest.cpp in Sources */,
23CB15361D66DA9300EDDDE1 /* FileSpecTest.cpp in Sources */,
23E2E5251D90373D006F38BB /* ArchSpecTest.cpp in Sources */,
9A2057081F3B819100F6C293 /* MemoryRegionInfoTest.cpp in Sources */,
Expand Down
5 changes: 3 additions & 2 deletions lldb/source/Utility/JSON.cpp
Expand Up @@ -22,16 +22,17 @@
using namespace lldb_private;

std::string JSONString::json_string_quote_metachars(const std::string &s) {
if (s.find('"') == std::string::npos)
if (s.find_first_of("\\\n\"") == std::string::npos)
return s;

std::string output;
const size_t s_size = s.size();
const char *s_chars = s.c_str();
for (size_t i = 0; i < s_size; i++) {
unsigned char ch = *(s_chars + i);
if (ch == '"') {
if (ch == '"' || ch == '\\' || ch == '\n') {
output.push_back('\\');
if (ch == '\n') ch = 'n';
}
output.push_back(ch);
}
Expand Down
1 change: 1 addition & 0 deletions lldb/unittests/Utility/CMakeLists.txt
Expand Up @@ -2,6 +2,7 @@ add_subdirectory(Helpers)

add_lldb_unittest(UtilityTests
ConstStringTest.cpp
JSONTest.cpp
LogTest.cpp
NameMatchesTest.cpp
StatusTest.cpp
Expand Down
26 changes: 26 additions & 0 deletions lldb/unittests/Utility/JSONTest.cpp
@@ -0,0 +1,26 @@
#include "gtest/gtest.h"

#include "lldb/Core/StreamString.h"
#include "lldb/Utility/JSON.h"

using namespace lldb_private;

TEST(JSONTest, Dictionary) {
JSONObject o;
o.SetObject("key", std::make_shared<JSONString>("value"));

StreamString stream;
o.Write(stream);

ASSERT_EQ(stream.GetString(), R"({"key":"value"})");
}

TEST(JSONTest, Newlines) {
JSONObject o;
o.SetObject("key", std::make_shared<JSONString>("hello\nworld"));

StreamString stream;
o.Write(stream);

ASSERT_EQ(stream.GetString(), R"({"key":"hello\nworld"})");
}

0 comments on commit 20bce85

Please sign in to comment.