diff options
| author | vincentdarley <vincentdarley> | 2001-08-11 18:43:21 (GMT) |
|---|---|---|
| committer | vincentdarley <vincentdarley> | 2001-08-11 18:43:21 (GMT) |
| commit | e3741eca171312bf8476b7f6e488758bb275dfae (patch) | |
| tree | 161d118d7dfe1f3c40a3f01d82e371f371430537 /generic/tclFCmd.c | |
| parent | 855409ddd287ab96f61efe10eedc72a31bcfd9e0 (diff) | |
| download | tcl-e3741eca171312bf8476b7f6e488758bb275dfae.zip tcl-e3741eca171312bf8476b7f6e488758bb275dfae.tar.gz tcl-e3741eca171312bf8476b7f6e488758bb275dfae.tar.bz2 | |
vfs-related fixes
Diffstat (limited to 'generic/tclFCmd.c')
| -rw-r--r-- | generic/tclFCmd.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/generic/tclFCmd.c b/generic/tclFCmd.c index e0eccf9..8576ca8 100644 --- a/generic/tclFCmd.c +++ b/generic/tclFCmd.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclFCmd.c,v 1.8 2001/08/07 01:00:02 hobbs Exp $ + * RCS: @(#) $Id: tclFCmd.c,v 1.9 2001/08/11 18:43:21 vincentdarley Exp $ */ #include "tclInt.h" @@ -315,6 +315,7 @@ TclFileDeleteCmd(interp, objc, objv) { int i, force, result; Tcl_Obj *errfile; + Tcl_Obj *errorBuffer = NULL; i = FileForceOption(interp, objc - 2, objv + 2, &force); if (i < 0) { @@ -354,7 +355,10 @@ TclFileDeleteCmd(interp, objc, objv) result = TCL_ERROR; } } else if (S_ISDIR(statBuf.st_mode)) { - Tcl_Obj *errorBuffer = NULL; + /* + * We own a reference count on errorBuffer, if it was set + * as a result of this call. + */ result = Tcl_FSRemoveDirectory(objv[i], force, &errorBuffer); if (result != TCL_OK) { if ((force == 0) && (errno == EEXIST)) { @@ -379,7 +383,13 @@ TclFileDeleteCmd(interp, objc, objv) result = Tcl_FSDeleteFile(objv[i]); } - if (result == TCL_ERROR) { + if (result != TCL_OK) { + result = TCL_ERROR; + /* + * It is important that we break on error, otherwise we + * might end up owning reference counts on numerous + * errorBuffers. + */ break; } } @@ -396,6 +406,9 @@ TclFileDeleteCmd(interp, objc, objv) Tcl_GetString(errfile), "\": ", Tcl_PosixError(interp), (char *) NULL); } + if (errorBuffer != NULL) { + Tcl_DecrRefCount(errorBuffer); + } } done: return result; |
