[glib] Bug 593406 - Permissions set to 777 after copying via Nautilus



commit e695c0932f5d02f3b222f0b7a3de1f8c00ba7b81
Author: Benjamin Otte <otte gnome org>
Date:   Tue Sep 1 11:54:48 2009 +0200

    Bug 593406 - Permissions set to 777 after copying via Nautilus
    
    When doing a g_file_copy() with nofollow-symlinks (to copy a link for
    example), the later copying of the file attributes copies the source
    links 777 attributes to the target's attributes. As chmod affects the
    symlink target, this would cause such copies to always set the target to
    777 mode.
    
    This patch makes setting the mode with nofollow-symlinks fail with
    NOT_SUPPORTED.
    
    The aforementioned g_file_copy() will still succeed, because it ignores
    errors of the attribute copy.

 gio/glocalfileinfo.c |   12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)
---
diff --git a/gio/glocalfileinfo.c b/gio/glocalfileinfo.c
index 72a59b5..7933ed9 100644
--- a/gio/glocalfileinfo.c
+++ b/gio/glocalfileinfo.c
@@ -1869,6 +1869,7 @@ get_string (const GFileAttributeValue  *value,
 
 static gboolean
 set_unix_mode (char                       *filename,
+               GFileQueryInfoFlags         flags,
 	       const GFileAttributeValue  *value,
 	       GError                    **error)
 {
@@ -1877,6 +1878,13 @@ set_unix_mode (char                       *filename,
   if (!get_uint32 (value, &val, error))
     return FALSE;
   
+  if (flags & G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS) {
+    g_set_error_literal (error, G_IO_ERROR,
+                         G_IO_ERROR_NOT_SUPPORTED,
+                         _("Cannot set permissions on symlinks"));
+    return FALSE;
+  }
+
   if (g_chmod (filename, val) == -1)
     {
       int errsv = errno;
@@ -2172,7 +2180,7 @@ _g_local_file_info_set_attribute (char                 *filename,
   _g_file_attribute_value_set_from_pointer (&value, type, value_p, FALSE);
   
   if (strcmp (attribute, G_FILE_ATTRIBUTE_UNIX_MODE) == 0)
-    return set_unix_mode (filename, &value, error);
+    return set_unix_mode (filename, flags, &value, error);
   
 #ifdef HAVE_CHOWN
   else if (strcmp (attribute, G_FILE_ATTRIBUTE_UNIX_UID) == 0)
@@ -2316,7 +2324,7 @@ _g_local_file_info_set_attributes  (char                 *filename,
   value = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_UNIX_MODE);
   if (value)
     {
-      if (!set_unix_mode (filename, value, error))
+      if (!set_unix_mode (filename, flags, value, error))
 	{
 	  value->status = G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING;
 	  res = FALSE;



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