[libdazzle] reaper: don't allow symlinks as directory for globs



commit 6f3e80625f3a00cbc44ed8aea1f6808ea3098b5f
Author: Christian Hergert <chergert redhat com>
Date:   Thu Jan 25 18:18:23 2018 -0800

    reaper: don't allow symlinks as directory for globs
    
    If the glob pattern is specified within a symlink, disallow that. Require
    that the consumer uses the non-symlink form instead. This helps us be just
    a little bit more defensive against accidental follow-through deletes.

 src/files/dzl-directory-reaper.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)
---
diff --git a/src/files/dzl-directory-reaper.c b/src/files/dzl-directory-reaper.c
index 2bf2b20..b1b9f12 100644
--- a/src/files/dzl-directory-reaper.c
+++ b/src/files/dzl-directory-reaper.c
@@ -233,6 +233,7 @@ dzl_directory_reaper_execute_worker (GTask        *task,
     {
       const Pattern *p = &g_array_index (patterns, Pattern, i);
       g_autoptr(GFileInfo) info = NULL;
+      g_autoptr(GFileInfo) dir_info = NULL;
       g_autoptr(GPatternSpec) spec = NULL;
       g_autoptr(GFileEnumerator) enumerator = NULL;
       g_autoptr(GError) error = NULL;
@@ -278,6 +279,25 @@ dzl_directory_reaper_execute_worker (GTask        *task,
               break;
             }
 
+          dir_info = g_file_query_info (p->glob.directory,
+                                        G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK","
+                                        G_FILE_ATTRIBUTE_STANDARD_TYPE",",
+                                        G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+                                        cancellable,
+                                        &error);
+
+          if (dir_info == NULL)
+            {
+              if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
+                g_warning ("%s", error->message);
+              break;
+            }
+
+          /* Do not follow through symlinks. */
+          if (g_file_info_get_is_symlink (dir_info) ||
+              g_file_info_get_file_type (dir_info) != G_FILE_TYPE_DIRECTORY)
+            break;
+
           enumerator = g_file_enumerate_children (p->glob.directory,
                                                   G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK","
                                                   G_FILE_ATTRIBUTE_STANDARD_NAME","


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