g_file_info_get_display_name() returns NULL for Google Drive folder
Sometimes, a few seconds after opening a GTK file chooser, the process crashes. Here's a backtrace from Settings:
#0 __strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:65
No locals.
#1 0x00007ffff7cd253e in g_utf8_collate_key_for_filename (str=0x0, len=len@entry=-1) at ../../../glib/gunicollate.c:565
result = <optimized out>
append = <optimized out>
p = <optimized out>
prev = <optimized out>
end = <optimized out>
collate_key = <optimized out>
digits = <optimized out>
leading_zeros = <optimized out>
#2 0x00007ffff76c4328 in file_system_model_set (model=0x555556b79340, file=0x7fffd005b560, info=0x7fff88005b30, column=<optimized out>, value=0x555556baab18, data=<optimized out>) at ../../../../gtk/gtkfilechooserwidget.c:5104
impl = <optimized out>
priv = 0x5555564ce800
__func__ = "file_system_model_set"
#3 0x00007ffff76c9e28 in _gtk_file_system_model_get_value (model=model@entry=0x555556b79340, iter=iter@entry=0x7fffffffd030, column=column@entry=5) at ../../../../gtk/gtkfilesystemmodel.c:1734
node = 0x555556baaa88
__func__ = "_gtk_file_system_model_get_value"
#4 0x00007ffff76c0504 in compare_name (model=model@entry=0x555556b79340, a=a@entry=0x7fffffffd030, b=b@entry=0x7fffffffd050, impl=<optimized out>) at ../../../../gtk/gtkfilechooserwidget.c:4154
key_a = <optimized out>
key_b = <optimized out>
result = 0
#5 0x00007ffff76c061e in recent_sort_func (model=0x555556b79340, a=0x7fffffffd030, b=0x7fffffffd050, user_data=<optimized out>) at ../../../../gtk/gtkfilechooserwidget.c:4314
fs_model = 0x555556b79340
impl = <optimized out>
result = <optimized out>
#6 0x00007ffff76c7743 in compare_array_element (a=<optimized out>, b=<optimized out>, user_data=user_data@entry=0x7fffffffd440) at ../../../../gtk/gtkfilesystemmodel.c:770
data = 0x7fffffffd440
itera = {stamp = 0, user_data = 0x555556b79340, user_data2 = 0x57, user_data3 = 0x7fffffffd0c0}
iterb = {stamp = -1946104912, user_data = 0x555556b79340, user_data2 = 0x58, user_data3 = 0x7fffffffd0a0}
__func__ = "compare_array_element"
#7 0x00007ffff7cadcb6 in msort_with_tmp (p=0x7fffffffd3d0, b=0x55555681a750, n=2) at ../../../glib/gqsort.c:152
b1 = 0x55555681a750 "\210\252\272VUU"
b2 = 0x55555681a758 "\360\253\272VUU"
n1 = 1
n2 = 1
tmp = 0x55555681a1e0 "褺VUU"
s = <optimized out>
cmp = <optimized out>
arg = <optimized out>
#8 0x00007ffff7cadc44 in msort_with_tmp (p=0x7fffffffd3d0, b=0x55555681a748, n=3) at ../../../glib/gqsort.c:86
b1 = 0x55555681a748 " \251\272VUU"
b2 = 0x55555681a750 "\210\252\272VUU"
n1 = 1
n2 = 2
tmp = <optimized out>
s = <optimized out>
cmp = <optimized out>
arg = <optimized out>
#9 0x00007ffff7cadc44 in msort_with_tmp (p=0x7fffffffd3d0, b=0x55555681a730, n=6) at ../../../glib/gqsort.c:86
b1 = 0x55555681a730 "褺VUU"
b2 = 0x55555681a748 " \251\272VUU"
n1 = 3
n2 = 3
tmp = <optimized out>
s = <optimized out>
cmp = <optimized out>
arg = <optimized out>
#10 0x00007ffff7cadc44 in msort_with_tmp (p=0x7fffffffd3d0, b=0x55555681a708, n=11) at ../../../glib/gqsort.c:86
b1 = 0x55555681a708 "\340\235\272VUU"
b2 = 0x55555681a730 "褺VUU"
n1 = 5
n2 = 6
tmp = <optimized out>
s = <optimized out>
cmp = <optimized out>
arg = <optimized out>
#11 0x00007ffff7cadc44 in msort_with_tmp (p=0x7fffffffd3d0, b=0x55555681a6b0, n=22) at ../../../glib/gqsort.c:86
b1 = 0x55555681a6b0 "h\216\272VUU"
b2 = 0x55555681a708 "\340\235\272VUU"
n1 = 11
n2 = 11
tmp = <optimized out>
s = <optimized out>
cmp = <optimized out>
arg = <optimized out>
#12 0x00007ffff7cadc44 in msort_with_tmp (p=0x7fffffffd3d0, b=0x55555681a600, n=44) at ../../../glib/gqsort.c:86
b1 = 0x55555681a600 "xo\272VUU"
b2 = 0x55555681a6b0 "h\216\272VUU"
n1 = 22
n2 = 22
tmp = <optimized out>
s = <optimized out>
cmp = <optimized out>
arg = <optimized out>
#13 0x00007ffff7cadc44 in msort_with_tmp (p=0x7fffffffd3d0, b=0x55555681a4a0, n=88) at ../../../glib/gqsort.c:86
b1 = 0x55555681a4a0 "\230\061\272VUU"
b2 = 0x55555681a600 "xo\272VUU"
n1 = 44
n2 = 44
tmp = <optimized out>
s = <optimized out>
cmp = <optimized out>
arg = <optimized out>
#14 0x00007ffff7cadfc5 in msort_r (b=0x555556ba3198, n=88, s=360, cmp=cmp@entry=0x7ffff76c76b0 <compare_array_element>, arg=arg@entry=0x7fffffffd440) at ../../../glib/gqsort.c:237
tp = 0x55555681a4a0
tmp_storage = 0x55555681a760
i = <optimized out>
ip = <optimized out>
t = <optimized out>
kp = <optimized out>
size = <optimized out>
tmp = 0x55555681a1e0 "褺VUU"
p = {s = 8, var = 3, cmp = 0x7ffff76c76b0 <compare_array_element>, arg = 0x7fffffffd440, t = 0x55555681a1e0 "褺VUU"}
#15 0x00007ffff7cae158 in g_qsort_with_data (pbase=<optimized out>, total_elems=<optimized out>, size=<optimized out>, compare_func=compare_func@entry=0x7ffff76c76b0 <compare_array_element>, user_data=user_data@entry=0x7fffffffd440) at ../../../glib/gqsort.c:303
No locals.
#16 0x00007ffff76c8206 in gtk_file_system_model_sort (model=model@entry=0x555556b79340) at ../../../../gtk/gtkfilesystemmodel.c:794
path = <optimized out>
i = <optimized out>
r = <optimized out>
n_visible_rows = 84
data = {model = 0x555556b79340, func = 0x7ffff76c05f0 <recent_sort_func>, data = 0x5555564cec80, order = -1}
__func__ = "gtk_file_system_model_sort"
#17 0x00007ffff76c901e in gtk_file_system_model_sort (model=0x555556b79340) at ../../../../gtk/gtkfilesystemmodel.c:1873
data = <optimized out>
data = <optimized out>
__func__ = "gtk_file_system_model_sort"
path = <optimized out>
i = <optimized out>
r = <optimized out>
n_visible_rows = <optimized out>
_g_boolean_var_ = <optimized out>
_g_boolean_var_ = <optimized out>
new_order = <optimized out>
__n = <optimized out>
__s = <optimized out>
__p = <optimized out>
node = <optimized out>
_g_boolean_var_ = <optimized out>
#18 gtk_file_system_model_sort_node (node=<optimized out>, model=0x555556b79340) at ../../../../gtk/gtkfilesystemmodel.c:837
No locals.
#19 add_file (model=model@entry=0x555556b79340, file=file@entry=0x7fffd005fc30, info=info@entry=0x555556bd3ec0) at ../../../../gtk/gtkfilesystemmodel.c:1873
node = <optimized out>
__func__ = "add_file"
#20 0x00007ffff76ca18e in _gtk_file_system_model_update_file (model=0x555556b79340, file=0x7fffd005fc30, info=0x555556bd3ec0) at ../../../../gtk/gtkfilesystemmodel.c:1948
node = <optimized out>
i = <optimized out>
id = 0
old_info = <optimized out>
__func__ = "_gtk_file_system_model_update_file"
#21 0x00007ffff76ca1ec in gtk_file_system_model_query_done (object=0x7fffd005fc30, res=<optimized out>, data=data@entry=0x555556b79340) at ../../../../gtk/gtkfilesystemmodel.c:1231
model = 0x555556b79340
file = 0x7fffd005fc30
info = 0x555556bd3ec0
id = <optimized out>
#22 0x00007ffff7e88b59 in g_task_return_now (task=0x555556e5c6e0) at ../../../gio/gtask.c:1215
No locals.
#23 0x00007ffff7e896bb in g_task_return (task=0x555556e5c6e0, type=<optimized out>) at ../../../gio/gtask.c:1285
source = 0x7fffd00c7680
source_name = <optimized out>
#24 0x00007fffddb3ffb7 in ?? () from /usr/lib/x86_64-linux-gnu/gio/modules/libgvfsdbus.so
No symbol table info available.
#25 0x00007ffff7e88b59 in g_task_return_now (task=0x555556e58180) at ../../../gio/gtask.c:1215
No locals.
#26 0x00007ffff7e896bb in g_task_return (task=0x555556e58180, type=<optimized out>) at ../../../gio/gtask.c:1285
source = 0x7fffd00c7680
source_name = <optimized out>
#27 0x00007ffff7e89cdc in g_task_return (type=G_TASK_RETURN_SUCCESS, task=<optimized out>) at ../../../gio/gtask.c:1691
source = <optimized out>
source_name = 0x0
source = <optimized out>
source_name = <optimized out>
#28 g_task_return_pointer (task=<optimized out>, result=<optimized out>, result_destroy=<optimized out>) at ../../../gio/gtask.c:1696
__func__ = "g_task_return_pointer"
#29 0x00007ffff7eed2fb in reply_cb (connection=<optimized out>, res=<optimized out>, user_data=user_data@entry=0x555556e58180) at ../../../gio/gdbusproxy.c:2557
data = <optimized out>
task = 0x555556e58180
value = 0x555556d7b4d0
error = 0x0
fd_list = 0x0
#30 0x00007ffff7e88b59 in g_task_return_now (task=0x555556e5b250) at ../../../gio/gtask.c:1215
No locals.
#31 0x00007ffff7e896bb in g_task_return (task=0x555556e5b250, type=<optimized out>) at ../../../gio/gtask.c:1285
source = 0x7fffd00c7680
source_name = <optimized out>
#32 0x00007ffff7e89cdc in g_task_return (type=G_TASK_RETURN_SUCCESS, task=<optimized out>) at ../../../gio/gtask.c:1691
source = <optimized out>
source_name = 0x0
source = <optimized out>
source_name = <optimized out>
#33 g_task_return_pointer (task=<optimized out>, result=<optimized out>, result_destroy=<optimized out>) at ../../../gio/gtask.c:1696
__func__ = "g_task_return_pointer"
#34 0x00007ffff7ee26ea in g_dbus_connection_call_done (source=<optimized out>, result=0x555556b738c0, user_data=user_data@entry=0x555556e5b250) at ../../../gio/gdbusconnection.c:5765
connection = <optimized out>
task = 0x555556e5b250
state = 0x5555565e7160
error = 0x0
reply = 0x555556b72b20
value = <optimized out>
#35 0x00007ffff7e88b59 in g_task_return_now (task=0x555556b738c0) at ../../../gio/gtask.c:1215
No locals.
#36 0x00007ffff7e88b99 in complete_in_idle_cb (task=0x555556b738c0) at ../../../gio/gtask.c:1229
No locals.
#37 0x00007ffff7c9dd21 in g_main_dispatch (context=0x555555aab210) at ../../../glib/gmain.c:3325
dispatch = 0x7ffff7c99fd0 <g_idle_dispatch>
prev_source = 0x0
begin_time_nsec = 0
was_in_call = 0
user_data = 0x555556b738c0
callback = 0x7ffff7e88b90 <complete_in_idle_cb>
cb_funcs = 0x7ffff7d78280 <g_source_callback_funcs>
cb_data = 0x7fffd0066570
need_destroy = <optimized out>
source = 0x7fffd00c7680
current = 0x555555b273c0
i = 0
current = <optimized out>
i = <optimized out>
__func__ = "g_main_dispatch"
source = <optimized out>
_g_boolean_var_ = <optimized out>
was_in_call = <optimized out>
user_data = <optimized out>
callback = <optimized out>
cb_funcs = <optimized out>
cb_data = <optimized out>
need_destroy = <optimized out>
dispatch = <optimized out>
prev_source = <optimized out>
begin_time_nsec = <optimized out>
_g_boolean_var_ = <optimized out>
#38 g_main_context_dispatch (context=context@entry=0x555555aab210) at ../../../glib/gmain.c:4016
No locals.
#39 0x00007ffff7c9e0f8 in g_main_context_iterate (context=context@entry=0x555555aab210, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../../../glib/gmain.c:4092
max_priority = 2147483647
timeout = 16
some_ready = 1
nfds = <optimized out>
allocated_nfds = 7
fds = 0x5555562d4430
#40 0x00007ffff7c9e18c in g_main_context_iteration (context=context@entry=0x555555aab210, may_block=may_block@entry=1) at ../../../glib/gmain.c:4157
retval = <optimized out>
#41 0x00007ffff7eb61ad in g_application_run (application=0x55555604e480, argc=<optimized out>, argv=0x7fffffffd928) at ../../../gio/gapplication.c:2559
arguments = 0x55555605cd00
status = 0
context = 0x555555aab210
acquired_context = 1
__func__ = "g_application_run"
#42 0x00005555555ad811 in main (argc=<optimized out>, argv=<optimized out>) at ../shell/main.c:65
application = 0x55555604e480
I think the issue is coming from frame 2:
(gdb) frame 2
#2 0x00007ffff76c4328 in file_system_model_set (model=0x555556af2330, file=0x7fffd0078a00, info=0x7fffd006e260, column=<optimized out>, value=0x555556b18ae8,
data=<optimized out>) at ../../../../gtk/gtkfilechooserwidget.c:5104
warning: Source file is more recent than executable.
5104 g_value_take_string (value, g_utf8_collate_key_for_filename (g_file_info_get_display_name (info), -1));
(gdb) l
5099 break;
5100 case MODEL_COL_NAME_COLLATED:
5101 if (info == NULL)
5102 g_value_take_string (value, g_utf8_collate_key_for_filename (DEFAULT_NEW_FOLDER_NAME, -1));
5103 else
5104 g_value_take_string (value, g_utf8_collate_key_for_filename (g_file_info_get_display_name (info), -1));
5105 break;
5106 case MODEL_COL_IS_FOLDER:
5107 g_value_set_boolean (value, info == NULL || _gtk_file_info_consider_as_directory (info));
5108 break;
(gdb) p g_file_info_get_display_name (info)
$1 = 0x0
The documentation for g_file_info_get_display_name claims that it will never return NULL
.
This appears to be a Google Drive path:
(gdb) p g_file_peek_path (file)
$2 = 0x555556a92c70 "/run/user/1001/gvfs/google-drive:host=endlessm.com,user=thompson"
If I had to guess, I'd guess that this is related to Endless migrating the host to endlessos.org
and my username now being wjt
.
Frame 21 tells me it's a g_file_query_info_async
callback.
In Bustle I can see a call to org.gtk.vfs.MountTracker.LookupMount
:
((b'/', {'host': <b'endlessm.com'>, 'type': <b'google-drive'>, 'user': <b'thompson'>}),)
and the reply:
((':1.91', objectpath '/org/gtk/vfs/mount/1', 'thompson@endlessm.com', 'google-drive:host=endlessm.com,user=thompson', '', '', '', '', true, b'/run/user/1001/gvfs/google-drive:host=endlessm.com,user=thompson', (b'/', {'host': <b'endlessm.com'>, 'type': <b'google-drive'>, 'user': <b'thompson'>}), b''),)
I have:
- gvfs 1.46.1-1bem1
- glib 2.66.1-1bem1
- gtk3 3.24.14+dev63.8d2dc28-0bem1 — prehistoric I know, but this code seems to be the same in the latest release; while it might be nice if it were coded a little defensively against
g_file_info_get_display_name
returningNULL
, the documentation makes it very clear that it should never return NULL.
Edited by Will Thompson