[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