diff options
author | KJ Tsanaktsidis <[email protected]> | 2023-11-12 13:24:55 +1100 |
---|---|---|
committer | KJ Tsanaktsidis <[email protected]> | 2024-01-12 17:29:48 +1100 |
commit | 4ba8f0dc993953d3ddda6328e3ef17a2fc2cbde5 (patch) | |
tree | 1f8045f587259f556974f3001d6a16bdf06b4fd1 /thread_win32.c | |
parent | 6a45320c256f25e9fcdf9d969a45b85c885e28f2 (diff) |
Pass down "stack start" variables from closer to the top of the stack
The implementation of `native_thread_init_stack` for the various
threading models can use the address of a local variable as part of the
calculation of the machine stack extents:
* pthreads uses it as a lower-bound on the start of the stack, because
glibc (and maybe other libcs) can store its own data on the stack
before calling into user code on thread creation.
* win32 uses it as an argument to VirtualQuery, which gets the extent of
the memory mapping which contains the variable
However, the local being used for this is actually allocated _inside_
the `native_thread_init_stack` frame; that means the caller might
allocate a VALUE on the stack that actually lies outside the bounds
stored in machine.stack_{start,end}.
A local variable from one level above the topmost frame that stores
VALUEs on the stack must be drilled down into the call to
`native_thread_init_stack` to be used in the calculation. This probably
doesn't _really_ matter for the win32 case (they'll be in the same
memory mapping so VirtualQuery should return the same thing), but
definitely could matter for the pthreads case.
[Bug #20001]
Diffstat (limited to 'thread_win32.c')
-rw-r--r-- | thread_win32.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/thread_win32.c b/thread_win32.c index bd983e0bd9..e92472cea9 100644 --- a/thread_win32.c +++ b/thread_win32.c @@ -582,7 +582,7 @@ rb_native_cond_destroy(rb_nativethread_cond_t *cond) } void -ruby_init_stack(volatile VALUE *addr) +ruby_init_stack(volatile void *addr) { } @@ -594,20 +594,20 @@ COMPILER_WARNING_PUSH COMPILER_WARNING_IGNORED(-Wmaybe-uninitialized) #endif static inline SIZE_T -query_memory_basic_info(PMEMORY_BASIC_INFORMATION mi) +query_memory_basic_info(PMEMORY_BASIC_INFORMATION mi, void *local_in_parent_frame) { - return VirtualQuery(mi, mi, sizeof(*mi)); + return VirtualQuery(local_in_parent_frame, mi, sizeof(*mi)); } COMPILER_WARNING_POP static void -native_thread_init_stack(rb_thread_t *th) +native_thread_init_stack(rb_thread_t *th, void *local_in_parent_frame) { MEMORY_BASIC_INFORMATION mi; char *base, *end; DWORD size, space; - CHECK_ERR(query_memory_basic_info(&mi)); + CHECK_ERR(query_memory_basic_info(&mi, local_in_parent_frame)); base = mi.AllocationBase; end = mi.BaseAddress; end += mi.RegionSize; @@ -638,7 +638,7 @@ thread_start_func_1(void *th_ptr) rb_thread_t *th = th_ptr; volatile HANDLE thread_id = th->nt->thread_id; - native_thread_init_stack(th); + native_thread_init_stack(th, &th); th->nt->interrupt_event = CreateEvent(0, TRUE, FALSE, 0); /* run */ |