Merge branch 'backport-1134-file-copy-fix-glib-2-62' into 'glib-2-62'

Backport !1134 Fix for file copy permissions to glib-2-62

See merge request GNOME/glib!1142
This commit is contained in:
Ondrej Holy
2019-10-03 06:36:33 +00:00

View File

@@ -3188,6 +3188,7 @@ file_copy_fallback (GFile *source,
const char *target;
char *attrs_to_read;
gboolean do_set_attributes = FALSE;
GFileCreateFlags create_flags;
/* need to know the file type */
info = g_file_query_info (source,
@@ -3277,19 +3278,38 @@ file_copy_fallback (GFile *source,
*
* If a future API like g_file_replace_with_info() is added, switch
* this code to use that.
*
* Use %G_FILE_CREATE_PRIVATE unless
* - we were told to create the file with default permissions (i.e. the
* process umask),
* - or if the source file is on a file system which doesnt support
* `unix::mode` (in which case it probably also makes sense to create the
* destination with default permissions because the source cannot be
* private),
* - or if the destination file is a `GLocalFile`, in which case we can
* directly open() it with the permissions from the source file.
*/
create_flags = G_FILE_CREATE_NONE;
if (!(flags & G_FILE_COPY_TARGET_DEFAULT_PERMS) &&
g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_UNIX_MODE) &&
!G_IS_LOCAL_FILE (destination))
create_flags |= G_FILE_CREATE_PRIVATE;
if (flags & G_FILE_COPY_OVERWRITE)
create_flags |= G_FILE_CREATE_REPLACE_DESTINATION;
if (G_IS_LOCAL_FILE (destination))
{
if (flags & G_FILE_COPY_OVERWRITE)
out = (GOutputStream*)_g_local_file_output_stream_replace (_g_local_file_get_filename (G_LOCAL_FILE (destination)),
FALSE, NULL,
flags & G_FILE_COPY_BACKUP,
G_FILE_CREATE_REPLACE_DESTINATION |
G_FILE_CREATE_PRIVATE, info,
create_flags,
(flags & G_FILE_COPY_TARGET_DEFAULT_PERMS) ? NULL : info,
cancellable, error);
else
out = (GOutputStream*)_g_local_file_output_stream_create (_g_local_file_get_filename (G_LOCAL_FILE (destination)),
FALSE, G_FILE_CREATE_PRIVATE, info,
FALSE, create_flags,
(flags & G_FILE_COPY_TARGET_DEFAULT_PERMS) ? NULL : info,
cancellable, error);
}
else if (flags & G_FILE_COPY_OVERWRITE)
@@ -3297,13 +3317,12 @@ file_copy_fallback (GFile *source,
out = (GOutputStream *)g_file_replace (destination,
NULL,
flags & G_FILE_COPY_BACKUP,
G_FILE_CREATE_REPLACE_DESTINATION |
G_FILE_CREATE_PRIVATE,
create_flags,
cancellable, error);
}
else
{
out = (GOutputStream *)g_file_create (destination, G_FILE_CREATE_PRIVATE, cancellable, error);
out = (GOutputStream *)g_file_create (destination, create_flags, cancellable, error);
}
if (!out)