[glib/glib-2-20] Bug 593406 - Permissions set to 777 after copying via Nautilus
- From: Benjamin Otte <otte src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [glib/glib-2-20] Bug 593406 - Permissions set to 777 after copying via Nautilus
- Date: Thu, 3 Sep 2009 18:33:03 +0000 (UTC)
commit 865c47d1a02d0e7a826e4b09c9c28ac2276d998b
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.
This patch includes the whole patchset from master:
3826963e65d8c4c68bcd3e4066505f63ef734b95
bb7852e34b1845e516290e1b45a960a345ee8a43
48e0af0157f52ac12b904bd92540432a18b139c7
e695c0932f5d02f3b222f0b7a3de1f8c00ba7b81
configure.in | 2 +-
gio/glocalfileinfo.c | 33 +++++++++++++++++++++++++++++----
2 files changed, 30 insertions(+), 5 deletions(-)
---
diff --git a/configure.in b/configure.in
index 07a6fec..998fb77 100644
--- a/configure.in
+++ b/configure.in
@@ -936,7 +936,7 @@ AC_MSG_RESULT(unsigned $glib_size_type)
# Check for some functions
AC_CHECK_FUNCS(lstat strerror strsignal memmove vsnprintf stpcpy strcasecmp strncasecmp poll getcwd vasprintf setenv unsetenv getc_unlocked readlink symlink fdwalk)
-AC_CHECK_FUNCS(chown lchown fchmod fchown link statvfs statfs utimes getgrgid getpwuid)
+AC_CHECK_FUNCS(chown lchmod lchown fchmod fchown link statvfs statfs utimes getgrgid getpwuid)
AC_CHECK_FUNCS(getmntent_r setmntent endmntent hasmntopt getmntinfo)
# Check for high-resolution sleep functions
AC_CHECK_FUNCS(nanosleep nsleep)
diff --git a/gio/glocalfileinfo.c b/gio/glocalfileinfo.c
index e0d5b90..05516c3 100644
--- a/gio/glocalfileinfo.c
+++ b/gio/glocalfileinfo.c
@@ -1815,15 +1815,40 @@ get_string (const GFileAttributeValue *value,
static gboolean
set_unix_mode (char *filename,
+ GFileQueryInfoFlags flags,
const GFileAttributeValue *value,
GError **error)
{
guint32 val;
+ int res = 0;
if (!get_uint32 (value, &val, error))
return FALSE;
-
- if (g_chmod (filename, val) == -1)
+
+#ifdef HAVE_SYMLINK
+ if (flags & G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS) {
+#ifdef HAVE_LCHMOD
+ res = lchmod (filename, val);
+#else
+ struct stat statbuf;
+ /* Calling chmod on a symlink changes permissions on the symlink.
+ * We don't want to do this, so we need to check for a symlink */
+ res = g_lstat (filename, &statbuf);
+ if (res == 0 && S_ISLNK (statbuf.st_mode))
+ {
+ g_set_error_literal (error, G_IO_ERROR,
+ G_IO_ERROR_NOT_SUPPORTED,
+ _("Operation not supported"));
+ return FALSE;
+ }
+ else if (res == 0)
+ res = g_chmod (filename, val);
+#endif
+ } else
+#endif
+ res = g_chmod (filename, val);
+
+ if (res == -1)
{
int errsv = errno;
@@ -2116,7 +2141,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)
@@ -2229,7 +2254,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]