diff --git a/pressure-vessel/runtime.c b/pressure-vessel/runtime.c index 1d1093a67f1c972e918cca0bb5edb403252c7bea..17e344fa2b19469b388bd5ab98e836a7d2389e69 100644 --- a/pressure-vessel/runtime.c +++ b/pressure-vessel/runtime.c @@ -77,6 +77,7 @@ struct _PvRuntime PvRuntimeFlags flags; int mutable_parent_fd; int mutable_sysroot_fd; + int provider_fd; gboolean any_libc_from_provider; gboolean all_libc_from_provider; gboolean runtime_is_just_usr; @@ -974,6 +975,10 @@ pv_runtime_initable_init (GInitable *initable, } } + if (!glnx_opendirat (-1, self->provider_in_current_namespace, FALSE, + &self->provider_fd, error)) + return FALSE; + /* Path that, when resolved in the host namespace, points to the provider */ self->provider_in_host_namespace = pv_current_namespace_path_to_host_path (self->provider_in_current_namespace); @@ -1022,6 +1027,7 @@ pv_runtime_finalize (GObject *object) g_free (self->mutable_parent); glnx_close_fd (&self->mutable_sysroot_fd); g_free (self->mutable_sysroot); + glnx_close_fd (&self->provider_fd); g_free (self->provider_in_current_namespace); g_free (self->provider_in_host_namespace); g_free (self->provider_in_container_namespace); @@ -2382,7 +2388,6 @@ pv_runtime_take_ld_so_from_provider (PvRuntime *self, GError **error) { glnx_autofd int path_fd = -1; - glnx_autofd int provider_fd = -1; g_autofree gchar *ld_so_relative_to_provider = NULL; g_autofree gchar *ld_so_in_provider = NULL; @@ -2390,10 +2395,7 @@ pv_runtime_take_ld_so_from_provider (PvRuntime *self, g_debug ("Making provider's ld.so visible in container"); - if (!glnx_opendirat (-1, self->provider_in_current_namespace, FALSE, &provider_fd, error)) - return FALSE; - - path_fd = _srt_resolve_in_sysroot (provider_fd, + path_fd = _srt_resolve_in_sysroot (self->provider_fd, arch->ld_so, SRT_RESOLVE_FLAGS_READABLE, &ld_so_relative_to_provider, error);