[PATCH] D61059: [yaml2obj] - Don't crash on invalid inputs.

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 24 04:05:47 PDT 2019


grimar created this revision.
grimar added reviewers: beanz, compnerd, pcc, jhenderson.
grimar added a subscriber: plotfi.

yaml2obj might crash on invalid input when unable to parse the YAML.

The reason for the crash is almost the same to one fixed in D59964 <https://reviews.llvm.org/D59964>,
which fixed it for en empty inputs. But as was mentioned in comments,
fix should have been done in `yaml::Input` instead.

This patch does that and fixes a crash that I faced
(I updated the test case accordingly).


https://reviews.llvm.org/D61059

Files:
  lib/ObjectYAML/ObjectYAML.cpp
  lib/Support/YAMLTraits.cpp
  test/tools/yaml2obj/empty-or-invalid-doc.yaml
  test/tools/yaml2obj/empty.yaml
  tools/yaml2obj/yaml2obj.cpp


Index: tools/yaml2obj/yaml2obj.cpp
===================================================================
--- tools/yaml2obj/yaml2obj.cpp
+++ tools/yaml2obj/yaml2obj.cpp
@@ -86,11 +86,7 @@
   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();
Index: test/tools/yaml2obj/empty-or-invalid-doc.yaml
===================================================================
--- test/tools/yaml2obj/empty-or-invalid-doc.yaml
+++ test/tools/yaml2obj/empty-or-invalid-doc.yaml
@@ -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!
Index: lib/Support/YAMLTraits.cpp
===================================================================
--- lib/Support/YAMLTraits.cpp
+++ lib/Support/YAMLTraits.cpp
@@ -113,6 +113,11 @@
 }
 
 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.
Index: lib/ObjectYAML/ObjectYAML.cpp
===================================================================
--- lib/ObjectYAML/ObjectYAML.cpp
+++ lib/ObjectYAML/ObjectYAML.cpp
@@ -32,6 +32,7 @@
       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 @@
     } 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() + "'!");
     }
   }
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D61059.196416.patch
Type: text/x-patch
Size: 2987 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190424/28f28863/attachment.bin>


More information about the llvm-commits mailing list