glib r6459 - trunk/gio



Author: alexl
Date: Wed Feb  6 10:06:54 2008
New Revision: 6459
URL: http://svn.gnome.org/viewvc/glib?rev=6459&view=rev

Log:
2008-02-06  Alexander Larsson  <alexl redhat com>

	* glocalfile.c (g_local_file_trash):
	Don't succeed with trash if newly created
	trash dir has the wrong owner. (#514696)



Modified:
   trunk/gio/ChangeLog
   trunk/gio/glocalfile.c

Modified: trunk/gio/glocalfile.c
==============================================================================
--- trunk/gio/glocalfile.c	(original)
+++ trunk/gio/glocalfile.c	Wed Feb  6 10:06:54 2008
@@ -1546,25 +1546,45 @@
 
       if (trashdir == NULL)
 	{
+	  gboolean tried_create;
+	  
 	  /* No global trash dir, or it failed the tests, fall back to $topdir/.Trash-$uid */
 	  dirname = g_strdup_printf (".Trash-%s", uid_str);
 	  trashdir = g_build_filename (topdir, dirname, NULL);
 	  g_free (dirname);
-	  
+
+	  tried_create = FALSE;
+
+	retry:
 	  if (g_lstat (trashdir, &trash_stat) == 0)
 	    {
 	      if (!S_ISDIR (trash_stat.st_mode) ||
 		  trash_stat.st_uid != uid)
 		{
+		  /* Remove the failed directory */
+		  if (tried_create)
+		    g_remove (trashdir);
+		  
 		  /* Not a directory or not owned by user, ignore */
 		  g_free (trashdir);
 		  trashdir = NULL;
 		}
 	    }
-	  else if (g_mkdir (trashdir, 0700) == -1)
+	  else
 	    {
-	      g_free (trashdir);
-	      trashdir = NULL;
+	      if (!tried_create &&
+		  g_mkdir (trashdir, 0700) != -1)
+		{
+		  /* Ensure that the created dir has the right uid etc.
+		     This might fail on e.g. a FAT dir */
+		  tried_create = TRUE;
+		  goto retry;
+		}
+	      else
+		{
+		  g_free (trashdir);
+		  trashdir = NULL;
+		}
 	    }
 	}
 #endif



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