[ovs-dev] [PATCH 1/4] util: Fix abs_file_name() bugs on Windows.

Alin Serdean aserdean at cloudbasesolutions.com
Fri Aug 3 15:41:55 UTC 2018


> 
> abs_file_name() believed that a file name that begins with / or contains :
> is absolute and that any other file name is relative.  On Windows, this is
> wrong in at least the following ways:
> 
>    * / and \ are interchangeable on Windows.
> 
>    * A name that begins with \\ or // is also absolute.
> 
>    * A name that begins with X: but not X:\ is not absolute.
> 
>    * A name with : in some position other than the second position is
>      not absolute (although it might not be valid either?).
> 
> Furthermore, Windows has more than one current working directory (one
> per volume letter), so trying to make a file name absolute by just prefixing
> the current working directory for the current volume results in silliness.
> 
> This patch attempts to fix the problem.
> 
> Found by inspection.
> 
> CC: Alin Gabriel Serdean <aserdean at ovn.org>
> Signed-off-by: Ben Pfaff <blp at ovn.org>
[Alin Serdean] Thanks a lot for the change Ben!
I was wondering if you can fold in the following so we can remove even more confusion:
diff --git a/lib/util.c b/lib/util.c
index d3c62988b..082bc7bb0 100644
--- a/lib/util.c
+++ b/lib/util.c
@@ -38,6 +38,9 @@
 #ifdef HAVE_PTHREAD_SET_NAME_NP
 #include <pthread_np.h>
 #endif
+#ifdef _WIN32
+#include <shlwapi.h>
+#endif

 VLOG_DEFINE_THIS_MODULE(util);

@@ -1053,9 +1056,8 @@ bool
 is_file_name_absolute(const char *fn)
 {
 #ifdef _WIN32
-    /* An absolute path begins with X:\ or \\. */
-    return ((fn[0] && fn[1] == ':' && strchr("/\\", fn[2]))
-            || (strchr("/\\", fn[0]) && strchr("/\\", fn[1])));
+    /* Use platform specific API */
+    return !PathIsRelative(fn);
 #else
     /* An absolute path begins with /. */
     return fn[0] == '/';

diff --git a/Documentation/intro/install/windows.rst b/Documentation/intro/install/windows.rst
index 6d8c746c5..f696d2c9b 100644
--- a/Documentation/intro/install/windows.rst
+++ b/Documentation/intro/install/windows.rst
@@ -156,7 +156,7 @@ component installation directories, etc. For example:
 ::

    $ ./configure CC=./build-aux/cccl LD="$(which link)" \
-       LIBS="-lws2_32 -liphlpapi -lwbemuuid -lole32 -loleaut32" \
+       LIBS="-lws2_32 -lShlwapi -liphlpapi -lwbemuuid -lole32 -loleaut32" \
        --prefix="C:/openvswitch/usr" \
        --localstatedir="C:/openvswitch/var" \
        --sysconfdir="C:/openvswitch/etc" \
@@ -172,7 +172,7 @@ To configure with SSL support, add the requisite additional options:
 ::

    $ ./configure CC=./build-aux/cccl LD="`which link`"  \
-       LIBS="-lws2_32 -liphlpapi -lwbemuuid -lole32 -loleaut32" \
+       LIBS="-lws2_32 -lShlwapi -liphlpapi -lwbemuuid -lole32 -loleaut32" \
        --prefix="C:/openvswitch/usr" \
        --localstatedir="C:/openvswitch/var"
        --sysconfdir="C:/openvswitch/etc" \
@@ -184,7 +184,7 @@ Finally, to the kernel module also:
 ::

    $ ./configure CC=./build-aux/cccl LD="`which link`" \
-       LIBS="-lws2_32 -liphlpapi -lwbemuuid -lole32 -loleaut32" \
+       LIBS="-lws2_32 -lShlwapi -liphlpapi -lwbemuuid -lole32 -loleaut32" \
        --prefix="C:/openvswitch/usr" \
        --localstatedir="C:/openvswitch/var" \
        --sysconfdir="C:/openvswitch/etc" \

diff --git a/appveyor.yml b/appveyor.yml
index 49fcae4b5..2e5c37a37 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -41,6 +41,6 @@ build_script:
 - C:\MinGW\msys\1.0\bin\bash -lc "cp /c/pthreads-win32/Pre-built.2/dll/x86/*.dll /c/openvswitch/."
 - C:\MinGW\msys\1.0\bin\bash -lc "mv /bin/link.exe /bin/link_copy.exe"
 - C:\MinGW\msys\1.0\bin\bash -lc "cd /c/openvswitch && ./boot.sh"
-- C:\MinGW\msys\1.0\bin\bash -lc "cd /c/openvswitch && ./configure CC=build-aux/cccl LD=\"`which link`\" LIBS=\"-lws2_32 -liphlpapi -lwbemuuid -lole32 -loleaut32\" --with-pthread=C:/pthreads-win32/Pre-built.2 --with-openssl=C:/OpenSSL-Win32 --with-vstudiotarget=\"Debug\"
+- C:\MinGW\msys\1.0\bin\bash -lc "cd /c/openvswitch && ./configure CC=build-aux/cccl LD=\"`which link`\" LIBS=\"-lws2_32 -lShlwapi -liphlpapi -lwbemuuid -lole32 -loleaut32\" --with-pthread=C:/pthreads-win32/Pre-built.2 --with-openssl=C:/OpenSSL-Win32 --with-vstudiotarget=\"Debug\"
 - C:\MinGW\msys\1.0\bin\bash -lc "cd /c/openvswitch && make"
 - C:\MinGW\msys\1.0\bin\bash -lc "cd /c/openvswitch && make datapath_windows_analyze"

Either way:
Acked-by: Alin Gabriel Serdean <aserdean at ovn.org>



More information about the dev mailing list