From 1f181f6ce38886c80c098dd88f12df247fa83c0c Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Tue, 1 Apr 2025 12:35:00 +0200 Subject: [PATCH] genode_c_api: errors on socket/nic_client init Prevent uncaught exceptiosn in (NIC-client) initialization but report as errors from genode_socket_init() / genode_nic_client_create(). --- repos/dde_linux/src/lib/lxip/init.cc | 4 +++- repos/dde_linux/src/lib/lxip/net_driver.c | 5 +++++ repos/dde_linux/src/lib/lxip/net_driver.h | 1 + repos/libports/src/lib/lwip/nic_netif.c | 5 ++++- repos/libports/src/lib/lwip/socket.cc | 6 +++++- repos/os/include/genode_c_api/socket.h | 2 +- repos/os/src/lib/genode_c_api/nic_client.cc | 12 +++++++----- repos/os/src/lib/vfs/ip/vfs.cc | 8 +++++--- 8 files changed, 31 insertions(+), 12 deletions(-) diff --git a/repos/dde_linux/src/lib/lxip/init.cc b/repos/dde_linux/src/lib/lxip/init.cc index 77e8652908..5542b81295 100644 --- a/repos/dde_linux/src/lib/lxip/init.cc +++ b/repos/dde_linux/src/lib/lxip/init.cc @@ -88,7 +88,7 @@ struct Main }; -void genode_socket_init(struct genode_env *_env, +bool genode_socket_init(struct genode_env *_env, struct genode_socket_io_progress *io_progress, char const *label) { @@ -108,4 +108,6 @@ void genode_socket_init(struct genode_env *_env, /* wait to finish initialization before returning to callee */ lx_emul_execute_kernel_until(lx_user_startup_complete, nullptr); + + return lx_nic_client_initialized(); } diff --git a/repos/dde_linux/src/lib/lxip/net_driver.c b/repos/dde_linux/src/lib/lxip/net_driver.c index 9800a36a4a..858a55cd95 100644 --- a/repos/dde_linux/src/lib/lxip/net_driver.c +++ b/repos/dde_linux/src/lib/lxip/net_driver.c @@ -188,6 +188,10 @@ static int rx_task_function(void *arg) } +static bool initialized; + +bool lx_nic_client_initialized() { return initialized; } + static int __init virtio_net_driver_init(void) { struct net_device *dev; @@ -232,6 +236,7 @@ static int __init virtio_net_driver_init(void) nic_rx_task_struct_ptr = find_task_by_pid_ns(pid, NULL); + initialized = true; return 0; out_nic: diff --git a/repos/dde_linux/src/lib/lxip/net_driver.h b/repos/dde_linux/src/lib/lxip/net_driver.h index 55dcd59c38..8f4694f5f8 100644 --- a/repos/dde_linux/src/lib/lxip/net_driver.h +++ b/repos/dde_linux/src/lib/lxip/net_driver.h @@ -23,6 +23,7 @@ extern "C" { struct task_struct *lx_nic_client_rx_task(void); bool lx_nic_client_link_state(void); bool lx_nic_client_update_link_state(void); + bool lx_nic_client_initialized(void); /* socket.cc */ void socket_schedule_peer(void); diff --git a/repos/libports/src/lib/lwip/nic_netif.c b/repos/libports/src/lib/lwip/nic_netif.c index 0c4a14c180..e4abc3f5f8 100644 --- a/repos/libports/src/lib/lwip/nic_netif.c +++ b/repos/libports/src/lib/lwip/nic_netif.c @@ -215,7 +215,10 @@ struct genode_netif_handle *lwip_genode_netif_init(char const *label) return NULL; } - handle->nic_handle = genode_nic_client_create(label); + handle->nic_handle = genode_nic_client_create(label); + if (handle->nic_handle == NULL) + return NULL; + handle->netif = net; handle->address_valid = false; handle->address_configured = false; diff --git a/repos/libports/src/lib/lwip/socket.cc b/repos/libports/src/lib/lwip/socket.cc index 0290953b67..a611defccf 100644 --- a/repos/libports/src/lib/lwip/socket.cc +++ b/repos/libports/src/lib/lwip/socket.cc @@ -38,6 +38,8 @@ struct Statics genode_socket_io_progress *io_progress; Genode::Heap *heap; Genode::Env *env; + + bool initialized() const { return netif_ptr && io_progress && heap && env; } }; @@ -343,7 +345,7 @@ void genode_socket_wait_for_progress() } -void genode_socket_init(struct genode_env *_env, +bool genode_socket_init(struct genode_env *_env, struct genode_socket_io_progress *io_progress, char const *label) { @@ -353,6 +355,8 @@ void genode_socket_init(struct genode_env *_env, statics().io_progress = io_progress; static Socket::Main main { env, label }; + + return statics().initialized(); } diff --git a/repos/os/include/genode_c_api/socket.h b/repos/os/include/genode_c_api/socket.h index 2b02a63cce..aa5c40e678 100644 --- a/repos/os/include/genode_c_api/socket.h +++ b/repos/os/include/genode_c_api/socket.h @@ -155,7 +155,7 @@ struct genode_socket_io_progress }; -void genode_socket_init(struct genode_env *env, +bool genode_socket_init(struct genode_env *env, struct genode_socket_io_progress *, char const *label); diff --git a/repos/os/src/lib/genode_c_api/nic_client.cc b/repos/os/src/lib/genode_c_api/nic_client.cc index 64b27707f4..b515a8b47c 100644 --- a/repos/os/src/lib/genode_c_api/nic_client.cc +++ b/repos/os/src/lib/genode_c_api/nic_client.cc @@ -249,11 +249,13 @@ struct genode_nic_client *genode_nic_client_create(char const *label) return nullptr; } - return new (*statics().alloc_ptr) - Registered(statics().nic_clients, *statics().env_ptr, - *statics().alloc_ptr, - statics().sigh, statics().link_sigh, - Session_label(label)); + try { + return new (*statics().alloc_ptr) + Registered(statics().nic_clients, *statics().env_ptr, + *statics().alloc_ptr, + statics().sigh, statics().link_sigh, + Session_label(label)); + } catch (...) { return nullptr; } } diff --git a/repos/os/src/lib/vfs/ip/vfs.cc b/repos/os/src/lib/vfs/ip/vfs.cc index 0ca9969ae3..6f346c340b 100644 --- a/repos/os/src/lib/vfs/ip/vfs.cc +++ b/repos/os/src/lib/vfs/ip/vfs.cc @@ -1998,10 +1998,12 @@ struct Ip_factory : Vfs::File_system_factory using Label = Genode::String; - genode_socket_init(genode_env_ptr(env.env()), &io_progress, - config.attribute_value("label", Label("")).string()); + if (genode_socket_init(genode_env_ptr(env.env()), &io_progress, + config.attribute_value("label", Label("")).string())) + return new (env.alloc()) Vfs::Ip_file_system(env, config); - return new (env.alloc()) Vfs::Ip_file_system(env, config); + struct Socket_init_failed { }; + throw Socket_init_failed(); } };