Jason Edmeades : cmd: Fix shortpath handling in for loops.

Alexandre Julliard julliard at winehq.org
Wed Aug 29 16:10:45 CDT 2018


Module: wine
Branch: master
Commit: 5c444c4e0dd51e824468d78215f795d67632ea49
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5c444c4e0dd51e824468d78215f795d67632ea49

Author: Jason Edmeades <us at edmeades.me.uk>
Date:   Mon Aug 27 20:41:49 2018 +0100

cmd: Fix shortpath handling in for loops.

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>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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 14e2539..1ed5197 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 ea4157c..35e0cf2 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@




More information about the wine-cvs mailing list