[Lldb-commits] [lldb] r203274 - Verify we have a correct ELF or Mach core file before we return a valid instace of ProcessElfCore or ProcessMachCore respectively.

Greg Clayton gclayton at apple.com
Fri Mar 7 11:24:40 PST 2014


Author: gclayton
Date: Fri Mar  7 13:24:39 2014
New Revision: 203274

URL: http://llvm.org/viewvc/llvm-project?rev=203274&view=rev
Log:
Verify we have a correct ELF or Mach core file before we return a valid instace of ProcessElfCore or ProcessMachCore respectively.


Modified:
    lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
    lldb/trunk/source/Plugins/Process/elf-core/ProcessElfCore.cpp
    lldb/trunk/source/Plugins/Process/mach-core/ProcessMachCore.cpp

Modified: lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h?rev=203274&r1=203273&r2=203274&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h (original)
+++ lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h Fri Mar  7 13:24:39 2014
@@ -162,14 +162,13 @@ public:
     
     virtual uint32_t
     GetSDKVersion (uint32_t *versions, uint32_t num_versions);
-
-protected:
-
+    
     static bool
     ParseHeader (lldb_private::DataExtractor &data,
                  lldb::offset_t *data_offset_ptr,
                  llvm::MachO::mach_header &header);
     
+protected:
     
     static bool
     GetUUID (const llvm::MachO::mach_header &header,

Modified: lldb/trunk/source/Plugins/Process/elf-core/ProcessElfCore.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/elf-core/ProcessElfCore.cpp?rev=203274&r1=203273&r2=203274&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/elf-core/ProcessElfCore.cpp (original)
+++ lldb/trunk/source/Plugins/Process/elf-core/ProcessElfCore.cpp Fri Mar  7 13:24:39 2014
@@ -19,6 +19,9 @@
 #include "lldb/Core/DataBufferHeap.h"
 #include "lldb/Target/Target.h"
 #include "lldb/Target/DynamicLoader.h"
+
+#include "llvm/Support/ELF.h"
+
 #include "ProcessPOSIXLog.h"
 
 #include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
@@ -54,8 +57,24 @@ lldb::ProcessSP
 ProcessElfCore::CreateInstance (Target &target, Listener &listener, const FileSpec *crash_file)
 {
     lldb::ProcessSP process_sp;
-    if (crash_file) 
-        process_sp.reset(new ProcessElfCore (target, listener, *crash_file));
+    if (crash_file)
+    {
+        // Read enough data for a ELF32 header or ELF64 header
+        const size_t header_size = sizeof(llvm::ELF::Elf64_Ehdr);
+        
+        lldb::DataBufferSP data_sp (crash_file->ReadFileContents(0, header_size));
+        if (data_sp->GetByteSize() == header_size)
+        {
+            elf::ELFHeader elf_header;
+            DataExtractor data(data_sp, lldb::eByteOrderLittle, 4);
+            lldb::offset_t data_offset = 0;
+            if (elf_header.Parse(data, &data_offset))
+            {
+                if (elf_header.e_type == llvm::ELF::ET_CORE)
+                    process_sp.reset(new ProcessElfCore (target, listener, *crash_file));
+            }
+        }
+    }
     return process_sp;
 }
 

Modified: lldb/trunk/source/Plugins/Process/mach-core/ProcessMachCore.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/mach-core/ProcessMachCore.cpp?rev=203274&r1=203273&r2=203274&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/mach-core/ProcessMachCore.cpp (original)
+++ lldb/trunk/source/Plugins/Process/mach-core/ProcessMachCore.cpp Fri Mar  7 13:24:39 2014
@@ -35,6 +35,7 @@
 // Needed for the plug-in names for the dynamic loaders.
 #include "Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h"
 #include "Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h"
+#include "Plugins/ObjectFile/Mach-O/ObjectFileMachO.h"
 
 using namespace lldb;
 using namespace lldb_private;
@@ -64,7 +65,23 @@ ProcessMachCore::CreateInstance (Target
 {
     lldb::ProcessSP process_sp;
     if (crash_file)
-        process_sp.reset(new ProcessMachCore (target, listener, *crash_file));
+    {
+        const size_t header_size = sizeof(llvm::MachO::mach_header);
+        lldb::DataBufferSP data_sp (crash_file->ReadFileContents(0, header_size));
+        if (data_sp->GetByteSize() == header_size)
+        {
+            DataExtractor data(data_sp, lldb::eByteOrderLittle, 4);
+            
+            lldb::offset_t data_offset = 0;
+            llvm::MachO::mach_header mach_header;
+            if (ObjectFileMachO::ParseHeader(data, &data_offset, mach_header))
+            {
+                if (mach_header.filetype == llvm::MachO::MH_CORE)
+                    process_sp.reset(new ProcessMachCore (target, listener, *crash_file));
+            }
+        }
+        
+    }
     return process_sp;
 }
 





More information about the lldb-commits mailing list