diff --git a/panda/src/pipeline/contextSwitch.c b/panda/src/pipeline/contextSwitch.c index 8f0abbf562..329da296e7 100644 --- a/panda/src/pipeline/contextSwitch.c +++ b/panda/src/pipeline/contextSwitch.c @@ -257,7 +257,11 @@ setup_context_1(void) { /* Now we overwrite the stack pointer value in the saved register context. This doesn't work with all implementations of setjmp/longjmp. */ - (*(void **)&temp[CS_JB_SP]) = (st_stack + st_stack_size); + + /* We give ourselves a small buffer of unused space at the top + of the stack, to allow for the stack frame and such that this + code might be assuming is there. */ + (*(void **)&temp[CS_JB_SP]) = (st_stack + st_stack_size - 0x100); /* And finally, we place ourselves on the new stack by using longjmp() to reload the modified context. */ diff --git a/panda/src/pipeline/threadSimpleImpl.cxx b/panda/src/pipeline/threadSimpleImpl.cxx index d514c558c2..ee37636a8b 100644 --- a/panda/src/pipeline/threadSimpleImpl.cxx +++ b/panda/src/pipeline/threadSimpleImpl.cxx @@ -79,7 +79,7 @@ ThreadSimpleImpl:: #ifdef WIN32 VirtualFree(_stack, 0, MEM_RELEASE); #else - munmap(_stack, _stack_alloc_size); + munmap(_stack, _stack_size); #endif } } @@ -115,25 +115,13 @@ start(ThreadPriority priority, bool joinable) { nassertr(_stack == NULL, false); _stack_size = (size_t)thread_stack_size; - // We allocate the requested stack size, plus an additional tiny - // buffer to allow room for the code to access values on the - // currently executing stack frame at the time we switch the stack. - _stack_alloc_size = _stack_size + 0x100; - #ifdef WIN32 // Windows case. - SYSTEM_INFO sysinfo; - GetSystemInfo(&sysinfo); - - size_t page_size = (size_t)sysinfo.dwPageSize; - _stack_alloc_size = ((_stack_alloc_size + page_size - 1) / page_size) * page_size; - _stack = (unsigned char *)VirtualAlloc(NULL, _stack_alloc_size, MEM_COMMIT | MEM_RESERVE, + _stack = (unsigned char *)VirtualAlloc(NULL, _stack_size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); #else // Posix case. - size_t page_size = getpagesize(); - _stack_alloc_size = ((_stack_alloc_size + page_size - 1) / page_size) * page_size; - _stack = (unsigned char *)mmap(NULL, _stack_alloc_size, PROT_READ | PROT_WRITE | PROT_EXEC, + _stack = (unsigned char *)mmap(NULL, _stack_size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0); #endif diff --git a/panda/src/pipeline/threadSimpleImpl.h b/panda/src/pipeline/threadSimpleImpl.h index d2e0125611..9f8b035336 100644 --- a/panda/src/pipeline/threadSimpleImpl.h +++ b/panda/src/pipeline/threadSimpleImpl.h @@ -115,7 +115,6 @@ private: ThreadContext _context; unsigned char *_stack; size_t _stack_size; - size_t _stack_alloc_size; #ifdef HAVE_PYTHON // If we might be working with Python, we have to manage the Python