[PATCH 1/5] [programs/cmd] REBASE+RESEND: Fix shortpath handling in for loops
Jason Edmeades
us at edmeades.me.uk
Mon Aug 27 14:41:49 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 14e2539bf7..1ed5197adc 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, ARRAY_SIZE(outputparam));
+
+ /* 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, ARRAY_SIZE(fullfilename));
+ 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 ea4157c09d..35e0cf2fa5 100644
--- a/programs/cmd/tests/test_builtins.cmd.exp
+++ b/programs/cmd/tests/test_builtins.cmd.exp
@@ -530,9 +530,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'
@@ -566,9 +566,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