ntdll: Program could modify Dr* registers in segv_handler too.

Vitaliy Margolen wine-patch at kievinfo.com
Sat Dec 10 15:29:49 CST 2005


ChangeLog:
ntdll: Program could modify Dr* registers in segv_handler too.

 dlls/ntdll/signal_i386.c |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)
-------------- next part --------------
16282d82f33f22646904900e73f1aebb972f795c
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index ca42568..b2628bb 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -914,6 +914,8 @@ static inline DWORD get_fpu_code( const 
  */
 static void WINAPI raise_segv_exception( EXCEPTION_RECORD *rec, CONTEXT *context )
 {
+    DWORD dr0, dr1, dr2, dr3, dr6, dr7;
+
     switch(rec->ExceptionCode)
     {
     case EXCEPTION_ACCESS_VIOLATION:
@@ -933,7 +935,23 @@ static void WINAPI raise_segv_exception(
         }
         break;
     }
+
+    dr0 = context->Dr0;
+    dr1 = context->Dr1;
+    dr2 = context->Dr2;
+    dr3 = context->Dr3;
+    dr6 = context->Dr6;
+    dr7 = context->Dr7;
+
     __regs_RtlRaiseException( rec, context );
+
+    if (dr0 != context->Dr0 || dr1 != context->Dr1 || dr2 != context->Dr2 ||
+        dr3 != context->Dr3 || dr6 != context->Dr6 || dr7 != context->Dr7)
+    {
+        /* the debug registers have changed, set the new values */
+        context->ContextFlags = CONTEXT_DEBUG_REGISTERS;
+        NtSetContextThread(GetCurrentThread(), context);
+    }
 }
 
 


More information about the wine-patches mailing list