Skip to content

Commit

Permalink
[yaml2obj] - Don't crash on invalid inputs.
Browse files Browse the repository at this point in the history
yaml2obj might crash on invalid input when unable to parse the YAML.

Recently a crash with a very similar nature was fixed for an empty files. 
This patch revisits the fix and does it in yaml::Input instead.
It seems to be more correct way to handle such situation.

With that crash for invalid inputs is also fixed now.

Differential revision: https://reviews.llvm.org/D61059

llvm-svn: 359178
  • Loading branch information
George Rimar committed Apr 25, 2019
1 parent 4b7d3c4 commit 45d042e
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 13 deletions.
12 changes: 5 additions & 7 deletions llvm/lib/ObjectYAML/ObjectYAML.cpp
Expand Up @@ -32,6 +32,7 @@ void MappingTraits<YamlObjectFile>::mapping(IO &IO,
MappingTraits<MachOYAML::UniversalBinary>::mapping(IO,
*ObjectFile.FatMachO);
} else {
Input &In = (Input &)IO;
if (IO.mapTag("!ELF")) {
ObjectFile.Elf.reset(new ELFYAML::Object());
MappingTraits<ELFYAML::Object>::mapping(IO, *ObjectFile.Elf);
Expand All @@ -51,15 +52,12 @@ void MappingTraits<YamlObjectFile>::mapping(IO &IO,
} else if (IO.mapTag("!WASM")) {
ObjectFile.Wasm.reset(new WasmYAML::Object());
MappingTraits<WasmYAML::Object>::mapping(IO, *ObjectFile.Wasm);
} else {
Input &In = (Input &)IO;
std::string Tag = In.getCurrentNode()->getRawTag();
if (Tag.empty())
} else if (const Node *N = In.getCurrentNode()) {
if (N->getRawTag().empty())
IO.setError("YAML Object File missing document type tag!");
else
IO.setError(
Twine("YAML Object File unsupported document type tag '") +
Twine(Tag) + Twine("'!"));
IO.setError("YAML Object File unsupported document type tag '" +
N->getRawTag() + "'!");
}
}
}
5 changes: 5 additions & 0 deletions llvm/lib/Support/YAMLTraits.cpp
Expand Up @@ -113,6 +113,11 @@ const Node *Input::getCurrentNode() const {
}

bool Input::mapTag(StringRef Tag, bool Default) {
// CurrentNode can be null if setCurrentDocument() was unable to
// parse the document because it was invalid or empty.
if (!CurrentNode)
return false;

std::string foundTag = CurrentNode->_node->getVerbatimTag();
if (foundTag.empty()) {
// If no tag found and 'Tag' is the default, say it was found.
Expand Down
Expand Up @@ -2,4 +2,7 @@
# RUN: echo -n "" | not yaml2obj 2>&1 | FileCheck %s
# RUN: echo " " | not yaml2obj 2>&1 | FileCheck %s
# RUN: echo " " | not yaml2obj 2>&1 | FileCheck %s
# CHECK: yaml2obj: Error opening '-': Empty File.
# CHECK: yaml2obj: Unknown document type!

# RUN: echo -e -n "\xff" | not yaml2obj 2>&1 | FileCheck %s --check-prefix=INVALID
# INVALID: yaml2obj: Failed to parse YAML file!
6 changes: 1 addition & 5 deletions llvm/tools/yaml2obj/yaml2obj.cpp
Expand Up @@ -86,11 +86,7 @@ int main(int argc, char **argv) {
if (!Buf)
return 1;

StringRef Buffer = Buf.get()->getBuffer();
if (Buffer.trim().size() == 0)
error("yaml2obj: Error opening '" + Input + "': Empty File.");
yaml::Input YIn(Buffer);

yaml::Input YIn(Buf.get()->getBuffer());
int Res = convertYAML(YIn, Out->os());
if (Res == 0)
Out->keep();
Expand Down

0 comments on commit 45d042e

Please sign in to comment.