diff --git a/pressure-vessel/wrap-context.c b/pressure-vessel/wrap-context.c index 8216431faebe3a48a4169b8cd0cf1ef470e2a534..102c1f8e52663d4dd39db472d729645940f29930 100644 --- a/pressure-vessel/wrap-context.c +++ b/pressure-vessel/wrap-context.c @@ -117,6 +117,7 @@ pv_wrap_context_init (PvWrapContext *self) { self->is_flatpak_env = g_file_test ("/.flatpak-info", G_FILE_TEST_IS_REGULAR); self->original_environ = g_get_environ (); + self->current_home_fd = -1; pv_wrap_options_init (&self->options); @@ -178,11 +179,27 @@ static void pv_wrap_context_constructed (GObject *object) { PvWrapContext *self = PV_WRAP_CONTEXT (object); + g_autoptr(GError) local_error = NULL; G_OBJECT_CLASS (pv_wrap_context_parent_class)->constructed (object); if (self->current_home == NULL) self->current_home = g_strdup (g_get_home_dir ()); + + self->current_home_fd = _srt_sysroot_open (self->current_root, + self->current_home, + (SRT_RESOLVE_FLAGS_READABLE + | SRT_RESOLVE_FLAGS_MUST_BE_DIRECTORY), + NULL, + &local_error); + + + if (self->current_home_fd < 0) + { + g_warning ("Cannot open current home directory \"%s\": %s", + self->current_home, local_error->message); + g_clear_error (&local_error); + } } static void @@ -208,6 +225,7 @@ pv_wrap_context_finalize (GObject *object) g_strfreev (self->original_argv); g_strfreev (self->original_environ); g_free (self->current_home); + glnx_close_fd (&self->current_home_fd); G_OBJECT_CLASS (pv_wrap_context_parent_class)->finalize (object); } diff --git a/pressure-vessel/wrap-context.h b/pressure-vessel/wrap-context.h index 68cc601a14f0b5cf366419f7b8ef353ba7eef463..8538ce6f23880ff481c46ea2be923cba15947bbd 100644 --- a/pressure-vessel/wrap-context.h +++ b/pressure-vessel/wrap-context.h @@ -105,6 +105,7 @@ struct _PvWrapContext gboolean is_flatpak_env; int original_argc; + int current_home_fd; }; #define PV_TYPE_WRAP_CONTEXT \ diff --git a/pressure-vessel/wrap.c b/pressure-vessel/wrap.c index de714d16c4a899563f1390c0d4300aa4bbdcacb7..8729b85df57f69e95d409e11c287db48266d93ab 100644 --- a/pressure-vessel/wrap.c +++ b/pressure-vessel/wrap.c @@ -915,7 +915,8 @@ main (int argc, cwd_p_host = pv_current_namespace_path_to_host_path (cwd_p); - if (_srt_is_same_file (self->current_home, cwd_p)) + if (self->current_home_fd >= 0 + && _srt_fstatat_is_same_file (self->current_home_fd, "", AT_FDCWD, cwd_p)) { g_info ("Not making physical working directory \"%s\" available to " "container because it is the home directory", diff --git a/tests/pressure-vessel/wrap-setup.c b/tests/pressure-vessel/wrap-setup.c index 0dfada91955d445b01be26a559cd48076dcad146..177509c2f09ab5c89412d8d6f56c57fbc2e1b45b 100644 --- a/tests/pressure-vessel/wrap-setup.c +++ b/tests/pressure-vessel/wrap-setup.c @@ -80,6 +80,7 @@ typedef struct PvWrapContext *context; SrtSysroot *mock_host; FlatpakBwrap *bwrap; + gchar *home; gchar *tmpdir; gchar *mock_runtime; gchar *var; @@ -242,6 +243,9 @@ setup (Fixture *f, glnx_opendirat (AT_FDCWD, f->var, TRUE, &f->var_fd, &local_error); g_assert_no_error (local_error); + f->home = g_build_filename (f->mock_host->path, "home", "me", NULL); + glnx_shutil_mkdir_p_at (AT_FDCWD, f->home, 0755, NULL, &local_error); + g_assert_no_error (local_error); f->context = pv_wrap_context_new (f->mock_host, "/home/me", &local_error); g_assert_no_error (local_error); f->bwrap = flatpak_bwrap_new (flatpak_bwrap_empty_env); @@ -311,6 +315,7 @@ teardown (Fixture *f, g_clear_object (&f->context); g_clear_object (&f->mock_host); g_clear_pointer (&f->mock_runtime, g_free); + g_clear_pointer (&f->home, g_free); g_clear_pointer (&f->tmpdir, g_free); g_clear_pointer (&f->var, g_free); g_clear_pointer (&f->bwrap, flatpak_bwrap_free);