The program below (when compiled with MSVC6, multithreaded DLL runtime) only prints "in first handler" on ReactOS and then gets into an endless exception loop:
int main(int argc, char *argv[]) { __try { RaiseException(0x55aa, 0, 0, NULL); } __except(EXCEPTION_EXECUTE_HANDLER) { printf("in first handler\n"); }
__try { RaiseException(0xaacc, 0, 0, NULL); } __except(EXCEPTION_EXECUTE_HANDLER) { printf("in second handler\n"); }
return 0; }
I believe the reason is that our RtlUnwind removes the target exception frame too, which it shouldn't do. The following patch seems to solve the issue:
Index: lib/rtl/i386/exception.c =================================================================== --- lib/rtl/i386/exception.c (revision 20225) +++ lib/rtl/i386/exception.c (working copy) @@ -333,7 +333,10 @@ RegistrationFrame2 = RegistrationFrame2->Next;
/* Remove this handler */ - RtlpSetExceptionList(OldFrame); + if (RegistrationFrame2 != RegistrationFrame) + { + RtlpSetExceptionList(OldFrame); + } } }
but I'm no expert on exception issues. Is this indeed the correct fix?
GvG