[glib: 1/2] gfile: Document TOCTTOU avoidance using g_file_delete()




commit 373c54a52ce82c4cb5536926686e12adfce37d1c
Author: Philip Withnall <withnall endlessm com>
Date:   Mon Aug 10 16:21:53 2020 +0100

    gfile: Document TOCTTOU avoidance using g_file_delete()
    
    Don’t call `g_file_query_exists()` followed by `g_file_delete()`. Just
    call `g_file_delete()` and check the error.
    
    Signed-off-by: Philip Withnall <withnall endlessm com>

 gio/gfile.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
---
diff --git a/gio/gfile.c b/gio/gfile.c
index a8d12aa2c..533efa7df 100644
--- a/gio/gfile.c
+++ b/gio/gfile.c
@@ -4027,6 +4027,21 @@ g_file_make_symbolic_link (GFile         *file,
  * Deletes a file. If the @file is a directory, it will only be
  * deleted if it is empty. This has the same semantics as g_unlink().
  *
+ * If @file doesn’t exist, %G_IO_ERROR_NOT_FOUND will be returned. This allows
+ * for deletion to be implemented avoiding
+ * [time-of-check to time-of-use races](https://en.wikipedia.org/wiki/Time-of-check_to_time-of-use):
+ * |[
+ * g_autoptr(GError) local_error = NULL;
+ * if (!g_file_delete (my_file, my_cancellable, &local_error) &&
+ *     !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
+ *   {
+ *     // deletion failed for some reason other than the file not existing:
+ *     // so report the error
+ *     g_warning ("Failed to delete %s: %s",
+ *                g_file_peek_path (my_file), local_error->message);
+ *   }
+ * ]|
+ *
  * If @cancellable is not %NULL, then the operation can be cancelled by
  * triggering the cancellable object from another thread. If the operation
  * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned.


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]