Skip to content

Commit

Permalink
loader: Fix support for Windows paths
Browse files Browse the repository at this point in the history
  • Loading branch information
chfast committed Jul 10, 2018
1 parent 18a96c8 commit 6b0ab05
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 0 deletions.
5 changes: 5 additions & 0 deletions lib/loader/loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 2 additions & 0 deletions test/unittests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Expand Down
69 changes: 69 additions & 0 deletions test/unittests/test_loader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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";
Expand Down Expand Up @@ -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);
}

0 comments on commit 6b0ab05

Please sign in to comment.