summaryrefslogtreecommitdiffstats
path: root/win/tclWinFile.c
diff options
context:
space:
mode:
authorsebres <sebres@users.sourceforge.net>2018-05-24 20:12:43 (GMT)
committersebres <sebres@users.sourceforge.net>2018-05-24 20:12:43 (GMT)
commitecec1703aade688299289c4d74bae88a04e04d22 (patch)
treeeea385aa47fa5c9976aeed560169c5c84a576294 /win/tclWinFile.c
parenteae621b1753a248fd1add5b5df1069199e783d2f (diff)
downloadtcl-ecec1703aade688299289c4d74bae88a04e04d22.zip
tcl-ecec1703aade688299289c4d74bae88a04e04d22.tar.gz
tcl-ecec1703aade688299289c4d74bae88a04e04d22.tar.bz2
win: TclpGetUserHome should return normalized path (also in case we find domain and NetUserGetInfo returns path), PoC:
file normalize ~$::tcl_platform(user)@$::env(USERDOMAIN)
Diffstat (limited to 'win/tclWinFile.c')
-rwxr-xr-xwin/tclWinFile.c21
1 files 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}/<user>".
*/
- 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);