forked from OSchip/llvm-project
Add some additional safety checks to the StructuredData access
methods - lldb can still crash pretty easily on corrupt JSON text, and these will help eliminate a bunch of cases where that would result in a crash. Some of the methods would check that e.g. GetItemAtIndex would actually return an item before dereferencing it, some would not, that kind of thing. <rdar://problem/23768693> llvm-svn: 255093
This commit is contained in:
parent
b5104b5884
commit
12f7929177
|
@ -250,11 +250,14 @@ public:
|
|||
bool
|
||||
GetItemAtIndexAsInteger(size_t idx, IntType &result) const
|
||||
{
|
||||
ObjectSP value = GetItemAtIndex(idx);
|
||||
if (auto int_value = value->GetAsInteger())
|
||||
ObjectSP value_sp = GetItemAtIndex(idx);
|
||||
if (value_sp.get())
|
||||
{
|
||||
result = static_cast<IntType>(int_value->GetValue());
|
||||
return true;
|
||||
if (auto int_value = value_sp->GetAsInteger())
|
||||
{
|
||||
result = static_cast<IntType>(int_value->GetValue());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -272,11 +275,14 @@ public:
|
|||
bool
|
||||
GetItemAtIndexAsString(size_t idx, std::string &result) const
|
||||
{
|
||||
ObjectSP value = GetItemAtIndex(idx);
|
||||
if (auto string_value = value->GetAsString())
|
||||
ObjectSP value_sp = GetItemAtIndex(idx);
|
||||
if (value_sp.get())
|
||||
{
|
||||
result = string_value->GetValue();
|
||||
return true;
|
||||
if (auto string_value = value_sp->GetAsString())
|
||||
{
|
||||
result = string_value->GetValue();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -293,13 +299,13 @@ public:
|
|||
bool
|
||||
GetItemAtIndexAsString(size_t idx, ConstString &result) const
|
||||
{
|
||||
ObjectSP value = GetItemAtIndex(idx);
|
||||
if (!value)
|
||||
return false;
|
||||
if (auto string_value = value->GetAsString())
|
||||
{
|
||||
result = ConstString(string_value->GetValue());
|
||||
return true;
|
||||
ObjectSP value_sp = GetItemAtIndex(idx);
|
||||
if (value_sp.get()) {
|
||||
if (auto string_value = value_sp->GetAsString())
|
||||
{
|
||||
result = ConstString(string_value->GetValue());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -316,17 +322,27 @@ public:
|
|||
bool
|
||||
GetItemAtIndexAsDictionary(size_t idx, Dictionary *&result) const
|
||||
{
|
||||
ObjectSP value = GetItemAtIndex(idx);
|
||||
result = value->GetAsDictionary();
|
||||
return (result != nullptr);
|
||||
result = nullptr;
|
||||
ObjectSP value_sp = GetItemAtIndex(idx);
|
||||
if (value_sp.get())
|
||||
{
|
||||
result = value_sp->GetAsDictionary();
|
||||
return (result != nullptr);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
GetItemAtIndexAsArray(size_t idx, Array *&result) const
|
||||
{
|
||||
ObjectSP value = GetItemAtIndex(idx);
|
||||
result = value->GetAsArray();
|
||||
return (result != nullptr);
|
||||
result = nullptr;
|
||||
ObjectSP value_sp = GetItemAtIndex(idx);
|
||||
if (value_sp.get())
|
||||
{
|
||||
result = value_sp->GetAsArray();
|
||||
return (result != nullptr);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -542,13 +558,13 @@ public:
|
|||
bool
|
||||
GetValueForKeyAsInteger(llvm::StringRef key, IntType &result) const
|
||||
{
|
||||
ObjectSP value = GetValueForKey(key);
|
||||
if (!value)
|
||||
return false;
|
||||
if (auto int_value = value->GetAsInteger())
|
||||
{
|
||||
result = static_cast<IntType>(int_value->GetValue());
|
||||
return true;
|
||||
ObjectSP value_sp = GetValueForKey(key);
|
||||
if (value_sp) {
|
||||
if (auto int_value = value_sp->GetAsInteger())
|
||||
{
|
||||
result = static_cast<IntType>(int_value->GetValue());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -566,13 +582,14 @@ public:
|
|||
bool
|
||||
GetValueForKeyAsString(llvm::StringRef key, std::string &result) const
|
||||
{
|
||||
ObjectSP value = GetValueForKey(key);
|
||||
if (!value)
|
||||
return false;
|
||||
if (auto string_value = value->GetAsString())
|
||||
ObjectSP value_sp = GetValueForKey(key);
|
||||
if (value_sp.get())
|
||||
{
|
||||
result = string_value->GetValue();
|
||||
return true;
|
||||
if (auto string_value = value_sp->GetAsString())
|
||||
{
|
||||
result = string_value->GetValue();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -594,13 +611,14 @@ public:
|
|||
bool
|
||||
GetValueForKeyAsString(llvm::StringRef key, ConstString &result) const
|
||||
{
|
||||
ObjectSP value = GetValueForKey(key);
|
||||
if (!value)
|
||||
return false;
|
||||
if (auto string_value = value->GetAsString())
|
||||
ObjectSP value_sp = GetValueForKey(key);
|
||||
if (value_sp.get())
|
||||
{
|
||||
result = ConstString(string_value->GetValue());
|
||||
return true;
|
||||
if (auto string_value = value_sp->GetAsString())
|
||||
{
|
||||
result = ConstString(string_value->GetValue());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -618,22 +636,26 @@ public:
|
|||
GetValueForKeyAsDictionary(llvm::StringRef key, Dictionary *&result) const
|
||||
{
|
||||
result = nullptr;
|
||||
ObjectSP value = GetValueForKey(key);
|
||||
if (!value)
|
||||
return false;
|
||||
result = value->GetAsDictionary();
|
||||
return true;
|
||||
ObjectSP value_sp = GetValueForKey(key);
|
||||
if (value_sp.get())
|
||||
{
|
||||
result = value_sp->GetAsDictionary();
|
||||
return (result != nullptr);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
GetValueForKeyAsArray(llvm::StringRef key, Array *&result) const
|
||||
{
|
||||
result = nullptr;
|
||||
ObjectSP value = GetValueForKey(key);
|
||||
if (!value)
|
||||
return false;
|
||||
result = value->GetAsArray();
|
||||
return true;
|
||||
ObjectSP value_sp = GetValueForKey(key);
|
||||
if (value_sp.get())
|
||||
{
|
||||
result = value_sp->GetAsArray();
|
||||
return (result != nullptr);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -645,10 +667,10 @@ public:
|
|||
}
|
||||
|
||||
void
|
||||
AddItem (llvm::StringRef key, ObjectSP value)
|
||||
AddItem (llvm::StringRef key, ObjectSP value_sp)
|
||||
{
|
||||
ConstString key_cs(key);
|
||||
m_dict[key_cs] = value;
|
||||
m_dict[key_cs] = value_sp;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
Loading…
Reference in New Issue