loader: Fix support for Windows paths

This commit is contained in:
Paweł Bylica 2018-07-10 11:08:33 +02:00
parent 18a96c8d04
commit 6b0ab05d07
No known key found for this signature in database
GPG Key ID: 7A0C037434FE77EF
3 changed files with 76 additions and 0 deletions

View File

@ -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.

View File

@ -21,6 +21,8 @@ add_custom_command(
COMMAND ${CMAKE_COMMAND} -E ${cmd} $<TARGET_FILE:vm-mock> eee2.so
COMMAND ${CMAKE_COMMAND} -E ${cmd} $<TARGET_FILE:vm-mock> libeee3.x
COMMAND ${CMAKE_COMMAND} -E ${cmd} $<TARGET_FILE:vm-mock> eee4
COMMAND ${CMAKE_COMMAND} -E ${cmd} $<TARGET_FILE:vm-mock> _
COMMAND ${CMAKE_COMMAND} -E ${cmd} $<TARGET_FILE:vm-mock> lib_.so
COMMAND ${CMAKE_COMMAND} -E ${cmd} $<TARGET_FILE:vm-mock> ../aaa.evm
COMMAND ${CMAKE_COMMAND} -E touch empty.file
)

View File

@ -6,6 +6,14 @@
#include <gtest/gtest.h>
#include <cstring>
#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);
}