Tcl Source Code

View Ticket
Login
Ticket UUID: 2806622
Title: $tcl_platform(user) has garbage in sometimes on Win32
Type: Bug Version: obsolete: 8.5.7
Submitter: rkeene Created on: 2009-06-15 14:22:20
Subsystem: 07. Variables Assigned To: patthoyts
Priority: 5 Medium Severity:
Status: Closed Last Modified: 2009-07-01 21:07:13
Resolution: Fixed Closed By: patthoyts
    Closed on: 2009-07-01 14:07:13
Description:
$tcl_platform(user) has garbage in it when run as "SYSTEM" in a Windows Domain "Startup" script.

Tested on Tcl 8.5.1
User Comments: patthoyts added on 2009-07-01 21:07:13:

allow_comments - 1

patthoyts added on 2009-07-01 21:07:10:
I've tested this using an accented account and also by launching a tcl process as SYSTEM as a scheduled task and in all cases the username is coming up ok now.
Committed to 8.5 and HEAD

patthoyts added on 2009-06-30 21:29:34:
You might try the attached patch. In general the Tcl code is compiled as narrow (TCHAR == char) and it switches the win32 api functions at runtime using the tclWinProcs global. So GetUserName should have been indirectly accessed using this.
This patch seems to work for me and I tried forcing a cyrillic name through it and that was ok too.

patthoyts added on 2009-06-30 21:29:07:

File Added - 332938: getusername.patch

mpc_janssen added on 2009-06-29 22:46:22:
It's a bit trickier than it intially looks, using the External call doesn't work for user names with non-ascii chars

mpc_janssen added on 2009-06-29 22:27:31:
The line below was not quite correct:

Correct is:
Tcl_ExternalToUtfDString(NULL,szUserName , -1, &ds);

And a test case demonstrating failure without change and correct result after:

# Test that the username is set correctly

test platform-4.1 {tcl_platform(username) matches the username (bug #2806622) } \
    -body {
        set username $::env(USERNAME)
        unset ::env(USERNAME)
        interp create user_name
        set result [user_name eval {set tcl_platform(user)}]
        interp delete user_name
        set ::env(USERNAME) $username
        expr  {$result eq $username} 
    } \
    -result 1

mpc_janssen added on 2009-06-29 19:55:49:
replacing the line with:

        Tcl_ExternalToUtfDString(NULL,szUserName , (int)dwUserNameLen, &ds);

fixes the issue.

mpc_janssen added on 2009-06-29 19:51:13:
Note that this always fails if env(USERNAME) is not set:

C:\src>set USERNAME
Environment variable USERNAME not defined

C:\src>c:\tcl\bin\tclsh85.exe
% parray tcl_platform
tcl_platform(byteOrder)   = littleEndian
tcl_platform(machine)     = intel
tcl_platform(os)          = Windows NT
tcl_platform(osVersion)   = 5.1
tcl_platform(platform)    = windows
tcl_platform(pointerSize) = 4
tcl_platform(threaded)    = 1
tcl_platform(user)        = ???2
tcl_platform(wordSize)    = 4

mpc_janssen added on 2009-06-29 19:49:44:
This seems to be caused by the call to
    Tcl_WinTCharToUtf(szUserName, (int) dwUserNameLen, &ds);
at tclWinInit.c line 581. This code only gets exercised if env(USERNAME) is empty.

It seems that GetUserName doesn't return a TCHAR, but as simple char *

Attachments: