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:
- getusername.patch [download] added by patthoyts on 2009-06-30 21:29:07. [details]