From 6b0ab05d074b5eaa8abb3ee708d2803284c5b8e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Tue, 10 Jul 2018 11:08:33 +0200 Subject: [PATCH] loader: Fix support for Windows paths --- lib/loader/loader.c | 5 +++ test/unittests/CMakeLists.txt | 2 + test/unittests/test_loader.cpp | 69 ++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) diff --git a/lib/loader/loader.c b/lib/loader/loader.c index 8d8281d31..c365c9aed 100644 --- a/lib/loader/loader.c +++ b/lib/loader/loader.c @@ -71,6 +71,11 @@ evmc_create_fn evmc_load(const char* filename, enum evmc_loader_error_code* erro // Find filename in the path. const char* sep_pos = strrchr(filename, '/'); +#if _WIN32 + // On Windows check also Windows classic path separator. + const char* sep_pos_windows = strrchr(filename, '\\'); + sep_pos = sep_pos_windows > sep_pos ? sep_pos_windows : sep_pos; +#endif const char* name_pos = sep_pos ? sep_pos + 1 : filename; // Skip "lib" prefix if present. diff --git a/test/unittests/CMakeLists.txt b/test/unittests/CMakeLists.txt index d2181ce05..898a5d6ce 100644 --- a/test/unittests/CMakeLists.txt +++ b/test/unittests/CMakeLists.txt @@ -21,6 +21,8 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E ${cmd} $ eee2.so COMMAND ${CMAKE_COMMAND} -E ${cmd} $ libeee3.x COMMAND ${CMAKE_COMMAND} -E ${cmd} $ eee4 + COMMAND ${CMAKE_COMMAND} -E ${cmd} $ _ + COMMAND ${CMAKE_COMMAND} -E ${cmd} $ lib_.so COMMAND ${CMAKE_COMMAND} -E ${cmd} $ ../aaa.evm COMMAND ${CMAKE_COMMAND} -E touch empty.file ) diff --git a/test/unittests/test_loader.cpp b/test/unittests/test_loader.cpp index 8b6713046..7c455a573 100644 --- a/test/unittests/test_loader.cpp +++ b/test/unittests/test_loader.cpp @@ -6,6 +6,14 @@ #include +#include + +#if _WIN32 +static constexpr bool is_windows = true; +#else +static constexpr bool is_windows = false; +#endif + TEST(loader, nonexistent) { evmc_loader_error_code ec; @@ -121,6 +129,39 @@ TEST(loader, nextto) } #endif +TEST(loader, windows_path) +{ + auto paths = { + "./aaa.evm", + ".\\aaa.evm", + "./unittests/eee-bbb.dll", + "./unittests\\eee-bbb.dll", + ".\\unittests\\eee-bbb.dll", + ".\\unittests/eee-bbb.dll", + "unittests\\eee-bbb.dll", + }; + + for (auto& path : paths) + { + bool is_windows_path = std::strchr(path, '\\') != nullptr; + + if (is_windows_path && !is_windows) + { + evmc_loader_error_code ec; + auto fn = evmc_load(path, &ec); + EXPECT_EQ(fn, nullptr); + EXPECT_EQ(ec, EVMC_LOADER_CANNOT_OPEN); + } + else + { + evmc_loader_error_code ec; + auto fn = evmc_load(path, &ec); + EXPECT_NE(fn, nullptr); + EXPECT_EQ(ec, EVMC_LOADER_SUCCESS); + } + } +} + TEST(loader, eee1) { auto path = "unittests/libeee1.so"; @@ -174,4 +215,32 @@ TEST(loader, eee4) x = evmc_load(path, nullptr); EXPECT_EQ(x, nullptr); } + +TEST(loader, _) +{ + // Windows is not loading DLLs without extensions. + auto path = "unittests/_"; + + evmc_loader_error_code ec; + auto x = evmc_load(path, &ec); + EXPECT_EQ(ec, EVMC_LOADER_SYMBOL_NOT_FOUND); + EXPECT_EQ(x, nullptr); + + x = evmc_load(path, nullptr); + EXPECT_EQ(x, nullptr); +} #endif + +TEST(loader, lib_) +{ + // Windows is not loading DLLs without extensions. + auto path = "unittests/lib_.so"; + + evmc_loader_error_code ec; + auto x = evmc_load(path, &ec); + EXPECT_EQ(ec, EVMC_LOADER_SYMBOL_NOT_FOUND); + EXPECT_EQ(x, nullptr); + + x = evmc_load(path, nullptr); + EXPECT_EQ(x, nullptr); +}