diff options
author | Mayank Sharma <mayank8019@gmail.com> | 2019-07-23 15:11:11 +0530 |
---|---|---|
committer | Mayank Sharma <mayank8019@gmail.com> | 2019-07-24 12:25:29 +0530 |
commit | 07a4695b107a28618ebde9a54193e5b5746b60b1 (patch) | |
tree | e26e1526ae82deb6b8f09774e9fae3bdef12b6c1 /daemon | |
parent | 63d97b19af2479fa2219ca87201f9e830b5f31f3 (diff) | |
download | gvfs-07a4695b107a28618ebde9a54193e5b5746b60b1.tar.gz |
google: Disable deletion of non-empty directories
Earlier, we were deleting a directory irrespective of whether it
was empty or not. This would cause a permanent deletion of the
folder on Drive, and accidental deletions could be catastrophic.
`g_file_delete()` states that if a directory is supposed to be deleted,
the job should only carry forward to completion if the directory is
empty, else it should error out. We fix this behaviour of delete
operation in google backend by conforming to GIO's documentation.
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/gvfsbackendgoogle.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/daemon/gvfsbackendgoogle.c b/daemon/gvfsbackendgoogle.c index dcbdc713..1b3cf509 100644 --- a/daemon/gvfsbackendgoogle.c +++ b/daemon/gvfsbackendgoogle.c @@ -1331,6 +1331,7 @@ g_vfs_backend_google_delete (GVfsBackend *_self, gchar *entry_path = NULL; GList *parent_ids; guint parent_ids_len; + gchar *id = NULL; g_rec_mutex_lock (&self->mutex); g_debug ("+ delete: %s\n", filename); @@ -1344,6 +1345,39 @@ g_vfs_backend_google_delete (GVfsBackend *_self, goto out; } + /* g_strdup() is necessary to prevent segfault because gdata_entry_get_id() calls g_free() */ + id = g_strdup (gdata_entry_get_id (entry)); + + if (GDATA_IS_DOCUMENTS_FOLDER (entry)) + { + GHashTableIter iter; + DirEntriesKey *key; + + if (!is_dir_listing_valid (self, entry)) + { + rebuild_dir (self, entry, cancellable, &error); + if (error != NULL) + { + g_vfs_job_failed_from_error (G_VFS_JOB (job), error); + g_error_free (error); + goto out; + } + } + + g_hash_table_iter_init (&iter, self->dir_entries); + while (g_hash_table_iter_next (&iter, (gpointer *) &key, NULL)) + { + if (g_strcmp0 (key->parent_id, id) == 0) + { + g_vfs_job_failed (G_VFS_JOB (job), + G_IO_ERROR, + G_IO_ERROR_NOT_EMPTY, + _("Directory not empty")); + goto out; + } + } + } + parent = resolve_dir (self, filename, cancellable, NULL, NULL, &error); if (error != NULL) { @@ -1409,6 +1443,7 @@ g_vfs_backend_google_delete (GVfsBackend *_self, out: g_clear_object (&new_entry); g_free (entry_path); + g_free (id); g_debug ("- delete\n"); g_rec_mutex_unlock (&self->mutex); } |