From 11565d22ade0208354791a4f232ea00ce16c07c5 Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Sat, 6 Jun 2020 10:59:06 +0200 Subject: [PATCH] fix: prevent deadlock if libfuse is not available at runtime --- test/webfuse/tests/integration/provider.cc | 58 ++++++++++++++++++++-- test/webfuse/utils/static_filesystem.c | 17 +++++++ test/webfuse/utils/static_filesystem.h | 9 ++++ 3 files changed, 80 insertions(+), 4 deletions(-) diff --git a/test/webfuse/tests/integration/provider.cc b/test/webfuse/tests/integration/provider.cc index e813b4d..a4b4473 100644 --- a/test/webfuse/tests/integration/provider.cc +++ b/test/webfuse/tests/integration/provider.cc @@ -9,6 +9,39 @@ using namespace std::chrono_literals; +namespace +{ + enum class ConnectionState + { + disconnected, + connected, + connecting + }; +} + +extern "C" +{ + +void +webfuse_test_provider_onconnected( + void * user_data) +{ + auto * fs = reinterpret_cast(user_data); + auto * connection_state = reinterpret_cast(wfp_static_filesystem_get_user_data(fs)); + *connection_state = ConnectionState::connected; +} + +void +webfuse_test_provider_ondisconnected( + void * user_data) +{ + auto * fs = reinterpret_cast(user_data); + auto * connection_state = reinterpret_cast(wfp_static_filesystem_get_user_data(fs)); + *connection_state = ConnectionState::disconnected; +} + +} + namespace webfuse_test { @@ -18,23 +51,40 @@ public: explicit Private(char const * url) : is_shutdown_requested(false) { + ConnectionState connection_state = ConnectionState::connecting; + config = wfp_client_config_create(); wfp_client_config_set_certpath(config, "client-cert.pem"); wfp_client_config_set_keypath(config, "client-key.pem"); wfp_client_config_set_ca_filepath(config, "server-cert.pem"); + wfp_client_config_set_onconnected(config, &webfuse_test_provider_onconnected); + wfp_client_config_set_ondisconnected(config, &webfuse_test_provider_ondisconnected); fs = wfp_static_filesystem_create(config); + wfp_static_filesystem_set_user_data(fs, reinterpret_cast(&connection_state)); wfp_static_filesystem_add_text(fs, "hello.txt", 0444, "Hello, World"); client = wfp_client_create(config); wfp_client_connect(client, url); - while (!wfp_impl_client_is_connected(client)) + while (ConnectionState::connecting == connection_state) { wfp_client_service(client); } - - thread = std::thread(Run, this); - std::this_thread::sleep_for(200ms); + + if (ConnectionState::connected == connection_state) + { + thread = std::thread(Run, this); + std::this_thread::sleep_for(200ms); + } + else + { + wfp_client_dispose(client); + + wfp_static_filesystem_dispose(fs); + wfp_client_config_dispose(config); + + throw std::runtime_error("unable to connect"); + } } ~Private() diff --git a/test/webfuse/utils/static_filesystem.c b/test/webfuse/utils/static_filesystem.c index 855564b..0f64733 100644 --- a/test/webfuse/utils/static_filesystem.c +++ b/test/webfuse/utils/static_filesystem.c @@ -38,6 +38,7 @@ struct wfp_static_filesystem struct wfp_static_filesystem_entry * entries; size_t size; size_t capacity; + void * user_data; }; static struct wfp_static_filesystem_entry * @@ -335,6 +336,7 @@ wfp_static_filesystem_create( filesystem->entries = malloc(sizeof(struct wfp_static_filesystem_entry) * WFP_STATIC_FILESYSTEM_DEFAULT_CAPACITY); filesystem->size = 0; filesystem->capacity = WFP_STATIC_FILESYSTEM_DEFAULT_CAPACITY; + filesystem->user_data = NULL; wfp_static_filesystem_add_dir(filesystem, 0, ""); @@ -402,3 +404,18 @@ wfp_static_filesystem_add_text( size_t length = strlen(content); wfp_static_filesystem_add(filesystem, path, mode, content, length); } + +void +wfp_static_filesystem_set_user_data( + struct wfp_static_filesystem * filesystem, + void * user_data) +{ + filesystem->user_data = user_data; +} + +void * +wfp_static_filesystem_get_user_data( + struct wfp_static_filesystem * filesystem) +{ + return filesystem->user_data; +} diff --git a/test/webfuse/utils/static_filesystem.h b/test/webfuse/utils/static_filesystem.h index bf23b88..d4d574a 100644 --- a/test/webfuse/utils/static_filesystem.h +++ b/test/webfuse/utils/static_filesystem.h @@ -56,6 +56,15 @@ wfp_static_filesystem_add_text( int mode, char const * content); +extern void +wfp_static_filesystem_set_user_data( + struct wfp_static_filesystem * filesystem, + void * user_data); + +extern void * +wfp_static_filesystem_get_user_data( + struct wfp_static_filesystem * filesystem); + #ifdef __cplusplus } #endif