diff --git a/luprex/core/Makefile b/luprex/core/Makefile index cc9f1b52..dd6c6036 100644 --- a/luprex/core/Makefile +++ b/luprex/core/Makefile @@ -73,8 +73,8 @@ CORE_OBJ_FILES=\ DRV_OBJ_FILES=\ - objdrv/drvutil.o\ - objdrv/sslutil.o\ + obj/drv/drvutil.o\ + obj/drv/sslutil.o\ -include $(LUA_OBJ_FILES:%.o=%.d) @@ -86,8 +86,8 @@ ifeq ($(OS),linux) OPT=-g -O0 -main: $(DRV_OBJ_FILES) $(CORE_OBJ_FILES) $(LUA_OBJ_FILES) objdrv/driver-linux.o - g++ -std=c++17 -export-dynamic -Wall $(OPT) -o $@ $(DRV_OBJ_FILES) $(CORE_OBJ_FILES) $(LUA_OBJ_FILES) objdrv/driver-linux.o -L../linuxlib -lssl -lcrypto -ldl +main: $(DRV_OBJ_FILES) $(CORE_OBJ_FILES) $(LUA_OBJ_FILES) obj/drv/driver-linux.o + g++ -std=c++17 -export-dynamic -Wall $(OPT) -o $@ $(DRV_OBJ_FILES) $(CORE_OBJ_FILES) $(LUA_OBJ_FILES) obj/drv/driver-linux.o -L../linuxlib -lssl -lcrypto -ldl obj/lua/%.o: ../eris-master/src/%.c gcc -Wall -fvisibility=hidden $(OPT) -DLUA_USE_APICHECK -DLUA_USE_POSIX -c -MMD $< -o $@ @@ -95,13 +95,13 @@ obj/lua/%.o: ../eris-master/src/%.c obj/cpp/%.o: cpp/%.cpp g++ -Wall -fvisibility=hidden $(OPT) -std=c++17 -I../linuxlib -I../eris-master/src -Iwrap -Icpp -c -MMD $< -o $@ -objdrv/%.o: drv/%.cpp +obj/drv/%.o: drv/%.cpp g++ -Wall -fvisibility=hidden $(OPT) -std=c++17 -I../linuxlib -Idrv -c -MMD $< -o $@ endif clean: - rm -f main.exe main obj/cpp/*.* objdrv/*.* obj/lua/*.* + rm -f main.exe main obj/cpp/*.* obj/drv/*.* obj/lua/*.* diff --git a/luprex/core/drv/driver-linux.cpp b/luprex/core/drv/driver-linux.cpp index 2dc4e384..a7bc4584 100644 --- a/luprex/core/drv/driver-linux.cpp +++ b/luprex/core/drv/driver-linux.cpp @@ -32,6 +32,7 @@ const int INVALID_SOCKET = -1; struct termios orig_termios; + void set_nonblocking(int fd) { int flags = fcntl(fd, F_GETFL, 0); assert(flags != -1); diff --git a/luprex/core/drv/driver-mingw.cpp b/luprex/core/drv/driver-mingw.cpp index 0741e8fc..b539eb3b 100644 --- a/luprex/core/drv/driver-mingw.cpp +++ b/luprex/core/drv/driver-mingw.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -23,6 +24,20 @@ #include #include +// OpenSSL requires plain ascii pathnames. Returns empty string +// if the path cannot be converted to plain ascii. +std::string path_to_plain_ascii(const std::filesystem::path &path) { + std::wstring s = path.native(); + for (wchar_t c : s) { + if ((c < 1) || (c > 127)) return ""; + } + std::ostringstream oss; + for (wchar_t c : s) { + oss << ((char)c); + } + return oss.str(); +} + static void set_nonblocking(SOCKET sock) { u_long mode = 1; // 1 to enable non-blocking socket int status = ioctlsocket(sock, FIONBIO, &mode); diff --git a/luprex/core/drv/sslutil.cpp b/luprex/core/drv/sslutil.cpp index 33878c86..a60a5ca4 100644 --- a/luprex/core/drv/sslutil.cpp +++ b/luprex/core/drv/sslutil.cpp @@ -87,6 +87,14 @@ std::string error_string() { } } +std::string path_to_plain_ascii(const std::filesystem::path &path) { + std::string s = path.native(); + for (char c : s) { + if ((c < 1) || (c > 127)) return ""; + } + return s; +} + void clear_all_errors() { ERR_clear_error(); errno = 0; @@ -162,13 +170,17 @@ void ctx_load_cert_from_directory(SSL_CTX *ctx, const std::string &dir) { std::vector cert_paths; for (const auto & entry : std::filesystem::directory_iterator(dir)) { - std::string fn = entry.path(); - if (count_certificates(fn.c_str()) >= 1) { - cert_paths.push_back(fn); - } - if (contains_privatekey(fn.c_str())) { - key_paths.push_back(fn); - } + std::string fn = path_to_plain_ascii(entry.path()); + if (fn.empty()) { + std::cerr << "Ignoring file with non-ascii filename: " << entry.path() << std::endl; + } else { + if (count_certificates(fn.c_str()) >= 1) { + cert_paths.push_back(fn); + } + if (contains_privatekey(fn.c_str())) { + key_paths.push_back(fn); + } + } } if (cert_paths.size() > 1) {