Ticket UUID: | 1654104 | |||
Title: | broken stack checking code | |||
Type: | Patch | Version: | None | |
Submitter: | mmaslano | Created on: | 2007-02-07 12:46:56 | |
Subsystem: | 41. Memory Allocation | Assigned To: | hobbs | |
Priority: | 5 Medium | Severity: | ||
Status: | Closed | Last Modified: | 2007-02-09 06:41:12 | |
Resolution: | Fixed | Closed By: | hobbs | |
Closed on: | 2007-02-08 23:41:12 | |||
Description: |
on x86_64 kernel, 32-bit mock root, pthread_getattr_np returns in the initial thread how much the stack can actually grow at that point, if I try say: extern int TclpThreadGetStackSize(void); int main (void) { __builtin_printf ("%x\n", TclpThreadGetStackSize ()); } linked against -ltcl8.5 it prints aa650000 TclpThreadGetStackSize it must return size_t TclpCheckStackSpace if (tsdPtr->initialised == 0) we didn't compute stack size before. But, when GetStackSize was computed using pthread_getattr_np rather than say getrlimit this assumption is wrong for the initial thread. There pthread_getattr_np changes over time, as memory is mmapped/unmapped, with RLIMIT_STACK being the upper limit for it. TclpCheckStackSpace ptrdiff_t is a signed type and if tsdPtr->stackSize is bigger than half of the address space. For Linux and most other targets ptrdiff_t is the same size as size_t, only size_t is unsigned, so guess just - if (stackUsed < (ptrdiff_t) tsdPtr->stackSize) { + if ((size_t) stackUsed < tsdPtr->stackSize) { and a fix for TclpThreadGetStackSize return value could be enough. | |||
User Comments: |
hobbs added on 2007-02-09 06:41:12:
Logged In: YES user_id=72656 Originator: NO Noted and corrected at about the same time. Use of size_t for stackUsed. mmaslano added on 2007-02-07 19:46:56: File Added - 214873: tcl-8.5a5-stackchk.patch |
Attachments:
- tcl-8.5a5-stackchk.patch [download] added by mmaslano on 2007-02-07 19:46:56. [details]