#4368 $tcl_platform(user) has garbage in sometimes on Win32

obsolete: 8.5.7
closed-fixed
Pat Thoyts
5
2009-07-01
2009-06-15
Roy Keene
No

$tcl_platform(user) has garbage in it when run as "SYSTEM" in a Windows Domain "Startup" script.

Tested on Tcl 8.5.1

Discussion

  • Mark Janssen
    Mark Janssen
    2009-06-29

    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 *

     
  • Mark Janssen
    Mark Janssen
    2009-06-29

    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

     
  • Mark Janssen
    Mark Janssen
    2009-06-29

    replacing the line with:

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

    fixes the issue.

     
  • Mark Janssen
    Mark Janssen
    2009-06-29

    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

     
  • Mark Janssen
    Mark Janssen
    2009-06-29

    It's a bit trickier than it intially looks, using the External call doesn't work for user names with non-ascii chars

     
  • Pat Thoyts
    Pat Thoyts
    2009-06-30

    Patch (apply with -p1) for the GetUserName issue.

     
    Attachments
  • Pat Thoyts
    Pat Thoyts
    2009-06-30

    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.

     
  • Pat Thoyts
    Pat Thoyts
    2009-07-01

    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

     
  • Pat Thoyts
    Pat Thoyts
    2009-07-01

    • milestone: --> obsolete: 8.5.7
    • assigned_to: msofer --> patthoyts
    • status: open --> closed-fixed