From 9c40be080e14950efdca421aea648fc80664787d Mon Sep 17 00:00:00 2001 From: hobbs Date: Tue, 17 Feb 2004 23:50:38 +0000 Subject: * tests/unixInit.test (unixInit-7.1): * unix/tclUnixInit.c (TclpInitPlatform): ensure the std fds exist to prevent crash condition [Bug #772288] --- ChangeLog | 20 +++++++++++++------- tests/unixInit.test | 15 ++++++++++++++- unix/tclUnixInit.c | 16 +++++++++++++++- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0dad0dd..62b57d6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2004-02-17 Jeff Hobbs + + * tests/unixInit.test (unixInit-7.1): + * unix/tclUnixInit.c (TclpInitPlatform): ensure the std fds exist + to prevent crash condition [Bug #772288] + 2004-02-17 Donal K. Fellows * generic/tclCompCmds.c (TclCompileSwitchCmd): Bozo mistake in @@ -739,14 +745,14 @@ 2003-11-10 Don Porter - * unix/tclUnixInit.c (TclpInitLibraryPath): - * win/tclWinInit.c (TclpInitLibraryPath): Fix for [Bug 832657] - that should not run afoul of startup constraints. + * unix/tclUnixInit.c (TclpInitLibraryPath): + * win/tclWinInit.c (TclpInitLibraryPath): Fix for [Bug 832657] + that should not run afoul of startup constraints. - * library/dde/pkgIndex.tcl: Added safeguards so that registry - * library/reg/pkgIndex.tcl: and dde packages are not offered - * win/tclWinDde.c: on non-Windows platforms. Bumped to - * win/tclWinReg.c: registry 1.1.3 and dde 1.3. + * library/dde/pkgIndex.tcl: Added safeguards so that registry + * library/reg/pkgIndex.tcl: and dde packages are not offered + * win/tclWinDde.c: on non-Windows platforms. Bumped to + * win/tclWinReg.c: registry 1.1.3 and dde 1.3. * win/Makefile.in: * win/configure.in: * win/makefile.bc: diff --git a/tests/unixInit.test b/tests/unixInit.test index 4ec31a5..9780738 100644 --- a/tests/unixInit.test +++ b/tests/unixInit.test @@ -10,7 +10,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: unixInit.test,v 1.31 2003/11/05 20:50:44 dgp Exp $ +# RCS: @(#) $Id: unixInit.test,v 1.32 2004/02/17 23:50:39 hobbs Exp $ package require tcltest 2 namespace import -force ::tcltest::* @@ -353,6 +353,19 @@ test unixInit-5.1 {Tcl_Init} {emptyTest unixOnly} { test unixInit-6.1 {Tcl_SourceRCFile} {emptyTest unixOnly} { } {} +test unixInit-7.1 {closed standard channel: Bug 772288} -body { + set tclsh [interpreter] + makeFile {puts [open /dev/null]} crash.tcl + makeFile [subst -nocommands { + close stdin + exec $tclsh crash.tcl + }] crashtest.tcl + exec $tclsh crashtest.tcl +} -cleanup { + removeFile crash.tcl + removeFile crashtest.tcl +} -returnCodes 0 + # cleanup if {[info exists oldlibrary]} { set env(TCL_LIBRARY) $oldlibrary diff --git a/unix/tclUnixInit.c b/unix/tclUnixInit.c index 779437c..39a8138 100644 --- a/unix/tclUnixInit.c +++ b/unix/tclUnixInit.c @@ -7,7 +7,7 @@ * Copyright (c) 1999 by Scriptics Corporation. * All rights reserved. * - * RCS: @(#) $Id: tclUnixInit.c,v 1.37 2003/11/18 23:29:47 davygrvy Exp $ + * RCS: @(#) $Id: tclUnixInit.c,v 1.38 2004/02/17 23:50:39 hobbs Exp $ */ #if defined(HAVE_CFBUNDLE) @@ -174,6 +174,20 @@ TclpInitPlatform() #endif /* + * Make sure, that the standard FDs exist. [Bug 772288] + */ + + if (TclOSseek(0, (Tcl_SeekOffset) 0, SEEK_CUR) == -1 && errno == EBADF) { + open("/dev/null", O_RDONLY); + } + if (TclOSseek(1, (Tcl_SeekOffset) 0, SEEK_CUR) == -1 && errno == EBADF) { + open("/dev/null", O_WRONLY); + } + if (TclOSseek(2, (Tcl_SeekOffset) 0, SEEK_CUR) == -1 && errno == EBADF) { + open("/dev/null", O_WRONLY); + } + + /* * The code below causes SIGPIPE (broken pipe) errors to * be ignored. This is needed so that Tcl processes don't * die if they create child processes (e.g. using "exec" or -- cgit v0.12