diff options
author | Simon McVittie <smcv@collabora.com> | 2020-08-10 23:58:11 +0100 |
---|---|---|
committer | Alexander Larsson <alexander.larsson@gmail.com> | 2020-08-27 17:48:50 +0200 |
commit | 517ad25b5fe83376af258acef646551cb97af97c (patch) | |
tree | 458b51409fd8ef198dc4cb8af7c8753b123c48d9 | |
parent | 3379c277bebebac2c727711fac75e4d7eb66480b (diff) | |
download | flatpak-517ad25b5fe83376af258acef646551cb97af97c.tar.gz |
context: Only parse filesystem/mode strings in one place
This gives us the ability for the parse function (the former verify
function) to carry out a normalization step as well.
Signed-off-by: Simon McVittie <smcv@collabora.com>
-rw-r--r-- | common/flatpak-context.c | 81 | ||||
-rw-r--r-- | common/flatpak-exports-private.h | 1 | ||||
-rw-r--r-- | common/flatpak-exports.c | 20 |
3 files changed, 53 insertions, 49 deletions
diff --git a/common/flatpak-context.c b/common/flatpak-context.c index 04719dcd..c4f4f5f4 100644 --- a/common/flatpak-context.c +++ b/common/flatpak-context.c @@ -97,6 +97,7 @@ flatpak_context_new (void) context = g_slice_new0 (FlatpakContext); context->env_vars = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); context->persistent = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + /* filename or special filesystem name => FlatpakFilesystemMode */ context->filesystems = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); context->session_bus_policy = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); context->system_bus_policy = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); @@ -752,19 +753,23 @@ parse_filesystem_flags (const char *filesystem, } static gboolean -flatpak_context_verify_filesystem (const char *filesystem_and_mode, - GError **error) +flatpak_context_parse_filesystem (const char *filesystem_and_mode, + char **filesystem_out, + FlatpakFilesystemMode *mode_out, + GError **error) { - g_autofree char *filesystem = parse_filesystem_flags (filesystem_and_mode, NULL); + g_autofree char *filesystem = parse_filesystem_flags (filesystem_and_mode, mode_out); - if (g_strv_contains (flatpak_context_special_filesystems, filesystem)) - return TRUE; - if (get_xdg_user_dir_from_string (filesystem, NULL, NULL, NULL)) - return TRUE; - if (g_str_has_prefix (filesystem, "~/")) - return TRUE; - if (g_str_has_prefix (filesystem, "/")) - return TRUE; + if (g_strv_contains (flatpak_context_special_filesystems, filesystem) || + get_xdg_user_dir_from_string (filesystem, NULL, NULL, NULL) || + g_str_has_prefix (filesystem, "~/") || + g_str_has_prefix (filesystem, "/")) + { + if (filesystem_out != NULL) + *filesystem_out = g_steal_pointer (&filesystem); + + return TRUE; + } g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED, _("Unknown filesystem location %s, valid locations are: host, host-os, host-etc, home, xdg-*[/…], ~/dir, /dir"), filesystem); @@ -772,24 +777,13 @@ flatpak_context_verify_filesystem (const char *filesystem_and_mode, } static void -flatpak_context_add_filesystem (FlatpakContext *context, - const char *what) +flatpak_context_take_filesystem (FlatpakContext *context, + char *fs, + FlatpakFilesystemMode mode) { - FlatpakFilesystemMode mode; - char *fs = parse_filesystem_flags (what, &mode); - g_hash_table_insert (context->filesystems, fs, GINT_TO_POINTER (mode)); } -static void -flatpak_context_remove_filesystem (FlatpakContext *context, - const char *what) -{ - g_hash_table_insert (context->filesystems, - parse_filesystem_flags (what, NULL), - NULL); -} - void flatpak_context_merge (FlatpakContext *context, FlatpakContext *other) @@ -1002,11 +996,13 @@ option_filesystem_cb (const gchar *option_name, GError **error) { FlatpakContext *context = data; + g_autofree char *fs = NULL; + FlatpakFilesystemMode mode; - if (!flatpak_context_verify_filesystem (value, error)) + if (!flatpak_context_parse_filesystem (value, &fs, &mode, error)) return FALSE; - flatpak_context_add_filesystem (context, value); + flatpak_context_take_filesystem (context, g_steal_pointer (&fs), mode); return TRUE; } @@ -1017,11 +1013,14 @@ option_nofilesystem_cb (const gchar *option_name, GError **error) { FlatpakContext *context = data; + g_autofree char *fs = NULL; + FlatpakFilesystemMode mode; - if (!flatpak_context_verify_filesystem (value, error)) + if (!flatpak_context_parse_filesystem (value, &fs, &mode, error)) return FALSE; - flatpak_context_remove_filesystem (context, value); + flatpak_context_take_filesystem (context, g_steal_pointer (&fs), + FLATPAK_FILESYSTEM_MODE_NONE); return TRUE; } @@ -1414,14 +1413,18 @@ flatpak_context_load_metadata (FlatpakContext *context, for (i = 0; filesystems[i] != NULL; i++) { const char *fs = parse_negated (filesystems[i], &remove); - if (!flatpak_context_verify_filesystem (fs, NULL)) + g_autofree char *filesystem = NULL; + FlatpakFilesystemMode mode; + + if (!flatpak_context_parse_filesystem (fs, &filesystem, &mode, NULL)) g_debug ("Unknown filesystem type %s", filesystems[i]); else { if (remove) - flatpak_context_remove_filesystem (context, fs); + flatpak_context_take_filesystem (context, g_steal_pointer (&filesystem), + FLATPAK_FILESYSTEM_MODE_NONE); else - flatpak_context_add_filesystem (context, fs); + flatpak_context_take_filesystem (context, g_steal_pointer (&filesystem), mode); } } } @@ -1647,7 +1650,7 @@ flatpak_context_save_metadata (FlatpakContext *context, { FlatpakFilesystemMode mode = GPOINTER_TO_INT (value); - if (mode != 0) + if (mode != FLATPAK_FILESYSTEM_MODE_NONE) g_ptr_array_add (array, unparse_filesystem_flags (key, mode)); else g_ptr_array_add (array, g_strconcat ("!", key, NULL)); @@ -1760,7 +1763,7 @@ flatpak_context_save_metadata (FlatpakContext *context, void flatpak_context_allow_host_fs (FlatpakContext *context) { - flatpak_context_add_filesystem (context, "host"); + flatpak_context_take_filesystem (context, g_strdup ("host"), FLATPAK_FILESYSTEM_MODE_READ_WRITE); } gboolean @@ -1947,7 +1950,7 @@ flatpak_context_to_args (FlatpakContext *context, { FlatpakFilesystemMode mode = GPOINTER_TO_INT (value); - if (mode != 0) + if (mode != FLATPAK_FILESYSTEM_MODE_NONE) { g_autofree char *fs = unparse_filesystem_flags (key, mode); g_ptr_array_add (args, g_strdup_printf ("--filesystem=%s", fs)); @@ -2066,7 +2069,7 @@ flatpak_context_export (FlatpakContext *context, gpointer key, value; fs_mode = (FlatpakFilesystemMode) g_hash_table_lookup (context->filesystems, "host"); - if (fs_mode != 0) + if (fs_mode != FLATPAK_FILESYSTEM_MODE_NONE) { DIR *dir; struct dirent *dirent; @@ -2096,17 +2099,17 @@ flatpak_context_export (FlatpakContext *context, os_mode = MAX ((FlatpakFilesystemMode) g_hash_table_lookup (context->filesystems, "host-os"), fs_mode); - if (os_mode != 0) + if (os_mode != FLATPAK_FILESYSTEM_MODE_NONE) flatpak_exports_add_host_os_expose (exports, os_mode); etc_mode = MAX ((FlatpakFilesystemMode) g_hash_table_lookup (context->filesystems, "host-etc"), fs_mode); - if (etc_mode != 0) + if (etc_mode != FLATPAK_FILESYSTEM_MODE_NONE) flatpak_exports_add_host_etc_expose (exports, etc_mode); home_mode = (FlatpakFilesystemMode) g_hash_table_lookup (context->filesystems, "home"); - if (home_mode != 0) + if (home_mode != FLATPAK_FILESYSTEM_MODE_NONE) { g_debug ("Allowing homedir access"); home_access = TRUE; diff --git a/common/flatpak-exports-private.h b/common/flatpak-exports-private.h index bd335e44..dcb4381e 100644 --- a/common/flatpak-exports-private.h +++ b/common/flatpak-exports-private.h @@ -26,6 +26,7 @@ /* In numerical order of more privs */ typedef enum { + FLATPAK_FILESYSTEM_MODE_NONE = 0, FLATPAK_FILESYSTEM_MODE_READ_ONLY = 1, FLATPAK_FILESYSTEM_MODE_READ_WRITE = 2, FLATPAK_FILESYSTEM_MODE_CREATE = 3, diff --git a/common/flatpak-exports.c b/common/flatpak-exports.c index 25894e71..b54faec6 100644 --- a/common/flatpak-exports.c +++ b/common/flatpak-exports.c @@ -82,7 +82,7 @@ make_relative (const char *base, const char *path) } #define FAKE_MODE_DIR -1 /* Ensure a dir, either on tmpfs or mapped parent */ -#define FAKE_MODE_TMPFS 0 +#define FAKE_MODE_TMPFS FLATPAK_FILESYSTEM_MODE_NONE #define FAKE_MODE_SYMLINK G_MAXINT typedef struct @@ -301,7 +301,7 @@ flatpak_exports_append_bwrap_args (FlatpakExports *exports, } } - if (exports->host_os != 0) + if (exports->host_os != FLATPAK_FILESYSTEM_MODE_NONE) { const char *os_bind_mode = "--bind"; int i; @@ -355,7 +355,7 @@ flatpak_exports_append_bwrap_args (FlatpakExports *exports, } } - if (exports->host_etc == 0) + if (exports->host_etc == FLATPAK_FILESYSTEM_MODE_NONE) { guint i; @@ -383,7 +383,7 @@ flatpak_exports_append_bwrap_args (FlatpakExports *exports, } } - if (exports->host_etc != 0) + if (exports->host_etc != FLATPAK_FILESYSTEM_MODE_NONE) { const char *etc_bind_mode = "--bind"; @@ -404,7 +404,7 @@ flatpak_exports_append_bwrap_args (FlatpakExports *exports, flatpak_bwrap_add_args (bwrap, "--ro-bind", "/usr/lib/os-release", "/run/host/os-release", NULL); } -/* Returns 0 if not visible */ +/* Returns FLATPAK_FILESYSTEM_MODE_NONE if not visible */ FlatpakFilesystemMode flatpak_exports_path_get_mode (FlatpakExports *exports, const char *path) @@ -449,7 +449,7 @@ flatpak_exports_path_get_mode (FlatpakExports *exports, break; } - return 0; + return FLATPAK_FILESYSTEM_MODE_NONE; } if (S_ISLNK (st.st_mode)) @@ -459,7 +459,7 @@ flatpak_exports_path_get_mode (FlatpakExports *exports, int j; if (resolved == NULL) - return 0; + return FLATPAK_FILESYSTEM_MODE_NONE; path2_builder = g_string_new (resolved); @@ -473,7 +473,7 @@ flatpak_exports_path_get_mode (FlatpakExports *exports, } } else if (parts[i + 1] == NULL) - return 0; /* Last part was not mapped */ + return FLATPAK_FILESYSTEM_MODE_NONE; /* Last part was not mapped */ } if (is_readonly) @@ -486,7 +486,7 @@ gboolean flatpak_exports_path_is_visible (FlatpakExports *exports, const char *path) { - return flatpak_exports_path_get_mode (exports, path) > 0; + return flatpak_exports_path_get_mode (exports, path) > FLATPAK_FILESYSTEM_MODE_NONE; } static gboolean @@ -727,7 +727,7 @@ flatpak_exports_add_path_expose_or_hide (FlatpakExports *exports, FlatpakFilesystemMode mode, const char *path) { - if (mode == 0) + if (mode == FLATPAK_FILESYSTEM_MODE_NONE) flatpak_exports_add_path_tmpfs (exports, path); else flatpak_exports_add_path_expose (exports, mode, path); |