[llvm] r273623 - [yaml2macho] Removing asserts in favor of explicit yaml parse error

Chris Bieneman via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 23 15:36:32 PDT 2016


Author: cbieneman
Date: Thu Jun 23 17:36:31 2016
New Revision: 273623

URL: http://llvm.org/viewvc/llvm-project?rev=273623&view=rev
Log:
[yaml2macho] Removing asserts in favor of explicit yaml parse error

32-bit Mach headers don't have reserved fields. When generating the
mapping for 32-bit headers leaving off the reserved field will result in
parse errors if the field is present in the yaml.

Added a CHECK-NOT line to ensure that mach_header.yaml isn't adding a
reserved field, and a test to ensure that the parser error gets hit with
32-bit headers.

Added:
    llvm/trunk/test/ObjectYAML/MachO/mach_header_32_malformed.yaml
Modified:
    llvm/trunk/lib/ObjectYAML/MachOYAML.cpp
    llvm/trunk/test/ObjectYAML/MachO/mach_header.yaml
    llvm/trunk/tools/yaml2obj/yaml2macho.cpp

Modified: llvm/trunk/lib/ObjectYAML/MachOYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/MachOYAML.cpp?rev=273623&r1=273622&r2=273623&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/MachOYAML.cpp (original)
+++ llvm/trunk/lib/ObjectYAML/MachOYAML.cpp Thu Jun 23 17:36:31 2016
@@ -14,6 +14,7 @@
 #include "llvm/ObjectYAML/MachOYAML.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/Format.h"
+#include "llvm/Support/MachO.h"
 
 #include <string.h> // For memcpy, memset and strnlen.
 
@@ -79,8 +80,9 @@ void MappingTraits<MachOYAML::FileHeader
   IO.mapRequired("ncmds", FileHdr.ncmds);
   IO.mapRequired("sizeofcmds", FileHdr.sizeofcmds);
   IO.mapRequired("flags", FileHdr.flags);
-  IO.mapOptional("reserved", FileHdr.reserved,
-                 static_cast<llvm::yaml::Hex32>(0xDEADBEEFu));
+  if (FileHdr.magic == MachO::MH_MAGIC_64 ||
+      FileHdr.magic == MachO::MH_CIGAM_64)
+    IO.mapRequired("reserved", FileHdr.reserved);
 }
 
 void MappingTraits<MachOYAML::Object>::mapping(IO &IO,

Modified: llvm/trunk/test/ObjectYAML/MachO/mach_header.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/mach_header.yaml?rev=273623&r1=273622&r2=273623&view=diff
==============================================================================
--- llvm/trunk/test/ObjectYAML/MachO/mach_header.yaml (original)
+++ llvm/trunk/test/ObjectYAML/MachO/mach_header.yaml Thu Jun 23 17:36:31 2016
@@ -20,4 +20,5 @@ FileHeader:
 # CHECK:   ncmds:           0
 # CHECK:   sizeofcmds:      0
 # CHECK:   flags:           0x00218085
+# CHECK-NOT: reserved:
 # CHECK: ...

Added: llvm/trunk/test/ObjectYAML/MachO/mach_header_32_malformed.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/mach_header_32_malformed.yaml?rev=273623&view=auto
==============================================================================
--- llvm/trunk/test/ObjectYAML/MachO/mach_header_32_malformed.yaml (added)
+++ llvm/trunk/test/ObjectYAML/MachO/mach_header_32_malformed.yaml Thu Jun 23 17:36:31 2016
@@ -0,0 +1,15 @@
+# RUN: not yaml2obj -format=macho %s 2>&1 | FileCheck %s
+
+--- !mach-o
+FileHeader:      
+  magic:           0xFEEDFACE
+  cputype:         0x00000007
+  cpusubtype:      0x80000003
+  filetype:        0x00000002
+  ncmds:           0
+  sizeofcmds:      0
+  flags:           0x00218085
+  reserved:        0
+...
+
+# CHECK: error: unknown key 'reserved'

Modified: llvm/trunk/tools/yaml2obj/yaml2macho.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2macho.cpp?rev=273623&r1=273622&r2=273623&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2macho.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2macho.cpp Thu Jun 23 17:36:31 2016
@@ -32,10 +32,6 @@ public:
     is64Bit = Obj.Header.magic == MachO::MH_MAGIC_64 ||
               Obj.Header.magic == MachO::MH_CIGAM_64;
     memset(reinterpret_cast<void *>(&Header), 0, sizeof(MachO::mach_header_64));
-    assert((is64Bit || Obj.Header.reserved == 0xDEADBEEFu) &&
-           "32-bit MachO has reserved in header");
-    assert((!is64Bit || Obj.Header.reserved != 0xDEADBEEFu) &&
-           "64-bit MachO has missing reserved in header");
   }
 
   Error writeMachO(raw_ostream &OS);




More information about the llvm-commits mailing list