From ecec1703aade688299289c4d74bae88a04e04d22 Mon Sep 17 00:00:00 2001 From: sebres Date: Thu, 24 May 2018 20:12:43 +0000 Subject: win: TclpGetUserHome should return normalized path (also in case we find domain and NetUserGetInfo returns path), PoC: file normalize ~$::tcl_platform(user)@$::env(USERDOMAIN) --- win/tclWinFile.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/win/tclWinFile.c b/win/tclWinFile.c index 8fc0b8e..1acc225 100755 --- a/win/tclWinFile.c +++ b/win/tclWinFile.c @@ -1450,7 +1450,7 @@ TclpGetUserHome( Tcl_DString ds; int nameLen, badDomain; char *domain; - WCHAR *wName, *wHomeDir, *wDomain, **wDomainPtr = &wDomain; + WCHAR *wName, *wHomeDir, *wDomain; WCHAR buf[MAX_PATH]; badDomain = 0; @@ -1461,7 +1461,7 @@ TclpGetUserHome( Tcl_DStringInit(&ds); wName = Tcl_UtfToUniCharDString(domain + 1, -1, &ds); badDomain = (netGetDCNameProc)(NULL, wName, - (LPBYTE *) wDomainPtr); + (LPBYTE *) &wDomain); Tcl_DStringFree(&ds); nameLen = domain - name; } @@ -1470,25 +1470,26 @@ TclpGetUserHome( wName = Tcl_UtfToUniCharDString(name, nameLen, &ds); if ((netUserGetInfoProc)(wDomain, wName, 1, (LPBYTE *) uiPtrPtr) == 0) { + DWORD i, size = MAX_PATH; wHomeDir = uiPtr->usri1_home_dir; if ((wHomeDir != NULL) && (wHomeDir[0] != L'\0')) { - Tcl_UniCharToUtfDString(wHomeDir, lstrlenW(wHomeDir), - bufferPtr); + size = lstrlenW(wHomeDir); + Tcl_UniCharToUtfDString(wHomeDir, size, bufferPtr); } else { /* * User exists but has no home dir. Return * "{GetProfilesDirectory}/". */ - DWORD i, size = MAX_PATH; getProfilesDirectoryProc(buf, &size); - for (i = 0; i < size; ++i){ - if (buf[i] == '\\') buf[i] = '/'; - } Tcl_UniCharToUtfDString(buf, size-1, bufferPtr); - Tcl_DStringAppend(bufferPtr, "/", -1); - Tcl_DStringAppend(bufferPtr, name, -1); + Tcl_DStringAppend(bufferPtr, "/", 1); + Tcl_DStringAppend(bufferPtr, name, nameLen); } result = Tcl_DStringValue(bufferPtr); + /* be sure we returns normalized path */ + for (i = 0; i < size; ++i){ + if (result[i] == '\\') result[i] = '/'; + } (*netApiBufferFreeProc)((void *) uiPtr); } Tcl_DStringFree(&ds); -- cgit v0.12 From a410c0d8d504868b1dbdcaf70a521859e32327fd Mon Sep 17 00:00:00 2001 From: sebres Date: Thu, 24 May 2018 20:20:26 +0000 Subject: fixed typo in winFCmd-12.6.2: unneeded extra-bracket removed --- tests/winFCmd.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/winFCmd.test b/tests/winFCmd.test index 1b2b042..f1f2afa 100644 --- a/tests/winFCmd.test +++ b/tests/winFCmd.test @@ -913,7 +913,7 @@ test winFCmd-12.6.2 {ConvertFileNameFormat: absolute path with drive (in temp fo } -constraints {win} -body { createfile $::env(TEMP)/td1 {} string equal [string tolower [file attributes $::env(TEMP)/td1 -longname]] \ - [string tolower [file normalize $::env(TEMP)]/td1]] + [string tolower [file normalize $::env(TEMP)]/td1] } -cleanup { file delete -force -- $::env(TEMP)/td1 } -result 1 -- cgit v0.12