diff options
author | nijtmans <nijtmans> | 2009-11-18 22:41:41 (GMT) |
---|---|---|
committer | nijtmans <nijtmans> | 2009-11-18 22:41:41 (GMT) |
commit | b57c08b7e2ccf91e1096b30f2170d2f603f59e0c (patch) | |
tree | 01d099afa4749afee67d0a99e9e442dcebb9cc45 /generic/tclIO.c | |
parent | a9191c772b1a15d5f705b2d4fa807388370ac0f8 (diff) | |
download | tcl-b57c08b7e2ccf91e1096b30f2170d2f603f59e0c.zip tcl-b57c08b7e2ccf91e1096b30f2170d2f603f59e0c.tar.gz tcl-b57c08b7e2ccf91e1096b30f2170d2f603f59e0c.tar.bz2 |
Fix [Bug 2849797]: channel name inconsistencies as suggested by DKF
minor *** POTENTIAL INCOMPATIBILITY *** because
Tcl_CreateChannel() and its derivatives, now
sometimes ignore their "chanName" argument.
Diffstat (limited to 'generic/tclIO.c')
-rw-r--r-- | generic/tclIO.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c index e8d231a..7044381 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -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: tclIO.c,v 1.167 2009/11/12 17:25:18 andreas_kupries Exp $ + * RCS: @(#) $Id: tclIO.c,v 1.168 2009/11/18 22:41:41 nijtmans Exp $ */ #include "tclInt.h" @@ -1332,6 +1332,7 @@ Tcl_CreateChannel( ChannelState *statePtr; /* The stack-level independent state info for * the channel. */ const char *name; + char *tmp; ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); /* @@ -1364,14 +1365,16 @@ Tcl_CreateChannel( */ if (chanName != NULL) { - char *tmp = ckalloc((unsigned) (strlen(chanName) + 1)); + unsigned len = strlen(chanName) + 1; + /* make sure we allocate at least 7 bytes, so it fits for "stdout" later */ + tmp = ckalloc((len < 7) ? 7 : len); - statePtr->channelName = tmp; strcpy(tmp, chanName); } else { - Tcl_Panic("Tcl_CreateChannel: NULL channel name"); + tmp = ckalloc(7); + tmp[0] = '\0'; } - + statePtr->channelName = tmp; statePtr->flags = mask; /* @@ -1473,14 +1476,17 @@ Tcl_CreateChannel( */ if ((tsdPtr->stdinChannel == NULL) && (tsdPtr->stdinInitialized == 1)) { + strcpy(tmp, "stdin"); Tcl_SetStdChannel((Tcl_Channel) chanPtr, TCL_STDIN); Tcl_RegisterChannel(NULL, (Tcl_Channel) chanPtr); } else if ((tsdPtr->stdoutChannel == NULL) && (tsdPtr->stdoutInitialized == 1)) { + strcpy(tmp, "stdout"); Tcl_SetStdChannel((Tcl_Channel) chanPtr, TCL_STDOUT); Tcl_RegisterChannel(NULL, (Tcl_Channel) chanPtr); } else if ((tsdPtr->stderrChannel == NULL) && (tsdPtr->stderrInitialized == 1)) { + strcpy(tmp, "stderr"); Tcl_SetStdChannel((Tcl_Channel) chanPtr, TCL_STDERR); Tcl_RegisterChannel(NULL, (Tcl_Channel) chanPtr); } |