diff --git a/pressure-vessel/adverb-preload.c b/pressure-vessel/adverb-preload.c index 415b4ee8e7efe463b40283d83db3aec9dad1fe89..2685f6fbfad45f9298ea1ca3da8ec81c6cd411ca 100644 --- a/pressure-vessel/adverb-preload.c +++ b/pressure-vessel/adverb-preload.c @@ -9,11 +9,22 @@ #include "supported-architectures.h" #include "utils.h" -/* Indexed by PreloadVariableIndex */ -static const char *preload_variables[] = +const PvPreloadVariable pv_preload_variables[] = { - "LD_AUDIT", - "LD_PRELOAD", + [PV_PRELOAD_VARIABLE_INDEX_LD_AUDIT] = { + .variable = "LD_AUDIT", + .adverb_option = "--ld-audit", + /* "The items in the list are colon-separated, and there is no support + * for escaping the separator." —ld.so(8) */ + .separators = ":", + }, + [PV_PRELOAD_VARIABLE_INDEX_LD_PRELOAD] = { + .variable = "LD_PRELOAD", + .adverb_option = "--ld-preload", + /* "The items of the list can be separated by spaces or colons, and + * there is no support for escaping either separator." —ld.so(8) */ + .separators = ": ", + }, }; static gpointer @@ -45,7 +56,7 @@ pv_adverb_set_up_preload_modules (FlatpakBwrap *wrapped_command, gsize n_preload_modules, GError **error) { - GPtrArray *preload_search_paths[G_N_ELEMENTS (preload_variables)] = { NULL }; + GPtrArray *preload_search_paths[G_N_ELEMENTS (pv_preload_variables)] = { NULL }; gsize i; /* Iterate through all modules, populating preload_search_paths */ @@ -155,11 +166,11 @@ pv_adverb_set_up_preload_modules (FlatpakBwrap *wrapped_command, /* Serialize search_paths[PRELOAD_VARIABLE_INDEX_LD_AUDIT] into * LD_AUDIT, etc. */ - for (i = 0; i < G_N_ELEMENTS (preload_variables); i++) + for (i = 0; i < G_N_ELEMENTS (pv_preload_variables); i++) { GPtrArray *search_path = preload_search_paths[i]; g_autoptr(GString) buffer = g_string_new (""); - const char *variable = preload_variables[i]; + const char *variable = pv_preload_variables[i].variable; if (search_path != NULL) g_ptr_array_foreach (search_path, (GFunc) append_to_search_path, buffer); diff --git a/pressure-vessel/adverb-preload.h b/pressure-vessel/adverb-preload.h index 3f6ca1f59238a4acf78bd90f50184a549325dba5..bd9c578dcfb66ac6c30804e1136551fbd2b05fed 100644 --- a/pressure-vessel/adverb-preload.h +++ b/pressure-vessel/adverb-preload.h @@ -18,6 +18,15 @@ typedef enum PV_PRELOAD_VARIABLE_INDEX_LD_PRELOAD, } PvPreloadVariableIndex; +typedef struct +{ + const char *variable; + const char *adverb_option; + const char *separators; +} PvPreloadVariable; + +extern const PvPreloadVariable pv_preload_variables[2]; + #define PV_UNSPECIFIED_ABI (G_MAXSIZE) typedef struct diff --git a/pressure-vessel/meson.build b/pressure-vessel/meson.build index 5bb38e9cfb0a91f4070727211b76daa907dc846c..59bfe47c78c6278479792b1d982977231ac798ae 100644 --- a/pressure-vessel/meson.build +++ b/pressure-vessel/meson.build @@ -71,6 +71,8 @@ enums = gnome.mkenums_simple( pressure_vessel_utils = static_library( 'pressure-vessel-utils', sources : [ + 'adverb-preload.c', + 'adverb-preload.h', 'flatpak-bwrap.c', 'flatpak-bwrap-private.h', 'flatpak-utils-base.c', @@ -106,8 +108,6 @@ pressure_vessel_utils_dep = declare_dependency( pressure_vessel_adverb_lib = static_library( 'pressure-vessel-adverb-lib', sources : [ - 'adverb-preload.c', - 'adverb-preload.h', 'adverb-sdl.c', 'adverb-sdl.h', 'per-arch-dirs.c', diff --git a/pressure-vessel/wrap-context.c b/pressure-vessel/wrap-context.c index 3b26215767e1f76f7f9bb80d76f47c417cfb791d..dd711208e75810a0109df8766afacd7d9f8a7d99 100644 --- a/pressure-vessel/wrap-context.c +++ b/pressure-vessel/wrap-context.c @@ -192,17 +192,17 @@ opt_ignored_cb (const gchar *option_name, static gboolean opt_ld_something (PvWrapOptions *self, - PreloadVariableIndex which, + PvPreloadVariableIndex which, const char *value, - const char *separators, + gboolean split, GError **error) { g_auto(GStrv) tokens = NULL; size_t i; - if (separators != NULL) + if (split) { - tokens = g_strsplit_set (value, separators, 0); + tokens = g_strsplit_set (value, pv_preload_variables[which].separators, 0); } else { @@ -230,8 +230,8 @@ opt_ld_audit_cb (const gchar *option_name, gpointer data, GError **error) { - return opt_ld_something (data, PRELOAD_VARIABLE_INDEX_LD_AUDIT, - value, NULL, error); + return opt_ld_something (data, PV_PRELOAD_VARIABLE_INDEX_LD_AUDIT, + value, FALSE, error); } static gboolean @@ -240,10 +240,8 @@ opt_ld_audits_cb (const gchar *option_name, gpointer data, GError **error) { - /* "The items in the list are colon-separated, and there is no support - * for escaping the separator." —ld.so(8) */ - return opt_ld_something (data, PRELOAD_VARIABLE_INDEX_LD_AUDIT, - value, ":", error); + return opt_ld_something (data, PV_PRELOAD_VARIABLE_INDEX_LD_AUDIT, + value, TRUE, error); } static gboolean @@ -252,8 +250,8 @@ opt_ld_preload_cb (const gchar *option_name, gpointer data, GError **error) { - return opt_ld_something (data, PRELOAD_VARIABLE_INDEX_LD_PRELOAD, - value, NULL, error); + return opt_ld_something (data, PV_PRELOAD_VARIABLE_INDEX_LD_PRELOAD, + value, FALSE, error); } static gboolean @@ -262,10 +260,8 @@ opt_ld_preloads_cb (const gchar *option_name, gpointer data, GError **error) { - /* "The items of the list can be separated by spaces or colons, and - * there is no support for escaping either separator." —ld.so(8) */ - return opt_ld_something (data, PRELOAD_VARIABLE_INDEX_LD_PRELOAD, - value, ": ", error); + return opt_ld_something (data, PV_PRELOAD_VARIABLE_INDEX_LD_PRELOAD, + value, TRUE, error); } static gboolean diff --git a/pressure-vessel/wrap-context.h b/pressure-vessel/wrap-context.h index 56d5bcfd7e3ffce142bfb117903903050bbd3ccd..17d2db2c2821faf7654445fe116a51af3e1e9b35 100644 --- a/pressure-vessel/wrap-context.h +++ b/pressure-vessel/wrap-context.h @@ -11,6 +11,7 @@ #include "steam-runtime-tools/resolve-in-sysroot-internal.h" #include "steam-runtime-tools/utils-internal.h" +#include "pressure-vessel/adverb-preload.h" #include "pressure-vessel/flatpak-exports-private.h" #include "pressure-vessel/wrap-interactive.h" @@ -39,15 +40,9 @@ typedef enum TRISTATE_MAYBE } Tristate; -typedef enum -{ - PRELOAD_VARIABLE_INDEX_LD_AUDIT, - PRELOAD_VARIABLE_INDEX_LD_PRELOAD, -} PreloadVariableIndex; - typedef struct { - PreloadVariableIndex which; + PvPreloadVariableIndex which; gchar *preload; } WrapPreloadModule; diff --git a/pressure-vessel/wrap-setup.c b/pressure-vessel/wrap-setup.c index fbaef9c99ee86df56874e95dc424184ab90dd28b..7e31e55cf54cfd8da2e95e0c4cbe4847f6c4d0e7 100644 --- a/pressure-vessel/wrap-setup.c +++ b/pressure-vessel/wrap-setup.c @@ -33,6 +33,7 @@ #include <string.h> +#include "adverb-preload.h" #include "bwrap.h" #include "exports.h" #include "flatpak-run-dbus-private.h" @@ -869,10 +870,7 @@ append_preload_basename (GPtrArray *argv, /** * pv_wrap_append_preload: * @argv: (element-type filename): Array of command-line options to populate - * @variable: (type filename): Environment variable from which this - * preload module was taken, either `LD_AUDIT` or `LD_PRELOAD` - * @option: (type filename): Command-line option to add to @argv, - * either `--ld-audit` or `--ld-preload` + * @which: Either `LD_AUDIT` or `LD_PRELOAD` * @preload: (type filename): Path of preloadable module in current * namespace, possibly including special ld.so tokens such as `$LIB`, * or basename of a preloadable module to be found in the standard @@ -889,8 +887,7 @@ append_preload_basename (GPtrArray *argv, */ void pv_wrap_append_preload (GPtrArray *argv, - const char *variable, - const char *option, + PvPreloadVariableIndex which, const char *preload, GStrv env, PvAppendPreloadFlags flags, @@ -899,11 +896,17 @@ pv_wrap_append_preload (GPtrArray *argv, { SrtLoadableKind kind; SrtLoadableFlags loadable_flags; + const char *variable; + const char *option; g_return_if_fail (argv != NULL); - g_return_if_fail (option != NULL); g_return_if_fail (preload != NULL); g_return_if_fail (runtime == NULL || PV_IS_RUNTIME (runtime)); + g_return_if_fail (which >= 0); + g_return_if_fail (which < G_N_ELEMENTS (pv_preload_variables)); + + variable = pv_preload_variables[which].variable; + option = pv_preload_variables[which].adverb_option; if (strstr (preload, "gtk3-nocsd") != NULL) { diff --git a/pressure-vessel/wrap-setup.h b/pressure-vessel/wrap-setup.h index f0308e8fb0c960960c0cdbb8e9f9af4c1938a57b..936314a4d0901c4947798b462bc6b112340518ba 100644 --- a/pressure-vessel/wrap-setup.h +++ b/pressure-vessel/wrap-setup.h @@ -26,6 +26,7 @@ #include "steam-runtime-tools/env-overlay-internal.h" #include "steam-runtime-tools/utils-internal.h" +#include "adverb-preload.h" #include "bwrap.h" #include "flatpak-bwrap-private.h" #include "flatpak-exports-private.h" @@ -84,8 +85,7 @@ typedef enum } PvAppendPreloadFlags; void pv_wrap_append_preload (GPtrArray *argv, - const char *variable, - const char *option, + PvPreloadVariableIndex which, const char *preload, GStrv env, PvAppendPreloadFlags flags, diff --git a/pressure-vessel/wrap.c b/pressure-vessel/wrap.c index 00aacc9a1adf84cc20b02c37a295a4c3c89aea9f..eddd59e0057a40e780ca0eb150dc2ba14c7c7560 100644 --- a/pressure-vessel/wrap.c +++ b/pressure-vessel/wrap.c @@ -66,16 +66,6 @@ static const GDebugKey pv_debug_keys[] = { "container", PV_WRAP_LOG_FLAGS_CONTAINER }, }; -static const struct -{ - const char *variable; - const char *adverb_option; -} preload_options[] = -{ - [PRELOAD_VARIABLE_INDEX_LD_AUDIT] = { "LD_AUDIT", "--ld-audit" }, - [PRELOAD_VARIABLE_INDEX_LD_PRELOAD] = { "LD_PRELOAD", "--ld-preload" }, -}; - #define usage_error(...) _srt_log_failure (__VA_ARGS__) int @@ -851,10 +841,9 @@ main (int argc, j); g_assert (module->which >= 0); - g_assert (module->which < G_N_ELEMENTS (preload_options)); + g_assert (module->which < G_N_ELEMENTS (pv_preload_variables)); pv_wrap_append_preload (adverb_preload_argv, - preload_options[module->which].variable, - preload_options[module->which].adverb_option, + module->which, module->preload, environ, append_preload_flags, diff --git a/tests/pressure-vessel/wrap-setup.c b/tests/pressure-vessel/wrap-setup.c index a550e05aeb1e5e85c5bcec22be6dce6285e72db4..c238b8af06900e43ec96e1a75602aba15b34726b 100644 --- a/tests/pressure-vessel/wrap-setup.c +++ b/tests/pressure-vessel/wrap-setup.c @@ -979,37 +979,37 @@ test_options_true (Fixture *f, g_assert_cmpuint (options->preload_modules->len, >, i); module = &g_array_index (options->preload_modules, WrapPreloadModule, i++); - g_assert_cmpint (module->which, ==, PRELOAD_VARIABLE_INDEX_LD_AUDIT); + g_assert_cmpint (module->which, ==, PV_PRELOAD_VARIABLE_INDEX_LD_AUDIT); g_assert_cmpstr (module->preload, ==, "libaudit.so"); g_assert_cmpuint (options->preload_modules->len, >, i); module = &g_array_index (options->preload_modules, WrapPreloadModule, i++); - g_assert_cmpint (module->which, ==, PRELOAD_VARIABLE_INDEX_LD_AUDIT); + g_assert_cmpint (module->which, ==, PV_PRELOAD_VARIABLE_INDEX_LD_AUDIT); g_assert_cmpstr (module->preload, ==, "libaudit1.so"); g_assert_cmpuint (options->preload_modules->len, >, i); module = &g_array_index (options->preload_modules, WrapPreloadModule, i++); - g_assert_cmpint (module->which, ==, PRELOAD_VARIABLE_INDEX_LD_AUDIT); + g_assert_cmpint (module->which, ==, PV_PRELOAD_VARIABLE_INDEX_LD_AUDIT); g_assert_cmpstr (module->preload, ==, "libaudit2.so"); g_assert_cmpuint (options->preload_modules->len, >, i); module = &g_array_index (options->preload_modules, WrapPreloadModule, i++); - g_assert_cmpint (module->which, ==, PRELOAD_VARIABLE_INDEX_LD_PRELOAD); + g_assert_cmpint (module->which, ==, PV_PRELOAD_VARIABLE_INDEX_LD_PRELOAD); g_assert_cmpstr (module->preload, ==, "libpreload.so"); g_assert_cmpuint (options->preload_modules->len, >, i); module = &g_array_index (options->preload_modules, WrapPreloadModule, i++); - g_assert_cmpint (module->which, ==, PRELOAD_VARIABLE_INDEX_LD_PRELOAD); + g_assert_cmpint (module->which, ==, PV_PRELOAD_VARIABLE_INDEX_LD_PRELOAD); g_assert_cmpstr (module->preload, ==, "libpreload1.so"); g_assert_cmpuint (options->preload_modules->len, >, i); module = &g_array_index (options->preload_modules, WrapPreloadModule, i++); - g_assert_cmpint (module->which, ==, PRELOAD_VARIABLE_INDEX_LD_PRELOAD); + g_assert_cmpint (module->which, ==, PV_PRELOAD_VARIABLE_INDEX_LD_PRELOAD); g_assert_cmpstr (module->preload, ==, "libpreload2.so"); g_assert_cmpuint (options->preload_modules->len, >, i); module = &g_array_index (options->preload_modules, WrapPreloadModule, i++); - g_assert_cmpint (module->which, ==, PRELOAD_VARIABLE_INDEX_LD_PRELOAD); + g_assert_cmpint (module->which, ==, PV_PRELOAD_VARIABLE_INDEX_LD_PRELOAD); g_assert_cmpstr (module->preload, ==, "libpreload3.so"); g_assert_cmpuint (i, ==, options->preload_modules->len); @@ -1612,8 +1612,7 @@ populate_ld_preload (Fixture *f, } pv_wrap_append_preload (argv, - "LD_PRELOAD", - "--ld-preload", + PV_PRELOAD_VARIABLE_INDEX_LD_PRELOAD, preloads[i].string, f->env, flags | PV_APPEND_PRELOAD_FLAGS_IN_UNIT_TESTS,