[PATCH 2/7] msvcrt: Clean up registered C++ object in handler.
Piotr Caban
piotr.caban at gmail.com
Tue May 30 05:44:47 CDT 2017
On 05/29/17 21:56, Piotr Caban wrote:
> On 05/24/17 02:55, Daniel Lehman wrote:
>> +static DWORD cxx_catch_cleanup(EXCEPTION_RECORD *rec,
>> EXCEPTION_REGISTRATION_RECORD *frame,
>> + CONTEXT *context,
>> EXCEPTION_REGISTRATION_RECORD **pdispatcher)
>> +{
>> + if (rec->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND))
>> + {
>> + thread_data_t *data = msvcrt_get_thread_data();
>> + frame_info *cur;
>> +
>> + if (cxx_is_consolidate(rec))
> Is this condition really needed? Shouldn't we clean the object no matter
> what's the reason of unwind?
>
>> + {
>> + rec = (void*)rec->ExceptionInformation[4];
>> +
>> + for (cur = data->frame_info_head; cur; cur = cur->next)
>> + {
>> + if ((ULONG64)cur <= (ULONG64)frame)
> This condition is not working. It's making assumption about order of
> catch_frame and frame_info variables on stack while they are declared
> this way:
>> + EXCEPTION_REGISTRATION_RECORD catch_frame;
>> cxx_frame_info frame_info;
> Shouldn't the cxx_catch_cleanup just unregister the object that was
> registered in call_catch_block?
Here's a test case that demonstrate the problem with cur <= frame
comparison:
try {
try { int *p = NULL; *p = 0x42; }
catch (klass x) { throw 1; }
} catch (int i) { }
try { throw 1; }
catch(...) {}
Cheers,
Piotr
More information about the wine-devel
mailing list