Author: gclayton
Date: Fri May 15 13:40:24 2015
New Revision: 237465

URL: http://llvm.org/viewvc/llvm-project?rev=237465&view=rev
Log:
OperatingSystem plug-ins need to avoid running code when fetching thread lists. 
This patch helps with that by making all SBValue objects that are fetched not 
try to do dynamic type resolution. Objective C can end up running code to fetch 
a list of all ISA pointers so we can tell when something is dynamic and this 
running code could cause the OS plug-in to continue the target.

This fix disabled dynamic types, fetches the new threads from the OS plug-in, 
then restores the setting.

<rdar://problem/20768407> 

Modified:
    lldb/trunk/include/lldb/Target/Target.h
    lldb/trunk/source/Target/Process.cpp
    lldb/trunk/source/Target/Target.cpp

Modified: lldb/trunk/include/lldb/Target/Target.h
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Target.h?rev=237465&r1=237464&r2=237465&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Target.h (original)
+++ lldb/trunk/include/lldb/Target/Target.h Fri May 15 13:40:24 2015
@@ -69,7 +69,10 @@ public:
 
     lldb::DynamicValueType
     GetPreferDynamicValue() const;
-    
+
+    bool
+    SetPreferDynamicValue (lldb::DynamicValueType d);
+
     bool
     GetDisableASLR () const;
     

Modified: lldb/trunk/source/Target/Process.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=237465&r1=237464&r2=237465&view=diff
==============================================================================
--- lldb/trunk/source/Target/Process.cpp (original)
+++ lldb/trunk/source/Target/Process.cpp Fri May 15 13:40:24 2015
@@ -1548,10 +1548,24 @@ Process::UpdateThreadListIfNeeded ()
                         for (size_t i=0; i<num_old_threads; ++i)
                             old_thread_list.GetThreadAtIndex(i, 
false)->ClearBackingThread();
 
+                        // Turn off dynamic types to ensure we don't run any 
expressions. Objective C
+                        // can run an expression to determine if a SBValue is 
a dynamic type or not
+                        // and we need to avoid this. OperatingSystem plug-ins 
can't run expressions
+                        // that require running code...
+
+                        Target &target = GetTarget();
+                        const lldb::DynamicValueType saved_prefer_dynamic = 
target.GetPreferDynamicValue ();
+                        if (saved_prefer_dynamic != lldb::eNoDynamicValues)
+                            
target.SetPreferDynamicValue(lldb::eNoDynamicValues);
+
                         // Now let the OperatingSystem plug-in update the 
thread list
+
                         os->UpdateThreadList (old_thread_list,  // Old list 
full of threads created by OS plug-in
                                               real_thread_list, // The actual 
thread list full of threads created by each lldb_private::Process subclass
                                               new_thread_list); // The new 
thread list that we will show to the user that gets filled in
+
+                        if (saved_prefer_dynamic != lldb::eNoDynamicValues)
+                            target.SetPreferDynamicValue(saved_prefer_dynamic);
                     }
                     else
                     {

Modified: lldb/trunk/source/Target/Target.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Target.cpp?rev=237465&r1=237464&r2=237465&view=diff
==============================================================================
--- lldb/trunk/source/Target/Target.cpp (original)
+++ lldb/trunk/source/Target/Target.cpp Fri May 15 13:40:24 2015
@@ -3217,6 +3217,14 @@ TargetProperties::GetPreferDynamicValue(
 }
 
 bool
+TargetProperties::SetPreferDynamicValue (lldb::DynamicValueType d)
+{
+    const uint32_t idx = ePropertyPreferDynamic;
+    return m_collection_sp->SetPropertyAtIndexAsEnumeration(NULL, idx, d);
+}
+
+
+bool
 TargetProperties::GetDisableASLR () const
 {
     const uint32_t idx = ePropertyDisableASLR;


_______________________________________________
lldb-commits mailing list
lldb-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

Reply via email to