Fixed an issue where we might have easy access to the string table data for a mach...
authorGreg Clayton <gclayton@apple.com>
Fri, 25 May 2012 17:04:00 +0000 (17:04 +0000)
committerGreg Clayton <gclayton@apple.com>
Fri, 25 May 2012 17:04:00 +0000 (17:04 +0000)
llvm-svn: 157482

lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp

index 418a93c..ff643f4 100644 (file)
@@ -1359,21 +1359,25 @@ ObjectFileMachO::ParseSymtab (bool minimize)
         }
 
 
-        if (process)
+        const bool have_strtab_data = strtab_data.GetByteSize() > 0;
+        if (!have_strtab_data)
         {
-            if (strtab_addr == LLDB_INVALID_ADDRESS)
+            if (process)
+            {
+                if (strtab_addr == LLDB_INVALID_ADDRESS)
+                {
+                    if (log)
+                        module_sp->LogMessage(log.get(), "failed to locate the strtab in memory");
+                    return 0;
+                }
+            }
+            else
             {
                 if (log)
-                    module_sp->LogMessage(log.get(), "failed to locate the strtab in memory");
+                    module_sp->LogMessage(log.get(), "failed to read strtab data");
                 return 0;
             }
         }
-        else if (strtab_data.GetByteSize() == 0)
-        {
-            if (log)
-                module_sp->LogMessage(log.get(), "failed to read strtab data");
-            return 0;
-        }
 
         const ConstString &g_segment_name_TEXT = GetSegmentNameTEXT();
         const ConstString &g_segment_name_DATA = GetSegmentNameDATA();
@@ -1449,14 +1453,7 @@ ObjectFileMachO::ParseSymtab (bool minimize)
             SymbolType type = eSymbolTypeInvalid;
             const char *symbol_name = NULL;
             
-            if (process)
-            {
-                const addr_t str_addr = strtab_addr + nlist.n_strx;
-                Error str_error;
-                if (process->ReadCStringFromMemory(str_addr, memory_symbol_name, str_error))
-                    symbol_name = memory_symbol_name.c_str();
-            }
-            else
+            if (have_strtab_data)
             {
                 symbol_name = strtab_data.PeekCStr(nlist.n_strx);
                 
@@ -1476,6 +1473,13 @@ ObjectFileMachO::ParseSymtab (bool minimize)
                 if (symbol_name[0] == '\0')
                     symbol_name = NULL;
             }
+            else
+            {
+                const addr_t str_addr = strtab_addr + nlist.n_strx;
+                Error str_error;
+                if (process->ReadCStringFromMemory(str_addr, memory_symbol_name, str_error))
+                    symbol_name = memory_symbol_name.c_str();
+            }
             const char *symbol_name_non_abi_mangled = NULL;
 
             SectionSP symbol_section;