Tcl Source Code

View Ticket
Login
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: