libmthread: Fix guard page mapping.
Edited by David van Moolenbroek to deallocate the guard page as well. Note that while the new approach is better in theory (previously, the hole could end up being filled by another allocated page), guard page protection is now broken in practice, because VM does not support setting specific page permissions (in this case, PROT_NONE). Change-Id: I882624f5d152d3ebe82fca649cbad85aa4931780
This commit is contained in:
parent
0485087c58
commit
75206e2f3e
1 changed files with 16 additions and 4 deletions
|
@ -422,8 +422,10 @@ void *arg;
|
||||||
# error "Unsupported platform"
|
# error "Unsupported platform"
|
||||||
#endif
|
#endif
|
||||||
stacksize = guarded_stacksize;
|
stacksize = guarded_stacksize;
|
||||||
if (munmap(guard_start, MTHREAD_GUARDSIZE) != 0)
|
/* Mere unmapping could allow a later allocation to fill the gap. */
|
||||||
mthread_panic("unable to unmap stack space for guard");
|
if (mmap(guard_start, MTHREAD_GUARDSIZE, PROT_NONE,
|
||||||
|
MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0) != guard_start)
|
||||||
|
mthread_panic("unable to overmap stack space for guard");
|
||||||
tcb->m_context.uc_stack.ss_sp = guard_end;
|
tcb->m_context.uc_stack.ss_sp = guard_end;
|
||||||
} else
|
} else
|
||||||
tcb->m_context.uc_stack.ss_sp = stackaddr;
|
tcb->m_context.uc_stack.ss_sp = stackaddr;
|
||||||
|
@ -444,6 +446,9 @@ mthread_thread_t thread;
|
||||||
/* Reset the thread to its default values. Free the allocated stack space. */
|
/* Reset the thread to its default values. Free the allocated stack space. */
|
||||||
|
|
||||||
mthread_tcb_t *rt;
|
mthread_tcb_t *rt;
|
||||||
|
size_t stacksize;
|
||||||
|
char *stackaddr;
|
||||||
|
|
||||||
if (!isokthreadid(thread)) mthread_panic("Invalid thread id");
|
if (!isokthreadid(thread)) mthread_panic("Invalid thread id");
|
||||||
|
|
||||||
rt = mthread_find_tcb(thread);
|
rt = mthread_find_tcb(thread);
|
||||||
|
@ -456,8 +461,15 @@ mthread_thread_t thread;
|
||||||
rt->m_cond = NULL;
|
rt->m_cond = NULL;
|
||||||
if (rt->m_attr.ma_stackaddr == NULL) { /* We allocated stack space */
|
if (rt->m_attr.ma_stackaddr == NULL) { /* We allocated stack space */
|
||||||
if (rt->m_context.uc_stack.ss_sp) {
|
if (rt->m_context.uc_stack.ss_sp) {
|
||||||
if (munmap(rt->m_context.uc_stack.ss_sp,
|
stacksize = rt->m_context.uc_stack.ss_size;
|
||||||
rt->m_context.uc_stack.ss_size) != 0) {
|
stackaddr = rt->m_context.uc_stack.ss_sp;
|
||||||
|
#if defined(__i386__) || defined(__arm__)
|
||||||
|
stacksize += MTHREAD_GUARDSIZE;
|
||||||
|
stackaddr -= MTHREAD_GUARDSIZE;
|
||||||
|
#else
|
||||||
|
# error "Unsupported platform"
|
||||||
|
#endif
|
||||||
|
if (munmap(stackaddr, stacksize) != 0) {
|
||||||
mthread_panic("unable to unmap memory");
|
mthread_panic("unable to unmap memory");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue