Skip to content

Commit 8e3be05

Browse files
vargazjoncham
authored andcommitted
[sdb] Avoid stack overflows caused by recursive calls between suspend_current () and invoke_method (). (mono#13362)
Fixes mono#13261.
1 parent 876c538 commit 8e3be05

File tree

1 file changed

+28
-23
lines changed

1 file changed

+28
-23
lines changed

mono/mini/debugger-agent.c

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3243,37 +3243,44 @@ suspend_current (void)
32433243
tls = (DebuggerTlsData *)mono_native_tls_get_value (debugger_tls_id);
32443244
g_assert (tls);
32453245

3246-
mono_coop_mutex_lock (&suspend_mutex);
3246+
gboolean do_resume = FALSE;
3247+
while (!do_resume) {
3248+
mono_coop_mutex_lock (&suspend_mutex);
32473249

3248-
tls->suspending = FALSE;
3249-
tls->really_suspended = TRUE;
3250+
tls->suspending = FALSE;
3251+
tls->really_suspended = TRUE;
32503252

3251-
if (!tls->suspended) {
3252-
tls->suspended = TRUE;
3253-
mono_coop_sem_post (&suspend_sem);
3254-
}
3253+
if (!tls->suspended) {
3254+
tls->suspended = TRUE;
3255+
mono_coop_sem_post (&suspend_sem);
3256+
}
32553257

3256-
DEBUG_PRINTF (1, "[%p] Suspended.\n", (gpointer) (gsize) mono_native_thread_id_get ());
3258+
DEBUG_PRINTF (1, "[%p] Suspended.\n", (gpointer) (gsize) mono_native_thread_id_get ());
32573259

3258-
while (suspend_count - tls->resume_count > 0) {
3259-
mono_coop_cond_wait (&suspend_cond, &suspend_mutex);
3260-
}
3260+
while (suspend_count - tls->resume_count > 0) {
3261+
mono_coop_cond_wait (&suspend_cond, &suspend_mutex);
3262+
}
32613263

3262-
tls->suspended = FALSE;
3263-
tls->really_suspended = FALSE;
3264+
tls->suspended = FALSE;
3265+
tls->really_suspended = FALSE;
32643266

3265-
threads_suspend_count --;
3267+
threads_suspend_count --;
32663268

3267-
mono_coop_mutex_unlock (&suspend_mutex);
3269+
mono_coop_mutex_unlock (&suspend_mutex);
32683270

3269-
DEBUG_PRINTF (1, "[%p] Resumed.\n", (gpointer) (gsize) mono_native_thread_id_get ());
3271+
DEBUG_PRINTF (1, "[%p] Resumed.\n", (gpointer) (gsize) mono_native_thread_id_get ());
32703272

3271-
if (tls->pending_invoke) {
3272-
/* Save the original context */
3273-
tls->pending_invoke->has_ctx = TRUE;
3274-
tls->pending_invoke->ctx = tls->context.ctx;
3273+
if (tls->pending_invoke) {
3274+
/* Save the original context */
3275+
tls->pending_invoke->has_ctx = TRUE;
3276+
tls->pending_invoke->ctx = tls->context.ctx;
32753277

3276-
invoke_method ();
3278+
invoke_method ();
3279+
3280+
/* Have to suspend again */
3281+
} else {
3282+
do_resume = TRUE;
3283+
}
32773284
}
32783285

32793286
/* The frame info becomes invalid after a resume */
@@ -8688,8 +8695,6 @@ invoke_method (void)
86888695

86898696
g_free (invoke->p);
86908697
g_free (invoke);
8691-
8692-
suspend_current ();
86938698
}
86948699

86958700
static gboolean

0 commit comments

Comments
 (0)