mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-01 12:20:26 +02:00
Fix segfault in thread_mark
* libguile/threads.c (thread_mark): There is a window in which the thread has a handle but doesn't yet have the set of pointerless freelists, so don't unconditionally dereference t->pointerless_freelists.
This commit is contained in:
parent
c53d0f01dd
commit
c65ea594e9
1 changed files with 16 additions and 15 deletions
|
@ -100,21 +100,22 @@ thread_mark (GC_word *addr, struct GC_ms_entry *mark_stack_ptr,
|
|||
but GC doesn't know to trace them (as they are pointerless), so we
|
||||
need to do that here. See the comments at the top of libgc's
|
||||
gc_inline.h. */
|
||||
{
|
||||
size_t n;
|
||||
for (n = 0; n < SCM_INLINE_GC_FREELIST_COUNT; n++)
|
||||
{
|
||||
void *chain = t->pointerless_freelists[n];
|
||||
if (chain)
|
||||
{
|
||||
/* The first link is already marked by the freelist vector,
|
||||
so we just have to mark the tail. */
|
||||
while ((chain = *(void **)chain))
|
||||
mark_stack_ptr = GC_mark_and_push (chain, mark_stack_ptr,
|
||||
mark_stack_limit, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (t->pointerless_freelists)
|
||||
{
|
||||
size_t n;
|
||||
for (n = 0; n < SCM_INLINE_GC_FREELIST_COUNT; n++)
|
||||
{
|
||||
void *chain = t->pointerless_freelists[n];
|
||||
if (chain)
|
||||
{
|
||||
/* The first link is already marked by the freelist vector,
|
||||
so we just have to mark the tail. */
|
||||
while ((chain = *(void **)chain))
|
||||
mark_stack_ptr = GC_mark_and_push (chain, mark_stack_ptr,
|
||||
mark_stack_limit, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (t->vp)
|
||||
mark_stack_ptr = scm_i_vm_mark_stack (t->vp, mark_stack_ptr,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue