[PATCH 1/5] [programs/cmd] Fix shortpath handling in for loops
Jason Edmeades
us at edmeades.me.uk
Sun Aug 5 17:15:26 CDT 2018
Fixes todo in tests
When 's' is used as a modifier, the paths that are presented to the other modifiers needs to be
a short path. Given the 'filename' part of the path may not exist, we cannot use GetShortPathName
directly without first removing the filename part to just leave the directory bit.
Signed-off-by: Jason Edmeades <us at edmeades.me.uk>
---
programs/cmd/batch.c | 17 +++++++++++++----
programs/cmd/tests/test_builtins.cmd.exp | 12 ++++++------
2 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/programs/cmd/batch.c b/programs/cmd/batch.c
index 1a78b55557..e10baf852c 100644
--- a/programs/cmd/batch.c
+++ b/programs/cmd/batch.c
@@ -399,6 +399,7 @@ void WCMD_HandleTildaModifiers(WCHAR **start, BOOL atExecute)
WCHAR finaloutput[MAX_PATH];
WCHAR fullfilename[MAX_PATH];
WCHAR thisoutput[MAX_PATH];
+ WCHAR *filepart = NULL;
WCHAR *pos = *start+1;
WCHAR *firstModifier = pos;
WCHAR *lastModifier = NULL;
@@ -522,7 +523,7 @@ void WCMD_HandleTildaModifiers(WCHAR **start, BOOL atExecute)
/* After this, we need full information on the file,
which is valid not to exist. */
if (!skipFileParsing) {
- if (GetFullPathNameW(outputparam, MAX_PATH, fullfilename, NULL) == 0) {
+ if (GetFullPathNameW(outputparam, MAX_PATH, fullfilename, &filepart) == 0) {
exists = FALSE;
fullfilename[0] = 0x00;
} else {
@@ -598,8 +599,16 @@ void WCMD_HandleTildaModifiers(WCHAR **start, BOOL atExecute)
/* 4. Handle 's' : Use short paths (File doesn't have to exist) */
if (memchrW(firstModifier, 's', modifierLen) != NULL) {
if (finaloutput[0] != 0x00) strcatW(finaloutput, spaceW);
- /* Don't flag as doneModifier - %~s on its own is processed later */
- GetShortPathNameW(outputparam, outputparam, sizeof(outputparam)/sizeof(outputparam[0]));
+
+ /* Convert fullfilename's path to a short path - Save filename away as
+ only path is valid, name may not exist which causes GetShortPathName
+ to fail if it is provided */
+ if (filepart) {
+ strcpyW(thisoutput, filepart);
+ *filepart = 0x00;
+ GetShortPathNameW(fullfilename, fullfilename, sizeof(fullfilename)/sizeof(fullfilename[0]));
+ strcatW(fullfilename, thisoutput);
+ }
}
/* 5. Handle 'f' : Fully qualified path (File doesn't have to exist) */
@@ -673,7 +682,7 @@ void WCMD_HandleTildaModifiers(WCHAR **start, BOOL atExecute)
memchrW(firstModifier, 's', modifierLen) != NULL) {
doneModifier = TRUE;
if (finaloutput[0] != 0x00) strcatW(finaloutput, spaceW);
- strcatW(finaloutput, outputparam);
+ strcatW(finaloutput, fullfilename);
}
}
}
diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp
index 3118359265..b96d38ff0a 100644
--- a/programs/cmd/tests/test_builtins.cmd.exp
+++ b/programs/cmd/tests/test_builtins.cmd.exp
@@ -527,9 +527,9 @@ N
'.OOL'
'.TABC'
''
- at todo_wine@'@drive@@shortpath at R S'@or_broken@''
- at todo_wine@'@drive@@shortpath at T'@or_broken@''
- at todo_wine@'@drive@@shortpath at ABCDEFGHIJK.LMNOP'@or_broken@''
+'@drive@@shortpath at R S'@or_broken@''
+'@drive@@shortpath at T'@or_broken@''
+'@drive@@shortpath at ABCDEFGHIJK.LMNOP'@or_broken@''
''@or_broken@'%~ai'
''@or_broken@'%~ai'
'--a------'@or_broken@'--a--------'@or_broken@'--a--c---'@or_broken@'%~ai'
@@ -563,9 +563,9 @@ N
'.OOL'
'.TABC'
''
- at todo_wine@'@drive@@shortpath at R S'@or_broken@''
- at todo_wine@'@drive@@shortpath at T'@or_broken@''
- at todo_wine@'@drive@@shortpath at ABCDEFGHIJK.LMNOP'@or_broken@''
+'@drive@@shortpath at R S'@or_broken@''
+'@drive@@shortpath at T'@or_broken@''
+'@drive@@shortpath at ABCDEFGHIJK.LMNOP'@or_broken@''
@drive@@path@
@drive@@path@
@drive@
--
2.17.1
More information about the wine-devel
mailing list