diff --git a/pressure-vessel/exports.c b/pressure-vessel/exports.c new file mode 100644 index 0000000000000000000000000000000000000000..4c1f845a90e72846585526c86240a364efc9a8c5 --- /dev/null +++ b/pressure-vessel/exports.c @@ -0,0 +1,82 @@ +/* + * Copyright © 2017-2020 Collabora Ltd. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, see <http://www.gnu.org/licenses/>. + */ + +#include "exports.h" + +#include <ftw.h> + +/* nftw() doesn't have a user_data argument so we need to use a global + * variable :-( */ +static struct +{ + FlatpakExports *exports; +} export_targets_data; + +static int +export_targets_helper (const char *fpath, + const struct stat *sb, + int typeflag, + struct FTW *ftwbuf) +{ + g_autofree gchar *target = NULL; + + switch (typeflag) + { + case FTW_SL: + target = glnx_readlinkat_malloc (-1, fpath, NULL, NULL); + + if (target[0] != '/') + break; + + if (g_str_has_prefix (target, "/run/host/")) + break; + + g_debug ("Exporting %s because %s points to it", + target, fpath); + flatpak_exports_add_path_expose (export_targets_data.exports, + FLATPAK_FILESYSTEM_MODE_READ_ONLY, + target); + break; + + default: + break; + } + + return 0; +} + +/** + * pv_export_symlink_targets: + * @exports: The #FlatpakExports + * @source: A copy of the overrides directory, for example + * `/tmp/tmp12345678/overrides/lib`. + * + * For every symbolic link in @source, if the target is absolute, mark + * it to be exported in @exports. + */ +void +pv_export_symlink_targets (FlatpakExports *exports, + const char *source) +{ + g_return_if_fail (export_targets_data.exports == NULL); + + export_targets_data.exports = exports; + nftw (source, export_targets_helper, 100, FTW_PHYS); + export_targets_data.exports = NULL; +} diff --git a/pressure-vessel/exports.h b/pressure-vessel/exports.h new file mode 100644 index 0000000000000000000000000000000000000000..97d92691c202a4c56db866ef726a1c274575a33f --- /dev/null +++ b/pressure-vessel/exports.h @@ -0,0 +1,28 @@ +/* + * Copyright © 2017-2020 Collabora Ltd. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, see <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#include "libglnx/libglnx.h" + +#include "flatpak-exports-private.h" +#include "steam-runtime-tools/glib-backports-internal.h" + +void pv_export_symlink_targets (FlatpakExports *exports, + const char *source); diff --git a/pressure-vessel/meson.build b/pressure-vessel/meson.build index df74607764ce93bb1c4da5c960258cabddda045b..ed93e41b7baf58f9634cdab8e8c348020ab666e2 100644 --- a/pressure-vessel/meson.build +++ b/pressure-vessel/meson.build @@ -191,6 +191,8 @@ executable( sources : [ 'bwrap.c', 'bwrap.h', + 'exports.c', + 'exports.h', 'flatpak-common-types-private.h', 'flatpak-context.c', 'flatpak-context-private.h', diff --git a/pressure-vessel/runtime.c b/pressure-vessel/runtime.c index 8af25be2b6c1b6b686c2a56efdada4b47c75747d..d39e2e63e77841a0ba78ccf16131b3f7a23d443c 100644 --- a/pressure-vessel/runtime.c +++ b/pressure-vessel/runtime.c @@ -36,6 +36,7 @@ #include "bwrap-lock.h" #include "elf-utils.h" #include "enumtypes.h" +#include "exports.h" #include "flatpak-run-private.h" #include "tree-copy.h" #include "utils.h" @@ -1626,6 +1627,7 @@ bind_icd (PvRuntime *self, static gboolean bind_runtime (PvRuntime *self, + FlatpakExports *exports, FlatpakBwrap *bwrap, GHashTable *extra_locked_vars_to_unset, GHashTable *extra_locked_vars_to_inherit, @@ -1817,6 +1819,8 @@ bind_runtime (PvRuntime *self, return FALSE; } + pv_export_symlink_targets (exports, self->overrides); + if (self->mutable_sysroot == NULL) { /* self->overrides is in a temporary directory that will be @@ -3615,6 +3619,7 @@ pv_runtime_use_provider_graphics_stack (PvRuntime *self, gboolean pv_runtime_bind (PvRuntime *self, + FlatpakExports *exports, FlatpakBwrap *bwrap, GHashTable *extra_locked_vars_to_unset, GHashTable *extra_locked_vars_to_inherit, @@ -3623,13 +3628,18 @@ pv_runtime_bind (PvRuntime *self, g_autofree gchar *pressure_vessel_prefix = NULL; g_return_val_if_fail (PV_IS_RUNTIME (self), FALSE); + g_return_val_if_fail (exports != NULL, FALSE); g_return_val_if_fail (!pv_bwrap_was_finished (bwrap), FALSE); g_return_val_if_fail (extra_locked_vars_to_unset != NULL, FALSE); g_return_val_if_fail (extra_locked_vars_to_inherit != NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - if (!bind_runtime (self, bwrap, extra_locked_vars_to_unset, - extra_locked_vars_to_inherit, error)) + if (!bind_runtime (self, + exports, + bwrap, + extra_locked_vars_to_unset, + extra_locked_vars_to_inherit, + error)) return FALSE; pressure_vessel_prefix = g_path_get_dirname (self->tools_dir); diff --git a/pressure-vessel/runtime.h b/pressure-vessel/runtime.h index 0b3d2944a4c2064da37a84afce5e647bbe4624f5..1d8ede2adda4854b96020aec7c3504fe7475c41e 100644 --- a/pressure-vessel/runtime.h +++ b/pressure-vessel/runtime.h @@ -27,6 +27,7 @@ #include "libglnx/libglnx.h" #include "flatpak-bwrap-private.h" +#include "flatpak-exports-private.h" #include "flatpak-utils-base-private.h" /** @@ -82,6 +83,7 @@ PvRuntime *pv_runtime_new (const char *source_files, gchar *pv_runtime_get_adverb (PvRuntime *self, FlatpakBwrap *adverb_args); gboolean pv_runtime_bind (PvRuntime *self, + FlatpakExports *exports, FlatpakBwrap *bwrap, GHashTable *extra_locked_vars_to_unset, GHashTable *extra_locked_vars_to_inherit, diff --git a/pressure-vessel/wrap.c b/pressure-vessel/wrap.c index 5bfa3a7b3743bead1acda1061090c8945b8b65f2..0662960e2ef5fb4bd25bb136cdc4835fea00fd9c 100644 --- a/pressure-vessel/wrap.c +++ b/pressure-vessel/wrap.c @@ -1781,8 +1781,12 @@ main (int argc, if (runtime == NULL) goto out; - if (!pv_runtime_bind (runtime, bwrap, extra_locked_vars_to_unset, - extra_locked_vars_to_inherit, error)) + if (!pv_runtime_bind (runtime, + exports, + bwrap, + extra_locked_vars_to_unset, + extra_locked_vars_to_inherit, + error)) goto out; } else if (is_flatpak_env)