diff options
author | Ondrej Holy <oholy@redhat.com> | 2017-08-15 10:12:33 +0200 |
---|---|---|
committer | Ondrej Holy <oholy@redhat.com> | 2017-08-21 14:50:44 +0200 |
commit | fbce9f8db631d6f0d95700f82b433e9f549090db (patch) | |
tree | 5fc8632c02d2b5bc94d3c1fa035b4417b5c0d0f8 /client/gdaemonfile.c | |
parent | 33f6ff08b5612f514ef3a6f11ddbf9b22bf0edc3 (diff) | |
download | gvfs-fbce9f8db631d6f0d95700f82b433e9f549090db.tar.gz |
gdaemonfile: Fix relative path handling
g_daemon_file_get_relative_path() fails for files with different
mount_prefix and always return NULL. It happen when comparing two files
from different origins, e.g. g_mount_get_root() and g_file_new_for_uri().
On the other hand, g_daemon_file_prefix_matches() can succeed in cases,
where paths don't have the same prefixes, because it just compares
mount_prefix of a parent with a path of a descendant, but a path of the
parent is ignored.
The code concatenates mount_prefix with a path, so the comparison never
succeeds if mount_prefix is set, because mount_prefix is already part of
the path in GDaemonFile. Let's ignore mount_prefix when comparing and
always compare the paths, so we can significantly simplify the code.
https://bugzilla.gnome.org/show_bug.cgi?id=786217
Diffstat (limited to 'client/gdaemonfile.c')
-rw-r--r-- | client/gdaemonfile.c | 68 |
1 files changed, 15 insertions, 53 deletions
diff --git a/client/gdaemonfile.c b/client/gdaemonfile.c index 2807c801..d51c4c00 100644 --- a/client/gdaemonfile.c +++ b/client/gdaemonfile.c @@ -321,32 +321,21 @@ g_daemon_file_prefix_matches (GFile *parent, GDaemonFile *descendant_daemon = G_DAEMON_FILE (descendant); const char *remainder; - if (descendant_daemon->mount_spec == parent_daemon->mount_spec) + /* If descendant was created with g_file_new_for_uri(), it's + * mount_prefix is /, but parent might have a different mount_prefix, + * for example if obtained by g_mount_get_root() + */ + if (descendant_daemon->mount_spec == parent_daemon->mount_spec || + g_mount_spec_match_with_path (parent_daemon->mount_spec, + descendant_daemon->mount_spec, + descendant_daemon->path)) { remainder = match_prefix (descendant_daemon->path, parent_daemon->path); if (remainder != NULL && *remainder == '/') return TRUE; - else - return FALSE; } - else - { - /* If descendant was created with g_file_new_for_uri(), it's - mount_prefix is /, but parent might have a different mount_prefix, - for example if obtained by g_mount_get_root() - */ - char *full_path; - gboolean ok; - - full_path = g_build_path ("/", descendant_daemon->mount_spec->mount_prefix, - descendant_daemon->path, NULL); - ok = g_mount_spec_match_with_path (parent_daemon->mount_spec, - descendant_daemon->mount_spec, - full_path); - g_free (full_path); - return ok; - } + return FALSE; } static char * @@ -356,7 +345,11 @@ g_daemon_file_get_relative_path (GFile *parent, GDaemonFile *parent_daemon = G_DAEMON_FILE (parent); GDaemonFile *descendant_daemon = G_DAEMON_FILE (descendant); - if (descendant_daemon->mount_spec == parent_daemon->mount_spec) + /* See comment in g_daemon_file_prefix_matches */ + if (descendant_daemon->mount_spec == parent_daemon->mount_spec || + g_mount_spec_match_with_path (parent_daemon->mount_spec, + descendant_daemon->mount_spec, + descendant_daemon->path)) { const char *remainder; @@ -364,40 +357,9 @@ g_daemon_file_get_relative_path (GFile *parent, if (remainder != NULL && *remainder == '/') return g_strdup (remainder + 1); - else - return NULL; } - else - { - char *full_path_descendant; - char *full_path_parent; - char *ret; - const char *remainder; - full_path_descendant = g_build_path ("/", descendant_daemon->mount_spec->mount_prefix, - descendant_daemon->path, NULL); - - if (!g_mount_spec_match_with_path (parent_daemon->mount_spec, - descendant_daemon->mount_spec, - full_path_descendant)) - { - g_free (full_path_descendant); - return NULL; - } - - full_path_parent = g_build_path ("/", parent_daemon->mount_spec->mount_prefix, - parent_daemon->path, NULL); - - remainder = match_prefix (full_path_descendant, full_path_parent); - if (remainder != NULL && *remainder == '/') - ret = g_strdup (remainder + 1); - else - ret = NULL; - - g_free (full_path_parent); - g_free (full_path_descendant); - return ret; - } + return NULL; } static GFile * |