Fix the explicit frames unwinding on Unix
authorJan Vorlicek <janvorli@microsoft.com>
Thu, 18 Feb 2016 22:36:43 +0000 (23:36 +0100)
committerJan Vorlicek <janvorli@microsoft.com>
Fri, 19 Feb 2016 11:21:20 +0000 (12:21 +0100)
commitf99b954da38a227085529c980412b317defa6688
tree53d473933b31a13a824d2923c41d5f46c9013828
parentc1d667e8438a7583a20ffe3508a4afa8857b8ae8
Fix the explicit frames unwinding on Unix

This change fixes a problem when exception unwinds native frames of code that contains
explicit frames. There were two issues. First, the destructor of the explicit frame
base class Frame that was responsible for popping the frames was missing switch to
GC cooperative mode and so it could pop frames that GC was currently walking.
And second, after adding the switch to cooperative mode, it turned out that if a
thread gets blocked in the Frame destructor due to GC and the stack walker tries to
get stack cookie from FrameWithCookie wrapper of a class derived from the Frame,
it fails since the vtable pointer was already reset to the vtable of the base Frame
class and it detects that as an invalid case.

The fix was to add destructors to all final classes derived from Frame and perform
the frame popping from there.

Commit migrated from https://github.com/dotnet/coreclr/commit/0e14371a2638dd27222fd63af6032b5cd1a64add
src/coreclr/src/vm/frames.cpp
src/coreclr/src/vm/frames.h