Index: include/tool/coroutine.h
--- include/tool/coroutine.h.orig
+++ include/tool/coroutine.h
@@ -216,6 +216,8 @@ class COROUTINE (public)
 
     ~COROUTINE()
     {
+        if (m_stack)
+            munmap(m_stack.release(), m_stacksize);
 #ifdef KICAD_USE_VALGRIND
         VALGRIND_STACK_DEREGISTER( m_valgrind_stack );
 #endif
@@ -384,7 +386,6 @@ class COROUTINE (public)
 
         wxLogTrace( kicadTraceCoroutineStack, wxT( "COROUTINE::doCall" ) );
 
-#ifndef LIBCONTEXT_HAS_OWN_STACK
         assert( !m_stack );
 
         const std::size_t systemPageSize = SystemPageSize();
@@ -408,7 +409,6 @@ class COROUTINE (public)
 #ifdef KICAD_USE_VALGRIND
         m_valgrind_stack = VALGRIND_STACK_REGISTER( sp, m_stack.get() );
 #endif
-#endif
 
 #ifdef KICAD_SANITIZE_THREADS
         // Create a new fiber to go with the new context
@@ -469,9 +469,8 @@ class COROUTINE (public)
         if( !mem )
             throw std::bad_alloc();
 #else
-        void* mem = ::mmap( 0, aAllocSize, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0 );
-
-        if( mem == (void*) -1 )
+        void *mem = ::mmap(NULL, aAllocSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_STACK, -1, 0);
+        if (mem == MAP_FAILED)
             throw std::bad_alloc();
 #endif
         return mem;
