[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