[llvm] r359178 - [yaml2obj] - Don't crash on invalid inputs.
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 25 02:59:55 PDT 2019
Author: grimar
Date: Thu Apr 25 02:59:55 2019
New Revision: 359178
URL: http://llvm.org/viewvc/llvm-project?rev=359178&view=rev
Log:
[yaml2obj] - Don't crash on invalid inputs.
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
Added:
llvm/trunk/test/tools/yaml2obj/empty-or-invalid-doc.yaml
- copied, changed from r359177, llvm/trunk/test/tools/yaml2obj/empty.yaml
Removed:
llvm/trunk/test/tools/yaml2obj/empty.yaml
Modified:
llvm/trunk/lib/ObjectYAML/ObjectYAML.cpp
llvm/trunk/lib/Support/YAMLTraits.cpp
llvm/trunk/tools/yaml2obj/yaml2obj.cpp
Modified: llvm/trunk/lib/ObjectYAML/ObjectYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/ObjectYAML.cpp?rev=359178&r1=359177&r2=359178&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/ObjectYAML.cpp (original)
+++ llvm/trunk/lib/ObjectYAML/ObjectYAML.cpp Thu Apr 25 02:59:55 2019
@@ -32,6 +32,7 @@ void MappingTraits<YamlObjectFile>::mapp
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);
@@ -51,15 +52,12 @@ void MappingTraits<YamlObjectFile>::mapp
} 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() + "'!");
}
}
}
Modified: llvm/trunk/lib/Support/YAMLTraits.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/YAMLTraits.cpp?rev=359178&r1=359177&r2=359178&view=diff
==============================================================================
--- llvm/trunk/lib/Support/YAMLTraits.cpp (original)
+++ llvm/trunk/lib/Support/YAMLTraits.cpp Thu Apr 25 02:59:55 2019
@@ -113,6 +113,11 @@ const Node *Input::getCurrentNode() cons
}
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.
Copied: llvm/trunk/test/tools/yaml2obj/empty-or-invalid-doc.yaml (from r359177, llvm/trunk/test/tools/yaml2obj/empty.yaml)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/yaml2obj/empty-or-invalid-doc.yaml?p2=llvm/trunk/test/tools/yaml2obj/empty-or-invalid-doc.yaml&p1=llvm/trunk/test/tools/yaml2obj/empty.yaml&r1=359177&r2=359178&rev=359178&view=diff
==============================================================================
--- llvm/trunk/test/tools/yaml2obj/empty.yaml (original)
+++ llvm/trunk/test/tools/yaml2obj/empty-or-invalid-doc.yaml Thu Apr 25 02:59:55 2019
@@ -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!
Removed: llvm/trunk/test/tools/yaml2obj/empty.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/yaml2obj/empty.yaml?rev=359177&view=auto
==============================================================================
--- llvm/trunk/test/tools/yaml2obj/empty.yaml (original)
+++ llvm/trunk/test/tools/yaml2obj/empty.yaml (removed)
@@ -1,5 +0,0 @@
-# RUN: echo "" | not yaml2obj 2>&1 | FileCheck %s
-# 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.
Modified: llvm/trunk/tools/yaml2obj/yaml2obj.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2obj.cpp?rev=359178&r1=359177&r2=359178&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2obj.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2obj.cpp Thu Apr 25 02:59:55 2019
@@ -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();
More information about the llvm-commits
mailing list