Tcl Source Code

View Ticket
Login
Ticket UUID: 2837800
Title: [glob] errors searching dirs matching ~*
Type: Bug Version: obsolete: 8.5.7
Submitter: dgp Created on: 2009-08-14 17:57:15
Subsystem: 36. Pathname Management Assigned To: dgp
Priority: 9 Immediate Severity:
Status: Closed Last Modified: 2009-08-22 02:11:48
Resolution: Fixed Closed By: dgp
    Closed on: 2009-08-20 22:10:34
Description:
% file mkdir ./~goo
% close [open ./~goo/test w]
% glob [file join * test]
make: *** [shell] Segmentation fault
User Comments: dgp added on 2009-08-22 02:11:48:
subsequent commits corrected a regression.

dgp added on 2009-08-21 05:10:34:

allow_comments - 1


Patch committed for 8.5.8 and 8.6b2.

dgp added on 2009-08-21 04:56:39:
Attached patch for 8.5

dgp added on 2009-08-21 04:56:26:

File Added - 339991: 2837800.patch

dgp added on 2009-08-18 21:34:50:
handling the NULL return solves the
crash, leaving only the bug.  Will
commit if/when SF CVS returns.

dgp added on 2009-08-18 20:10:57:
sorry, that's the PATH_FLAGS != 0 representation.

dgp added on 2009-08-18 20:10:21:
When the user "goo" does not exist, then
the value "~goo" cannot be converted to
the "path" Tcl_ObjType.

The PATH_FLAGS == 0 representation
for a "path" value holds two parts of the
path.  In the crashing case, the head
part of the path is "~goo" and the tail
part is "test".  It is assumed deep in the
code that the head part of the path can
always be converted to the "path"
Tcl_ObjType.  There is no check for
the NULL result when that is not true,
and that leads to the crash.

dgp added on 2009-08-18 04:21:51:
In 8.5+, I observe that the header comments
of TclNewFSPathObj() claim that the dirPtr
argument must be an absolute path, but
when DoGlob() calls this routine, it makes
no effort to check that constraint is met.

It's not clear whether the header comment
claim is true, or where it gets relied on, if
anywhere.

dgp added on 2009-08-18 03:00:13:
fix with tests committed for 8.4.20.

dgp added on 2009-08-15 03:07:51:
Attached patch fixes things in 8.4.

dgp added on 2009-08-15 03:07:31:

File Added - 339245: 2837800-84.patch

dgp added on 2009-08-15 02:41:45:
A different variation of the same bug
in Tcl 8.4:

% file mkdir ./~dgp ;# empty directory
% glob */.mozilla
~dgp/.mozilla

The search in subdirectories of
the current directory is actually
finding something way over 
in my home directory instead.

dgp added on 2009-08-15 01:38:03:
The actual releases of Tcl 8.4, up through
8.4.19 are slightly better:

% glob */test
no files matched glob pattern "*/test"

It's a wrong result, but at least without
the empty error message demonstrated
in the tip of the core-8-4-branch.

dgp added on 2009-08-15 01:34:56:
8.3.5 works fine.

dgp added on 2009-08-15 01:32:31:
In Tcl 8.4, there is no crash, but
the incorrect result is not much better:

% glob [file join * test]

%

dgp added on 2009-08-15 00:59:48:
Stack trace from debug build of the
tip of the core-8-5-branch:

Program received signal SIGSEGV, Segmentation fault.
0x0807bf8a in Tcl_DbDecrRefCount (objPtr=0x0,
    file=0x8160368 "/home/dgp/cvs/tcl8.5/unix/../generic/tclPathObj.c",
    line=1690) at /home/dgp/cvs/tcl8.5/unix/../generic/tclObj.c:3153
3153        if (objPtr->refCount == 0x61616161) {
(gdb) bt
#0  0x0807bf8a in Tcl_DbDecrRefCount (objPtr=0x0,
    file=0x8160368 "/home/dgp/cvs/tcl8.5/unix/../generic/tclPathObj.c",
    line=1690) at /home/dgp/cvs/tcl8.5/unix/../generic/tclObj.c:3153
#1  0x080820c9 in Tcl_FSGetTranslatedPath (interp=0x89098d0, pathPtr=0x89752d8)
    at /home/dgp/cvs/tcl8.5/unix/../generic/tclPathObj.c:1690
#2  0x080ad652 in TclpMatchInDirectory (interp=0x89098d0, resultPtr=0x8974d10,
    pathPtr=0x89752d8, pattern=0x0, types=0x0)
    at /home/dgp/cvs/tcl8.5/unix/../unix/tclUnixFile.c:222
#3  0x080682ba in Tcl_FSMatchInDirectory (interp=0x89098d0,
    resultPtr=0x8974d10, pathPtr=0x89752d8, pattern=0x0, types=0x0)
    at /home/dgp/cvs/tcl8.5/unix/../generic/tclIOUtil.c:1102
#4  0x08145dc6 in DoGlob (interp=0x89098d0, matchesObj=0x8974d10,
    separators=0x816f602 "/", pathPtr=0x8975010, flags=1,
    pattern=0x897454a "test", types=0x0)
    at /home/dgp/cvs/tcl8.5/unix/../generic/tclFileName.c:2478
#5  0x08145941 in DoGlob (interp=0x89098d0, matchesObj=0x8974d10,
    separators=0x816f602 "/", pathPtr=0x0, flags=0,
    pattern=0x8974548 "*/test", types=0x0)
    at /home/dgp/cvs/tcl8.5/unix/../generic/tclFileName.c:2364
#6  0x08145010 in TclGlob (interp=0x89098d0, pattern=0x8974548 "*/test",
    pathPrefix=0x0, globFlags=0, types=0x0)
    at /home/dgp/cvs/tcl8.5/unix/../generic/tclFileName.c:1914
#7  0x0814471e in Tcl_GlobObjCmd (dummy=0x0, interp=0x89098d0, objc=1,
    objv=0x890ac6c) at /home/dgp/cvs/tcl8.5/unix/../generic/tclFileName.c:1584
...

Attachments: