diff --git a/tests/pressure-vessel/wrap-setup.c b/tests/pressure-vessel/wrap-setup.c index cda5404fb157062367eb3b4a282d81378d511388..0aa8ce66acb26beb40d9bd8bf5d019e9dfaa561f 100644 --- a/tests/pressure-vessel/wrap-setup.c +++ b/tests/pressure-vessel/wrap-setup.c @@ -35,9 +35,21 @@ #include "tests/test-utils.h" +#include "supported-architectures.h" #include "wrap-setup.h" #include "utils.h" +/* These match the first entry in PvMultiArchdetails.platforms, + * which is the easiest realistic thing for a mock implementation of + * srt_system_info_check_library() to use. */ +#define MOCK_PLATFORM_32 "i686" +#define MOCK_PLATFORM_64 "xeon_phi" + +/* These match Debian multiarch, which is as good a thing as any for + * a mock implementation of srt_system_info_check_library() to use. */ +#define MOCK_LIB_32 "lib/" SRT_ABI_I386 +#define MOCK_LIB_64 "lib/" SRT_ABI_X86_64 + typedef struct { TestsOpenFdSet old_fds; @@ -117,11 +129,18 @@ setup (Fixture *f, static const char * const touch[] = { "app/lib/libpreloadA.so", + "future/libs-post2038/.exists", "home/me/libpreloadH.so", "lib/libpreload-rootfs.so", + "opt/" MOCK_LIB_32 "/libpreloadL.so", + "opt/" MOCK_LIB_64 "/libpreloadL.so", + "overlay/libs/usr/lib/libpreloadO.so", + "platform/plat-" MOCK_PLATFORM_32 "/libpreloadP.so", + "platform/plat-" MOCK_PLATFORM_64 "/libpreloadP.so", "steam/lib/gameoverlayrenderer.so", "usr/lib/libpreloadU.so", "usr/local/lib/libgtk3-nocsd.so.0", + "in-root-plat-" MOCK_PLATFORM_32 "-only-32-bit.so", }; g_autoptr(GError) local_error = NULL; gsize i; @@ -191,10 +210,18 @@ populate_ld_preload (Fixture *f, { "" }, { "" }, { "/app/lib/libpreloadA.so" }, + { "/platform/plat-$PLATFORM/libpreloadP.so" }, + { "/opt/${LIB}/libpreloadL.so" }, { "/lib/libpreload-rootfs.so" }, { "/usr/lib/libpreloadU.so" }, { "/home/me/libpreloadH.so" }, { "/steam/lib/gameoverlayrenderer.so" }, + { "/overlay/libs/${ORIGIN}/../lib/libpreloadO.so" }, + { "/future/libs-$FUTURE/libpreloadF.so" }, + { "/in-root-plat-${PLATFORM}-only-32-bit.so" }, + { "/in-root-${FUTURE}.so" }, + { "./${RELATIVE}.so" }, + { "./relative.so" }, { "/usr/local/lib/libgtk3-nocsd.so.0", .warning = "Disabling gtk3-nocsd LD_PRELOAD: it is known to cause crashes.", @@ -245,6 +272,12 @@ populate_ld_preload (Fixture *f, g_log_set_always_fatal (old_fatal_mask); } } + + for (i = 0; i < argv->len; i++) + g_test_message ("argv[%" G_GSIZE_FORMAT "]: %s", + i, (const char *) g_ptr_array_index (argv, i)); + + g_test_message ("argv->len: %" G_GSIZE_FORMAT, i); } static void @@ -264,6 +297,28 @@ test_remap_ld_preload (Fixture *f, g_assert_cmpstr (g_ptr_array_index (argv, i++), ==, "--ld-preload=/app/lib/libpreloadA.so"); + /* TODO: We should split up /platform/plat-$PLATFORM/libpreloadP.so into + * its per-platform resolutions */ + while (argv->len > i) + { + if (g_str_has_prefix (g_ptr_array_index (argv, i), + "--ld-preload=/platform/plat-")) + i++; + else + break; + } + + /* TODO: We should split up /opt/${LIB}/libpreloadL.so into + * its per-platform resolutions */ + while (argv->len > i) + { + if (g_str_has_prefix (g_ptr_array_index (argv, i), + "--ld-preload=/opt/")) + i++; + else + break; + } + g_assert_cmpuint (argv->len, >, i); g_assert_cmpstr (g_ptr_array_index (argv, i++), ==, "--ld-preload=/run/host/lib/libpreload-rootfs.so"); @@ -280,6 +335,38 @@ test_remap_ld_preload (Fixture *f, g_assert_cmpstr (g_ptr_array_index (argv, i++), ==, "--ld-preload=/steam/lib/gameoverlayrenderer.so"); + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=/overlay/libs/${ORIGIN}/../lib/libpreloadO.so"); + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=/future/libs-$FUTURE/libpreloadF.so"); + + /* TODO: We should split this up into its per-platform resolutions, + * then discard the 64-bit resolution because it doesn't exist, and + * only keep the 32-bit resolution */ + while (argv->len > i) + { + if (g_str_has_prefix (g_ptr_array_index (argv, i), + "--ld-preload=/in-root-plat-")) + i++; + else + break; + } + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=/in-root-${FUTURE}.so"); + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=./${RELATIVE}.so"); + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=./relative.so"); + g_assert_cmpuint (argv->len, ==, i); /* FlatpakExports never exports /app */ @@ -293,6 +380,27 @@ test_remap_ld_preload (Fixture *f, g_assert_false (flatpak_exports_path_is_visible (exports, "/home/me")); g_assert_true (flatpak_exports_path_is_visible (exports, "/home/me/libpreloadH.so")); + /* We don't always export /opt, so we have to explicitly export + * these. */ + g_assert_false (flatpak_exports_path_is_visible (exports, "/opt")); + g_assert_false (flatpak_exports_path_is_visible (exports, "/opt/lib")); + + if (!flatpak_exports_path_is_visible (exports, "/opt/" MOCK_LIB_32 "/libpreloadL.so")) + g_test_message ("TODO: Export filenames in /opt/$LIB"); + + if (!flatpak_exports_path_is_visible (exports, "/opt/" MOCK_LIB_64 "/libpreloadL.so")) + g_test_message ("TODO: Export filenames in /opt/$LIB"); + + /* We don't always export /platform, so we have to explicitly export + * these. */ + g_assert_false (flatpak_exports_path_is_visible (exports, "/platform")); + + if (!flatpak_exports_path_is_visible (exports, "/platform/plat-" MOCK_PLATFORM_32 "/libpreloadP.so")) + g_test_message ("TODO: Export filenames in /platform"); + + if (!flatpak_exports_path_is_visible (exports, "/platform/plat-" MOCK_PLATFORM_64 "/libpreloadP.so")) + g_test_message ("TODO: Export filenames in /platform"); + /* FlatpakExports never exports /lib as /lib */ g_assert_false (flatpak_exports_path_is_visible (exports, "/lib")); g_assert_false (flatpak_exports_path_is_visible (exports, "/lib/libpreload-rootfs.so")); @@ -306,6 +414,22 @@ test_remap_ld_preload (Fixture *f, g_assert_false (flatpak_exports_path_is_visible (exports, "/steam")); g_assert_false (flatpak_exports_path_is_visible (exports, "/steam/lib")); g_assert_false (flatpak_exports_path_is_visible (exports, "/steam/lib/gameoverlayrenderer.so")); + + /* We don't know what ${ORIGIN} will expand to, so we have to cut off at + * /overlay/libs */ + g_assert_false (flatpak_exports_path_is_visible (exports, "/overlay")); + + if (!flatpak_exports_path_is_visible (exports, "/overlay/libs")) + g_test_message ("TODO: Export /overlay/libs"); + + /* We don't know what ${FUTURE} will expand to, so we have to cut off at + * /future */ + if (!flatpak_exports_path_is_visible (exports, "/future")) + g_test_message ("TODO: Export /future"); + + /* We don't export the entire root directory just because it has a + * module in it */ + g_assert_true (flatpak_exports_path_is_visible (exports, "/")); } static void @@ -325,6 +449,28 @@ test_remap_ld_preload_flatpak (Fixture *f, g_assert_cmpstr (g_ptr_array_index (argv, i++), ==, "--ld-preload=/run/parent/app/lib/libpreloadA.so"); + /* TODO: We should split up /platform/plat-$PLATFORM/libpreloadP.so into + * its per-platform resolutions */ + while (argv->len > i) + { + if (g_str_has_prefix (g_ptr_array_index (argv, i), + "--ld-preload=/platform/plat-")) + i++; + else + break; + } + + /* TODO: We should split up /opt/${LIB}/libpreloadL.so into + * its per-platform resolutions */ + while (argv->len > i) + { + if (g_str_has_prefix (g_ptr_array_index (argv, i), + "--ld-preload=/opt/")) + i++; + else + break; + } + g_assert_cmpuint (argv->len, >, i); g_assert_cmpstr (g_ptr_array_index (argv, i++), ==, "--ld-preload=/run/parent/lib/libpreload-rootfs.so"); @@ -341,6 +487,38 @@ test_remap_ld_preload_flatpak (Fixture *f, g_assert_cmpstr (g_ptr_array_index (argv, i++), ==, "--ld-preload=/steam/lib/gameoverlayrenderer.so"); + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=/overlay/libs/${ORIGIN}/../lib/libpreloadO.so"); + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=/future/libs-$FUTURE/libpreloadF.so"); + + /* TODO: We should split this up into its per-platform resolutions, + * then discard the 64-bit resolution because it doesn't exist, and + * only keep the 32-bit resolution */ + while (argv->len > i) + { + if (g_str_has_prefix (g_ptr_array_index (argv, i), + "--ld-preload=/in-root-plat-")) + i++; + else + break; + } + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=/in-root-${FUTURE}.so"); + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=./${RELATIVE}.so"); + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=./relative.so"); + g_assert_cmpuint (argv->len, ==, i); } @@ -366,6 +544,28 @@ test_remap_ld_preload_no_runtime (Fixture *f, g_assert_cmpstr (g_ptr_array_index (argv, i++), ==, "--ld-preload=/app/lib/libpreloadA.so"); + /* TODO: We should split up /platform/plat-$PLATFORM/libpreloadP.so into + * its per-platform resolutions */ + while (argv->len > i) + { + if (g_str_has_prefix (g_ptr_array_index (argv, i), + "--ld-preload=/platform/plat-")) + i++; + else + break; + } + + /* TODO: We should split up /opt/${LIB}/libpreloadL.so into + * its per-platform resolutions */ + while (argv->len > i) + { + if (g_str_has_prefix (g_ptr_array_index (argv, i), + "--ld-preload=/opt/")) + i++; + else + break; + } + g_assert_cmpuint (argv->len, >, i); g_assert_cmpstr (g_ptr_array_index (argv, i++), ==, "--ld-preload=/lib/libpreload-rootfs.so"); @@ -378,6 +578,41 @@ test_remap_ld_preload_no_runtime (Fixture *f, g_assert_cmpstr (g_ptr_array_index (argv, i++), ==, "--ld-preload=/home/me/libpreloadH.so"); + /* /steam/lib/gameoverlayrenderer.so is missing because we used the + * REMOVE_GAME_OVERLAY flag */ + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=/overlay/libs/${ORIGIN}/../lib/libpreloadO.so"); + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=/future/libs-$FUTURE/libpreloadF.so"); + + /* TODO: We should split this up into its per-platform resolutions, + * then discard the 64-bit resolution because it doesn't exist, and + * only keep the 32-bit resolution */ + while (argv->len > i) + { + if (g_str_has_prefix (g_ptr_array_index (argv, i), + "--ld-preload=/in-root-plat-")) + i++; + else + break; + } + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=/in-root-${FUTURE}.so"); + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=./${RELATIVE}.so"); + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=./relative.so"); + g_assert_cmpuint (argv->len, ==, i); /* FlatpakExports never exports /app */ @@ -391,6 +626,27 @@ test_remap_ld_preload_no_runtime (Fixture *f, g_assert_false (flatpak_exports_path_is_visible (exports, "/home/me")); g_assert_true (flatpak_exports_path_is_visible (exports, "/home/me/libpreloadH.so")); + /* We don't always export /opt, so we have to explicitly export + * these. */ + g_assert_false (flatpak_exports_path_is_visible (exports, "/opt")); + g_assert_false (flatpak_exports_path_is_visible (exports, "/opt/lib")); + + if (!flatpak_exports_path_is_visible (exports, "/opt/" MOCK_LIB_32 "/libpreloadL.so")) + g_test_message ("TODO: Export filenames in /opt/$LIB"); + + if (!flatpak_exports_path_is_visible (exports, "/opt/" MOCK_LIB_64 "/libpreloadL.so")) + g_test_message ("TODO: Export filenames in /opt/$LIB"); + + /* We don't always export /platform, so we have to explicitly export + * these. */ + g_assert_false (flatpak_exports_path_is_visible (exports, "/platform")); + + if (!flatpak_exports_path_is_visible (exports, "/platform/plat-" MOCK_PLATFORM_32 "/libpreloadP.so")) + g_test_message ("TODO: Export filenames in /platform"); + + if (!flatpak_exports_path_is_visible (exports, "/platform/plat-" MOCK_PLATFORM_64 "/libpreloadP.so")) + g_test_message ("TODO: Export filenames in /platform"); + /* FlatpakExports never exports /lib as /lib */ g_assert_false (flatpak_exports_path_is_visible (exports, "/lib")); g_assert_false (flatpak_exports_path_is_visible (exports, "/lib/libpreload-rootfs.so")); @@ -399,6 +655,22 @@ test_remap_ld_preload_no_runtime (Fixture *f, g_assert_false (flatpak_exports_path_is_visible (exports, "/usr")); g_assert_false (flatpak_exports_path_is_visible (exports, "/usr/lib")); g_assert_false (flatpak_exports_path_is_visible (exports, "/usr/lib/libpreloadU.so")); + + /* We don't know what ${ORIGIN} will expand to, so we have to cut off at + * /overlay/libs */ + g_assert_false (flatpak_exports_path_is_visible (exports, "/overlay")); + + if (!flatpak_exports_path_is_visible (exports, "/overlay/libs")) + g_test_message ("TODO: Export /overlay/libs"); + + /* We don't know what ${FUTURE} will expand to, so we have to cut off at + * /future */ + if (!flatpak_exports_path_is_visible (exports, "/future")) + g_test_message ("TODO: Export /future"); + + /* We don't export the entire root directory just because it has a + * module in it */ + g_assert_true (flatpak_exports_path_is_visible (exports, "/")); } static void @@ -417,6 +689,28 @@ test_remap_ld_preload_flatpak_no_runtime (Fixture *f, g_assert_cmpstr (g_ptr_array_index (argv, i++), ==, "--ld-preload=/app/lib/libpreloadA.so"); + /* TODO: We should split up /platform/plat-$PLATFORM/libpreloadP.so into + * its per-platform resolutions */ + while (argv->len > i) + { + if (g_str_has_prefix (g_ptr_array_index (argv, i), + "--ld-preload=/platform/plat-")) + i++; + else + break; + } + + /* TODO: We should split up /opt/${LIB}/libpreloadL.so into + * its per-platform resolutions */ + while (argv->len > i) + { + if (g_str_has_prefix (g_ptr_array_index (argv, i), + "--ld-preload=/opt/")) + i++; + else + break; + } + g_assert_cmpuint (argv->len, >, i); g_assert_cmpstr (g_ptr_array_index (argv, i++), ==, "--ld-preload=/lib/libpreload-rootfs.so"); @@ -433,6 +727,38 @@ test_remap_ld_preload_flatpak_no_runtime (Fixture *f, g_assert_cmpstr (g_ptr_array_index (argv, i++), ==, "--ld-preload=/steam/lib/gameoverlayrenderer.so"); + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=/overlay/libs/${ORIGIN}/../lib/libpreloadO.so"); + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=/future/libs-$FUTURE/libpreloadF.so"); + + /* TODO: We should split this up into its per-platform resolutions, + * then discard the 64-bit resolution because it doesn't exist, and + * only keep the 32-bit resolution */ + while (argv->len > i) + { + if (g_str_has_prefix (g_ptr_array_index (argv, i), + "--ld-preload=/in-root-plat-")) + i++; + else + break; + } + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=/in-root-${FUTURE}.so"); + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=./${RELATIVE}.so"); + + g_assert_cmpuint (argv->len, >, i); + g_assert_cmpstr (g_ptr_array_index (argv, i++), + ==, "--ld-preload=./relative.so"); + g_assert_cmpuint (argv->len, ==, i); }