Don't succeed with trash if newly created trash dir has the wrong owner.

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)


svn path=/trunk/; revision=6459
This commit is contained in:
Alexander Larsson 2008-02-06 10:06:54 +00:00 committed by Alexander Larsson
parent ebfd091263
commit 2185733235
2 changed files with 30 additions and 4 deletions

View File

@ -1,3 +1,9 @@
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)
2008-02-05 Alexander Larsson <alexl@redhat.com>
* glocalfile.c (g_local_file_move):

View File

@ -1546,25 +1546,45 @@ g_local_file_trash (GFile *file,
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