Skip to content

Commit 5ebfca2

Browse files
janvorliCopilot
andauthored
Fix Thread::IsAddressInStack for interpreter (#116818)
* Fix Thread::IsAddressInStack for interpreter The check is used at several places to verify that e.g. `StringHandleOnStack` is really on stack. It needs to be updated to take the interpreter stack into account tooo. * Update src/coreclr/vm/threads.cpp Co-authored-by: Copilot <[email protected]> * Fix interpreter stack comparison --------- Co-authored-by: Copilot <[email protected]>
1 parent 281d575 commit 5ebfca2

File tree

3 files changed

+44
-26
lines changed

3 files changed

+44
-26
lines changed

src/coreclr/vm/interpexec.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,14 @@ struct InterpMethodContextFrame
5050

5151
struct InterpThreadContext
5252
{
53-
int8_t *pStackStart;
54-
int8_t *pStackEnd;
53+
PTR_INT8 pStackStart;
54+
PTR_INT8 pStackEnd;
5555

5656
// This stack pointer is the highest stack memory that can be used by the current frame. This does not
5757
// change throughout the execution of a frame and it is essentially the upper limit of the execution
5858
// stack pointer. It is needed when re-entering interp, to know from which address we can start using
5959
// stack, and also needed for the GC to be able to scan the stack.
60-
int8_t *pStackPointer;
60+
PTR_INT8 pStackPointer;
6161

6262
FrameDataAllocator frameDataAllocator;
6363

src/coreclr/vm/threads.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7784,8 +7784,47 @@ InterpThreadContext* Thread::GetInterpThreadContext()
77847784
}
77857785
#endif // FEATURE_INTERPRETER
77867786

7787+
/* static */
7788+
BOOL Thread::IsAddressInCurrentStack(PTR_VOID addr)
7789+
{
7790+
LIMITED_METHOD_DAC_CONTRACT;
7791+
Thread* currentThread = GetThreadNULLOk();
7792+
if (currentThread == NULL)
7793+
{
7794+
return FALSE;
7795+
}
7796+
7797+
#ifdef FEATURE_INTERPRETER
7798+
InterpThreadContext* pInterpThreadContext = currentThread->m_pInterpThreadContext;
7799+
if ((pInterpThreadContext != NULL) && ((PTR_VOID)pInterpThreadContext->pStackStart <= addr) && (addr < (PTR_VOID)pInterpThreadContext->pStackPointer))
7800+
{
7801+
return TRUE;
7802+
}
7803+
#endif // FEATURE_INTERPRETER
7804+
7805+
PTR_VOID sp = dac_cast<PTR_VOID>(GetCurrentSP());
7806+
_ASSERTE(currentThread->m_CacheStackBase != NULL);
7807+
_ASSERTE(sp < currentThread->m_CacheStackBase);
7808+
return sp < addr && addr <= currentThread->m_CacheStackBase;
7809+
}
7810+
77877811
#endif // #ifndef DACCESS_COMPILE
77887812

7813+
BOOL Thread::IsAddressInStack (PTR_VOID addr) const
7814+
{
7815+
LIMITED_METHOD_DAC_CONTRACT;
7816+
_ASSERTE(m_CacheStackBase != NULL);
7817+
_ASSERTE(m_CacheStackLimit != NULL);
7818+
_ASSERTE(m_CacheStackLimit < m_CacheStackBase);
7819+
#ifdef FEATURE_INTERPRETER
7820+
if ((m_pInterpThreadContext != NULL) && ((PTR_VOID)m_pInterpThreadContext->pStackStart <= addr) && (addr < (PTR_VOID)m_pInterpThreadContext->pStackPointer))
7821+
{
7822+
return TRUE;
7823+
}
7824+
#endif // FEATURE_INTERPRETER
7825+
return m_CacheStackLimit < addr && addr <= m_CacheStackBase;
7826+
}
7827+
77897828
#ifdef DACCESS_COMPILE
77907829

77917830
void

src/coreclr/vm/threads.h

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2485,29 +2485,8 @@ class Thread
24852485
public:
24862486
static BOOL UniqueStack(void* startLoc = 0);
24872487

2488-
BOOL IsAddressInStack (PTR_VOID addr) const
2489-
{
2490-
LIMITED_METHOD_DAC_CONTRACT;
2491-
_ASSERTE(m_CacheStackBase != NULL);
2492-
_ASSERTE(m_CacheStackLimit != NULL);
2493-
_ASSERTE(m_CacheStackLimit < m_CacheStackBase);
2494-
return m_CacheStackLimit < addr && addr <= m_CacheStackBase;
2495-
}
2496-
2497-
static BOOL IsAddressInCurrentStack (PTR_VOID addr)
2498-
{
2499-
LIMITED_METHOD_DAC_CONTRACT;
2500-
Thread* currentThread = GetThreadNULLOk();
2501-
if (currentThread == NULL)
2502-
{
2503-
return FALSE;
2504-
}
2505-
2506-
PTR_VOID sp = dac_cast<PTR_VOID>(GetCurrentSP());
2507-
_ASSERTE(currentThread->m_CacheStackBase != NULL);
2508-
_ASSERTE(sp < currentThread->m_CacheStackBase);
2509-
return sp < addr && addr <= currentThread->m_CacheStackBase;
2510-
}
2488+
BOOL IsAddressInStack (PTR_VOID addr) const;
2489+
static BOOL IsAddressInCurrentStack (PTR_VOID addr);
25112490

25122491
// DetermineIfGuardPagePresent returns TRUE if the thread's stack contains a proper guard page. This function
25132492
// makes a physical check of the stack, rather than relying on whether or not the CLR is currently processing a

0 commit comments

Comments
 (0)