Bug 1444405
Summary: | [abrt] Crash under atk_gobject_accessible_dispose() | ||||||
---|---|---|---|---|---|---|---|
Product: | Red Hat Enterprise Linux 7 | Reporter: | Vladimir Benes <vbenes> | ||||
Component: | atk | Assignee: | Florian Müllner <fmuellner> | ||||
Status: | CLOSED ERRATA | QA Contact: | Desktop QE <desktop-qa-list> | ||||
Severity: | unspecified | Docs Contact: | |||||
Priority: | unspecified | ||||||
Version: | 7.4 | CC: | mbarnes, mcrha, modehnal, rmatos, tpelka, vrutkovs | ||||
Target Milestone: | rc | ||||||
Target Release: | --- | ||||||
Hardware: | Unspecified | ||||||
OS: | Unspecified | ||||||
URL: | http://faf.lab.eng.brq.redhat.com/faf/reports/bthash/cecb51eaaf238e8f1cb66dd4549e24b3ddeec11d/ | ||||||
Whiteboard: | |||||||
Fixed In Version: | atk-2.22.0-2.el7 | Doc Type: | If docs needed, set a value | ||||
Doc Text: | Story Points: | --- | |||||
Clone Of: | Environment: | ||||||
Last Closed: | 2017-08-01 12:30:39 UTC | Type: | Bug | ||||
Regression: | --- | Mount Type: | --- | ||||
Documentation: | --- | CRM: | |||||
Verified Versions: | Category: | --- | |||||
oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |||||
Cloudforms Team: | --- | Target Upstream Version: | |||||
Embargoed: | |||||||
Bug Depends On: | 1444490 | ||||||
Bug Blocks: | |||||||
Attachments: |
|
Description
Vladimir Benes
2017-04-21 09:47:42 UTC
Unfortunately no debug symbols there, neither line numbers, which is a pita, but anyway. Below is the crashing thread. There is also eti_dispose(), like in bug #1270015, but this one is different object, this is in gal-a11y-e-table-item.c, according to the call of free_columns(), which is done there, not in e-table-item.c. The two use the same eti_dispose(), which makes the confusion, especially when there are no debug symbols. I am not able to reproduce this myself, but we try to find the cause. Thread 1 (Thread 0x7f2c8ea6ea80 (LWP 26455)): #0 0x00007f2c84b56e8b in atk_gobject_accessible_dispose () from /lib64/libatk-1.0.so.0 #1 0x00007f2c839c878f in weak_refs_notify () from /lib64/libgobject-2.0.so.0 #2 0x00007f2c839c9602 in g_object_unref () from /lib64/libgobject-2.0.so.0 #3 0x00007f2c8e3e3e39 in free_columns () from /usr/lib64/evolution/libevolution-util.so #4 0x00007f2c8e3e5fc2 in eti_dispose () from /usr/lib64/evolution/libevolution-util.so #5 0x00007f2c839c9602 in g_object_unref () from /lib64/libgobject-2.0.so.0 #6 0x00007f2c84b58c11 in atk_object_finalize () from /lib64/libatk-1.0.so.0 #7 0x00007f2c839c96f4 in g_object_unref () from /lib64/libgobject-2.0.so.0 #8 0x00007f2c7a512afd in expiry_func () from /lib64/libatk-bridge-2.0.so.0 #9 0x00007f2c836edeed in g_timeout_dispatch () from /lib64/libglib-2.0.so.0 #10 0x00007f2c836ed4c9 in g_main_context_dispatch () from /lib64/libglib-2.0.so.0 #11 0x00007f2c836ed818 in g_main_context_iterate.isra.21 () from /lib64/libglib-2.0.so.0 #12 0x00007f2c836edaea in g_main_loop_run () from /lib64/libglib-2.0.so.0 #13 0x00007f2c8525a4b5 in gtk_main () from /lib64/libgtk-3.so.0 #14 0x0000000000403de1 in main () I want to wait for resolution of bug #1444490, because it's likely it's the cause. Detailed backtrace of the crash. Line numbers do not match, due to added debug prints, but it shows some other useful things. It looks like atkgobjectaccesible expects the accessible being alive longer than the object to which it belongs. The crash happens due to atk_gobject_accessible_dispose() is being called with 'data' of already finalized object. From my debug prints: The object is allocated here: etch_init: 0x54b76c0: at g_type_create_instance() at gtype.c:1875 by g_object_new_internal() at gobject.c:1785 by g_object_newv() at gobject.c:1932 by g_object_new() at gobject.c:1623 by gal_a11y_e_table_column_header_new() at gal-a11y-e-table-column-header.c:305 by eti_ref_child() at gal-a11y-e-table-item.c:331 by impl_GetChildAtIndex() at accessible-adaptor.c:184 by handle_message() at droute.c:553 by _dbus_object_tree_dispatch_and_unlock() by dbus_connection_dispatch() by message_queue_dispatch() by g_main_context_dispatch() at gmain.c:3201 by g_main_context_iterate.isra.21() at gmain.c:3927 by g_main_loop_run() at gmain.c:4122 by gtk_main() at gtkmain.c:1313 by main() at main.c:682 by __libc_start_main() by _start() shortly after its scheduled for unref, while it has only one reference: spi_leasing_take: obj:0x54b76c0 refs:1 (GalA11yETableColumnHeader) after a little timeout (taken by spi_leasing) the object is finally freed: gal_a11y_e_table_column_header_dispose: 0x54b76c0: at g_object_unref() at gobject.c:3149 by expiry_func() at accessible-leasing.c:123 by g_timeout_dispatch() at gmain.c:4672 by g_main_context_dispatch() at gmain.c:3201 by g_main_context_iterate.isra.21() at gmain.c:3927 by g_main_loop_run() at gmain.c:4122 by gtk_main() at gtkmain.c:1313 by main() at main.c:682 by __libc_start_main() by _start() atk_gobject_accessible_real_dispose: atk-obj:0x54b76c0 gal_a11y_e_table_column_header_finalize: 0x54b76c0: atk_gobject_accessible_real_finalize: atk-obj:0x54b76c0 and then there is called: free_columns: unreffing 0x498c880 atk_gobject_accessible_dispose: atk-obj:0x54b76c0 For this already freed object (0x54b76c0). Program received signal SIGSEGV, Segmentation fault. 0x00007f3e4792bf74 in g_type_check_instance_is_a (type_instance=type_instance@entry=0x54b76c0, iface_type=<optimized out>) at gtype.c:4012 4012 check = node && node->is_instantiatable && iface && type_node_conforms_to_U (node, iface, TRUE, FALSE); Missing separate debuginfos, use: debuginfo-install evolution-3.22.6-8.el7.x86_64 #0 0x00007f3e4792bf74 in g_type_check_instance_is_a (type_instance=type_instance@entry=0x54b76c0, iface_type=<optimized out>) at gtype.c:4012 #1 0x00007f3e48a9c087 in atk_gobject_accessible_dispose (data=0x54b76c0) at atkgobjectaccessible.c:162 #2 0x00007f3e4790d78f in weak_refs_notify (data=0x674f7e0) at gobject.c:2638 #3 0x00007f3e523173f6 in etc_dispose (object=0x498c880 [ETableCol]) at e-table-col.c:75 #4 0x00007f3e4790e602 in g_object_unref (_object=0x498c880) at gobject.c:3148 #5 0x00007f3e523938ae in free_columns (columns=0x4d30f50) at gal-a11y-e-table-item.c:85 #6 0x00007f3e52394199 in eti_dispose (object=0x4d2f8b0 [GalA11yETableItem]) at gal-a11y-e-table-item.c:289 #7 0x00007f3e4790e602 in g_object_unref (_object=0x4d2f8b0) at gobject.c:3148 #8 0x00007f3e48a9de01 in atk_object_finalize (object=0x4cb8110 [GalA11yETableColumnHeader]) at atkobject.c:1408 #9 0x00007f3e52392c07 in gal_a11y_e_table_column_header_finalize (object=0x4cb8110 [GalA11yETableColumnHeader]) at gal-a11y-e-table-column-header.c:108 #10 0x00007f3e4790e6f4 in g_object_unref (_object=0x4cb8110) at gobject.c:3185 #11 0x00007f3e3e210c1d in expiry_func (data=data@entry=0x1a3e290) at accessible-leasing.c:122 #12 0x00007f3e47632eed in g_timeout_dispatch (source=0x58c3e80, callback=0x7f3e3e210bc0 <expiry_func>, user_data=0x1a3e290) at gmain.c:4672 #13 0x00007f3e476324c9 in g_main_context_dispatch (context=0x1a19630) at gmain.c:3201 #14 0x00007f3e476324c9 in g_main_context_dispatch (context=context@entry=0x1a19630) at gmain.c:3854 #15 0x00007f3e47632818 in g_main_context_iterate (context=0x1a19630, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at gmain.c:3927 #16 0x00007f3e47632aea in g_main_loop_run (loop=0x4750680) at gmain.c:4123 #17 0x00007f3e4919f4b5 in gtk_main () at gtkmain.c:1312 #18 0x00000000004042a5 in main (argc=1, argv=0x7fff090c22b8) at main.c:679 I'm moving this to atk, because it's the place where the crash happens and which is responsible for the crash. The thing is that atk_gobject_accessible_dispose() is a weak-ref callback, not a real GObjectClass::dispose() implementation and as shown in comment #3, the callback can be called after the underlying object is freed, causing this use-after-free crash. Created attachment 1273871 [details] atk patch This change fixed the issue for me. Using this, and both changes from bug #1444490, make the dnd_picture test pass successfully. Filled upstream as: https://bugzilla.gnome.org/show_bug.cgi?id=781715 Added a patch comment upstream. Hi Milan, can you please make a devel_ack for this? Scratch build you provided to me fixes this issue but was still not officially released in brew. Thanks Upstream patch had been accepted, I'm building atk with it included now. *** Bug 1270015 has been marked as a duplicate of this bug. *** No longer reproducible. Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. https://access.redhat.com/errata/RHBA-2017:2100 |