summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Holy <oholy@redhat.com>2019-07-12 10:35:47 +0200
committerOndrej Holy <oholy@redhat.com>2019-07-15 13:32:17 +0200
commit1afee5ad490828439ea4c0326081d73166fe946b (patch)
treee77682d80eb80cc26b10c699b26623f40489e405
parent834870a8c7ba91954e14e6078f1a30d7461c7452 (diff)
downloadgvfs-1afee5ad490828439ea4c0326081d73166fe946b.tar.gz
google: Do not enumerate volatile entries if title matches id
Currently, the volatile entry is enumerated if its title matches id of another entry. But we don't want to enumerate volatile entries to not confuse our clients. Let's add simple check to prevent this.
-rw-r--r--daemon/gvfsbackendgoogle.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/daemon/gvfsbackendgoogle.c b/daemon/gvfsbackendgoogle.c
index 35cea1dd..55c206d1 100644
--- a/daemon/gvfsbackendgoogle.c
+++ b/daemon/gvfsbackendgoogle.c
@@ -1467,23 +1467,38 @@ g_vfs_backend_google_enumerate (GVfsBackend *_self,
while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &entry))
{
DirEntriesKey *k;
+ GDataEntry *child;
+ gchar *child_id;
- k = dir_entries_key_new (gdata_entry_get_id (entry), id);
- if (g_hash_table_contains (self->dir_entries, k))
+ /* g_strdup() is necessary to prevent segfault because gdata_entry_get_id() calls g_free() */
+ child_id = g_strdup (gdata_entry_get_id (entry));
+
+ k = dir_entries_key_new (child_id, id);
+ if ((child = g_hash_table_lookup (self->dir_entries, k)) != NULL)
{
GFileInfo *info;
gchar *entry_path;
gchar *child_filename;
+ /* Be sure that we are not matching title of volatile file */
+ if (g_strcmp0 (child_id, gdata_entry_get_id (child)) != 0)
+ {
+ g_debug ("Skipping %s as it is volatile path for %s\n", child_id, gdata_entry_get_id (child));
+ g_free (child_id);
+ dir_entries_key_free (k);
+ continue;
+ }
+
info = g_file_info_new ();
- entry_path = g_build_path ("/", parent_path, gdata_entry_get_id (GDATA_ENTRY (entry)), NULL);
- child_filename = g_build_filename (filename, gdata_entry_get_id (GDATA_ENTRY (entry)), NULL);
+ entry_path = g_build_path ("/", parent_path, child_id, NULL);
+ child_filename = g_build_filename (filename, child_id, NULL);
build_file_info (self, entry, flags, info, matcher, child_filename, entry_path, NULL);
g_vfs_job_enumerate_add_info (job, info);
g_object_unref (info);
g_free (entry_path);
}
+ g_free (child_id);
dir_entries_key_free (k);
}