summaryrefslogtreecommitdiffstats
path: root/generic/tclIO.c
diff options
context:
space:
mode:
authordas <das>2007-09-17 12:07:30 (GMT)
committerdas <das>2007-09-17 12:07:30 (GMT)
commit3ad66d99fd717405fb14ba64c0c8560bee0dc477 (patch)
tree2999793a19d9b0b200f79aa7039bd8efeb13e67e /generic/tclIO.c
parenta7dee15a2f5e2bfc9ddc2d1bac7db2b82425aa3d (diff)
downloadtcl-3ad66d99fd717405fb14ba64c0c8560bee0dc477.zip
tcl-3ad66d99fd717405fb14ba64c0c8560bee0dc477.tar.gz
tcl-3ad66d99fd717405fb14ba64c0c8560bee0dc477.tar.bz2
(CopyData): avoid leaking msg and errObj (if interp == NULL)
Diffstat (limited to 'generic/tclIO.c')
-rw-r--r--generic/tclIO.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c
index 145d27a..79b8fa1 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.123 2007/09/06 18:13:19 dgp Exp $
+ * RCS: @(#) $Id: tclIO.c,v 1.124 2007/09/17 12:07:30 das Exp $
*/
#include "tclInt.h"
@@ -8208,13 +8208,13 @@ CopyData(
* Check for unreported background errors.
*/
- Tcl_GetChannelError (inChan, &msg);
+ Tcl_GetChannelError(inChan, &msg);
if ((inStatePtr->unreportedError != 0) || (msg != NULL)) {
Tcl_SetErrno(inStatePtr->unreportedError);
inStatePtr->unreportedError = 0;
goto readError;
}
- Tcl_GetChannelError (outChan, &msg);
+ Tcl_GetChannelError(outChan, &msg);
if ((outStatePtr->unreportedError != 0) || (msg != NULL)) {
Tcl_SetErrno(outStatePtr->unreportedError);
outStatePtr->unreportedError = 0;
@@ -8241,13 +8241,19 @@ CopyData(
if (size < 0) {
readError:
- TclNewObj(errObj);
- Tcl_AppendStringsToObj(errObj, "error reading \"",
- Tcl_GetChannelName(inChan), "\": ", NULL);
+ if (interp) {
+ TclNewObj(errObj);
+ Tcl_AppendStringsToObj(errObj, "error reading \"",
+ Tcl_GetChannelName(inChan), "\": ", NULL);
+ if (msg != NULL) {
+ Tcl_AppendObjToObj(errObj, msg);
+ } else {
+ Tcl_AppendStringsToObj(errObj, Tcl_PosixError(interp),
+ NULL);
+ }
+ }
if (msg != NULL) {
- Tcl_AppendObjToObj(errObj,msg);
- } else {
- Tcl_AppendStringsToObj(errObj, Tcl_PosixError(interp), NULL);
+ Tcl_DecrRefCount(msg);
}
break;
} else if (underflow) {
@@ -8305,13 +8311,19 @@ CopyData(
if (sizeb < 0) {
writeError:
- TclNewObj(errObj);
- Tcl_AppendStringsToObj(errObj, "error writing \"",
- Tcl_GetChannelName(outChan), "\": ", NULL);
+ if (interp) {
+ TclNewObj(errObj);
+ Tcl_AppendStringsToObj(errObj, "error writing \"",
+ Tcl_GetChannelName(outChan), "\": ", NULL);
+ if (msg != NULL) {
+ Tcl_AppendObjToObj(errObj, msg);
+ } else {
+ Tcl_AppendStringsToObj(errObj, Tcl_PosixError(interp),
+ NULL);
+ }
+ }
if (msg != NULL) {
- Tcl_AppendObjToObj(errObj,msg);
- } else {
- Tcl_AppendStringsToObj(errObj, Tcl_PosixError(interp), NULL);
+ Tcl_DecrRefCount(msg);
}
break;
}