summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2009-08-20 22:09:45 (GMT)
committerdgp <dgp@users.sourceforge.net>2009-08-20 22:09:45 (GMT)
commite645a06ed98f083f07698164c56a986e56094fb3 (patch)
treee29d2a2494a182f9ee84af7b8ea69e05ada9161d
parent98d5d18c168e0eb4ac463f011898476550f81592 (diff)
downloadtcl-e645a06ed98f083f07698164c56a986e56094fb3.zip
tcl-e645a06ed98f083f07698164c56a986e56094fb3.tar.gz
tcl-e645a06ed98f083f07698164c56a986e56094fb3.tar.bz2
* generic/tclFileName.c: Correct result from [glob */test] when *
matches something like ~foo. [Bug 2837800]
-rw-r--r--ChangeLog3
-rw-r--r--generic/tclFileName.c32
2 files changed, 33 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 451fc32..0aaed72 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2009-08-20 Don Porter <dgp@users.sourceforge.net>
+ * generic/tclFileName.c: Correct result from [glob */test] when *
+ matches something like ~foo. [Bug 2837800]
+
* generic/tclPathObj.c: [Bug 2806250] Prevent the storage of strings
starting with ~ in the "tail" part (normPathPtr field) of the path
intrep when PATHFLAGS != 0. This establishes the assumptions relied
diff --git a/generic/tclFileName.c b/generic/tclFileName.c
index c621aff..ad71008 100644
--- a/generic/tclFileName.c
+++ b/generic/tclFileName.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: tclFileName.c,v 1.96 2009/01/22 06:42:33 nijtmans Exp $
+ * RCS: @(#) $Id: tclFileName.c,v 1.97 2009/08/20 22:09:45 dgp Exp $
*/
#include "tclInt.h"
@@ -2361,14 +2361,42 @@ DoGlob(
pattern, &dirOnly);
*p = save;
if (result == TCL_OK) {
- int subdirc, i;
+ int subdirc, i, repair = -1;
Tcl_Obj **subdirv;
result = Tcl_ListObjGetElements(interp, subdirsPtr,
&subdirc, &subdirv);
for (i=0; result==TCL_OK && i<subdirc; i++) {
+ Tcl_Obj *copy = NULL;
+
+ if (Tcl_GetString(subdirv[i])[0] == '~') {
+ Tcl_ListObjLength(NULL, matchesObj, &repair);
+ copy = subdirv[i];
+ subdirv[i] = Tcl_NewStringObj("./", 2);
+ Tcl_AppendObjToObj(subdirv[i], copy);
+ Tcl_IncrRefCount(subdirv[i]);
+ }
result = DoGlob(interp, matchesObj, separators, subdirv[i],
1, p+1, types);
+ if (copy) {
+ int end;
+
+ Tcl_DecrRefCount(subdirv[i]);
+ subdirv[i] = copy;
+ Tcl_ListObjLength(NULL, matchesObj, &end);
+ while (repair < end) {
+ const char *bytes;
+ int numBytes;
+ Tcl_Obj *fixme, *newObj;
+ Tcl_ListObjIndex(NULL, matchesObj, repair, &fixme);
+ bytes = Tcl_GetStringFromObj(fixme, &numBytes);
+ newObj = Tcl_NewStringObj(bytes+2, numBytes-2);
+ Tcl_ListObjReplace(NULL, matchesObj, repair, 1,
+ 1, &newObj);
+ repair++;
+ }
+ repair = -1;
+ }
}
}
TclDecrRefCount(subdirsPtr);