Copying files with name conflict and allowing the overwrite crashes Nautilus
Copying files with Ctrl+C and Ctrl+V between two folders with a conflicting file shows a dialog. If you choose to overwrite the target, then Nautilus crashes.
nautilus-3.34.2-1.fc31.x86_64
#0 copy_move_file (copy_job=0x55d6bd0fa110, src=0x55d6bdbf9660, dest_dir=0x55d6bcd36a50, same_fs=<optimized out>, unique_names=0, dest_fs_type=0x7f7e77e9ea98, source_info=<optimized out>, transfer_info=<optimized out>, debuting_files=<optimized out>, overwrite=<optimized out>, skipped_file=<optimized out>,
readonly_source_fs=0) at ../src/nautilus-file-operations.c:5358
5358 if (response->id == GTK_RESPONSE_CANCEL ||
[Current thread is 1 (Thread 0x7f7e77e9f700 (LWP 19790))]
(gdb) bt
#0 copy_move_file
(copy_job=0x55d6bd0fa110, src=0x55d6bdbf9660, dest_dir=0x55d6bcd36a50, same_fs=<optimized out>, unique_names=0, dest_fs_type=0x7f7e77e9ea98, source_info=<optimized out>, transfer_info=<optimized out>, debuting_files=<optimized out>, overwrite=<optimized out>, skipped_file=<optimized out>, readonly_source_fs=0)
at ../src/nautilus-file-operations.c:5358
#1 0x000055d6bbafed45 in copy_files (transfer_info=0x7f7e77e9eac0, source_info=0x7f7e77e9eaa0, dest_fs_id=0x55d6bcdba7c0 "l64771", job=0x55d6bd0fa110) at ../src/nautilus-file-operations.c:5625
#2 nautilus_file_operations_copy (task=<optimized out>, source_object=<optimized out>, task_data=0x55d6bd0fa110, cancellable=<optimized out>) at ../src/nautilus-file-operations.c:5771
#3 0x00007f7e7de6ffb2 in g_task_thread_pool_thread (thread_data=0x55d6bd348110, pool_data=<optimized out>) at ../gio/gtask.c:1410
#4 0x00007f7e7ea10704 in g_thread_pool_thread_proxy (data=<optimized out>) at ../glib/gthreadpool.c:308
#5 0x00007f7e7ea0ffc2 in g_thread_proxy (data=0x55d6bce3c930) at ../glib/gthread.c:805
#6 0x00007f7e7db154e2 in start_thread () at /lib64/libpthread.so.0
#7 0x00007f7e7da446d3 in clone () at /lib64/libc.so.6
gdb) bt full
#0 copy_move_file
(copy_job=0x55d6bd0fa110, src=0x55d6bdbf9660, dest_dir=0x55d6bcd36a50, same_fs=<optimized out>, unique_names=0, dest_fs_type=0x7f7e77e9ea98, source_info=<optimized out>, transfer_info=<optimized out>, debuting_files=<optimized out>, overwrite=<optimized out>, skipped_file=<optimized out>, readonly_source_fs=0)
at ../src/nautilus-file-operations.c:5358
source_is_directory = <optimized out>
destination_is_directory = <optimized out>
is_merge = <optimized out>
response = 0x5a5a5a5a5a5a5a5a
dest = 0x55d6bd7e2dc0
new_dest = <optimized out>
dest_uri = 0x0
error = 0x55d6bccc35f0
flags = <optimized out>
primary = <optimized out>
secondary = <optimized out>
details = <optimized out>
pdata = {
job = 0x55d6bd0fa110,
last_size = 0,
source_info = 0x7f7e77e9eaa0,
transfer_info = 0x7f7e77e9eac0
}
would_recurse = <optimized out>
res = <optimized out>
unique_name_nr = <optimized out>
handled_invalid_filename = 0
__func__ = "copy_move_file"
#1 0x000055d6bbafed45 in copy_files (transfer_info=0x7f7e77e9eac0, source_info=0x7f7e77e9eaa0, dest_fs_id=0x55d6bcdba7c0 "l64771", job=0x55d6bd0fa110) at ../src/nautilus-file-operations.c:5625
common = 0x55d6bd0fa110
dest_fs_type = 0x0
inf = <optimized out>
src = 0x55d6bdbf9660
unique_names = 0
readonly_source_fs = 0
l = 0x55d6bdb12ab0 = {0x55d6bdbf9660, 0x55d6bccb2320}
same_fs = <optimized out>
i = <optimized out>
skipped_file = 0
dest = 0x55d6bcd36a50
source_dir = <optimized out>
job = 0x55d6bd0fa110
common = 0x55d6bd0fa110
source_info = {
num_files = 2,
num_bytes = 92033,
num_files_since_progress = 2,
op = OP_KIND_COPY
}
transfer_info = {
num_files = 0,
num_bytes = 0,
op = OP_KIND_COPY,
last_report_time = 7974582742,
last_reported_files_left = 2
}
dest_fs_id = 0x55d6bcdba7c0 "l64771"
dest = <optimized out>
#2 nautilus_file_operations_copy (task=<optimized out>, source_object=<optimized out>, task_data=0x55d6bd0fa110, cancellable=<optimized out>) at ../src/nautilus-file-operations.c:5771
job = 0x55d6bd0fa110
common = 0x55d6bd0fa110
source_info = {
num_files = 2,
num_bytes = 92033,
num_files_since_progress = 2,
op = OP_KIND_COPY
}
transfer_info = {
num_files = 0,
num_bytes = 0,
op = OP_KIND_COPY,
last_report_time = 7974582742,
last_reported_files_left = 2
}
dest_fs_id = 0x55d6bcdba7c0 "l64771"
dest = <optimized out>
#3 0x00007f7e7de6ffb2 in g_task_thread_pool_thread (thread_data=0x55d6bd348110, pool_data=<optimized out>) at ../gio/gtask.c:1410
task = 0x55d6bd348110 [GTask]
#4 0x00007f7e7ea10704 in g_thread_pool_thread_proxy (data=<optimized out>) at ../glib/gthreadpool.c:308
task = 0x55d6bd348110
pool = <optimized out>
#5 0x00007f7e7ea0ffc2 in g_thread_proxy (data=0x55d6bce3c930) at ../glib/gthread.c:805
thread = 0x55d6bce3c930
__FUNCTION__ = "g_thread_proxy"
#6 0x00007f7e7db154e2 in start_thread () at /lib64/libpthread.so.0
#7 0x00007f7e7da446d3 in clone () at /lib64/libc.so.6
output from valgrind
==24281== 1 errors in context 1 of 105:
==24281== Thread 6 pool-org.gnome.:
==24281== Invalid read of size 4
==24281== at 0x1AE661: copy_move_file (nautilus-file-operations.c:5358)
==24281== by 0x1AFD44: copy_files (nautilus-file-operations.c:5625)
==24281== by 0x1AFD44: nautilus_file_operations_copy (nautilus-file-operations.c:5771)
==24281== by 0x5460FB1: g_task_thread_pool_thread (gtask.c:1410)
==24281== by 0x4903703: g_thread_pool_thread_proxy (gthreadpool.c:308)
==24281== by 0x4902FC1: g_thread_proxy (gthread.c:805)
==24281== by 0x58204E1: start_thread (in /usr/lib64/libpthread-2.30.so)
==24281== by 0x593A6D2: clone (in /usr/lib64/libc-2.30.so)
==24281== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==24281==
==24281==
==24281== 1 errors in context 2 of 105:
==24281== Invalid read of size 8
==24281== at 0x216701: copy_move_conflict_ask_user_action (nautilus-operations-ui-manager.c:507)
==24281== by 0x1AE645: handle_copy_move_conflict (nautilus-file-operations.c:5024)
==24281== by 0x1AE645: copy_move_file (nautilus-file-operations.c:5356)
==24281== by 0x1AFD44: copy_files (nautilus-file-operations.c:5625)
==24281== by 0x1AFD44: nautilus_file_operations_copy (nautilus-file-operations.c:5771)
==24281== by 0x5460FB1: g_task_thread_pool_thread (gtask.c:1410)
==24281== by 0x4903703: g_thread_pool_thread_proxy (gthreadpool.c:308)
==24281== by 0x4902FC1: g_thread_proxy (gthread.c:805)
==24281== by 0x58204E1: start_thread (in /usr/lib64/libpthread-2.30.so)
==24281== by 0x593A6D2: clone (in /usr/lib64/libc-2.30.so)
==24281== Address 0xb7e8410 is 32 bytes inside a block of size 104 free'd
==24281== at 0x483AA0C: free (vg_replace_malloc.c:540)
==24281== by 0x48DF43C: g_free (gmem.c:192)
==24281== by 0x48F8083: g_slice_free1 (gslice.c:1135)
==24281== by 0x216700: copy_move_conflict_ask_user_action (nautilus-operations-ui-manager.c:505)
==24281== by 0x1AE645: handle_copy_move_conflict (nautilus-file-operations.c:5024)
==24281== by 0x1AE645: copy_move_file (nautilus-file-operations.c:5356)
==24281== by 0x1AFD44: copy_files (nautilus-file-operations.c:5625)
==24281== by 0x1AFD44: nautilus_file_operations_copy (nautilus-file-operations.c:5771)
==24281== by 0x5460FB1: g_task_thread_pool_thread (gtask.c:1410)
==24281== by 0x4903703: g_thread_pool_thread_proxy (gthreadpool.c:308)
==24281== by 0x4902FC1: g_thread_proxy (gthread.c:805)
==24281== by 0x58204E1: start_thread (in /usr/lib64/libpthread-2.30.so)
==24281== by 0x593A6D2: clone (in /usr/lib64/libc-2.30.so)
==24281== Block was alloc'd at
==24281== at 0x483980B: malloc (vg_replace_malloc.c:309)
==24281== by 0x48DF348: g_malloc (gmem.c:99)
==24281== by 0x48F7975: g_slice_alloc (gslice.c:1024)
==24281== by 0x48F7F9D: g_slice_alloc0 (gslice.c:1050)
==24281== by 0x2166B1: copy_move_conflict_ask_user_action (nautilus-operations-ui-manager.c:490)
==24281== by 0x1AE645: handle_copy_move_conflict (nautilus-file-operations.c:5024)
==24281== by 0x1AE645: copy_move_file (nautilus-file-operations.c:5356)
==24281== by 0x1AFD44: copy_files (nautilus-file-operations.c:5625)
==24281== by 0x1AFD44: nautilus_file_operations_copy (nautilus-file-operations.c:5771)
==24281== by 0x5460FB1: g_task_thread_pool_thread (gtask.c:1410)
==24281== by 0x4903703: g_thread_pool_thread_proxy (gthreadpool.c:308)
==24281== by 0x4902FC1: g_thread_proxy (gthread.c:805)
==24281== by 0x58204E1: start_thread (in /usr/lib64/libpthread-2.30.so)
==24281== by 0x593A6D2: clone (in /usr/lib64/libc-2.30.so)
Edited by Tomas Popela