Attachment "2918610.patch" to
ticket [2918610fff]
added by
dgp
2010-01-06 01:51:09.
Index: generic/tclPathObj.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclPathObj.c,v
retrieving revision 1.66.2.10
diff -u -r1.66.2.10 tclPathObj.c
--- generic/tclPathObj.c 27 Oct 2009 20:30:48 -0000 1.66.2.10
+++ generic/tclPathObj.c 5 Jan 2010 18:49:28 -0000
@@ -660,34 +660,18 @@
return pathPtr;
} else {
/*
- * Duplicate the object we were given and then trim off
- * the extension of the tail component of the path.
+ * Need to return the whole path with the extension
+ * suffix removed. Do that by joining our "head" to
+ * our "tail" with the extension suffix removed from
+ * the tail.
*/
- FsPath *fsDupPtr;
- Tcl_Obj *root = Tcl_DuplicateObj(pathPtr);
+ Tcl_Obj *resultPtr =
+ TclNewFSPathObj(fsPathPtr->cwdPtr, fileName,
+ (int)(length - strlen(extension)));
- Tcl_IncrRefCount(root);
- fsDupPtr = PATHOBJ(root);
- if (Tcl_IsShared(fsDupPtr->normPathPtr)) {
- TclDecrRefCount(fsDupPtr->normPathPtr);
- fsDupPtr->normPathPtr = Tcl_NewStringObj(fileName,
- (int)(length - strlen(extension)));
- Tcl_IncrRefCount(fsDupPtr->normPathPtr);
- } else {
- Tcl_SetObjLength(fsDupPtr->normPathPtr,
- (int)(length - strlen(extension)));
- }
-
- /*
- * Must also trim the string representation if we have it.
- */
-
- if (root->bytes != NULL && root->length > 0) {
- root->length -= strlen(extension);
- root->bytes[root->length] = 0;
- }
- return root;
+ Tcl_IncrRefCount(resultPtr);
+ return resultPtr;
}
}
default:
Index: tests/fileName.test
===================================================================
RCS file: /cvsroot/tcl/tcl/tests/fileName.test,v
retrieving revision 1.51.8.10
diff -u -r1.51.8.10 fileName.test
--- tests/fileName.test 28 Oct 2009 16:45:54 -0000 1.51.8.10
+++ tests/fileName.test 5 Jan 2010 18:49:29 -0000
@@ -1348,6 +1348,20 @@
file rootname [lindex [lsort [glob globTest/*/]] 0]
} globTest/a1/
+test filename-14.31 {Bug 2918610} -setup {
+ set d [makeDirectory foo]
+ makeFile {} bar.soom $d
+} -body {
+ foreach fn [glob $d/bar.soom] {
+ set root [file rootname $fn]
+ close [open $root {WRONLY CREAT}]
+ }
+ llength [glob -directory $d *]
+} -cleanup {
+ file delete -force $d/bar
+ removeFile bar.soom $d
+ removeDirectory foo
+} -result 2
unset globname