Commit: 7a35c12a6cebb56fe321dc1276117a94ec827eec
Parent: 96c140c2c4b606c1461348a5b1725441dd98f084
Author: Denis Grigorev <d.grigorev@omprussia.ru>
Committer: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Date: 2020-07-01 20:49:49
Tree: 8788c2f01653b293dd571fad2a2b43cde017e618

gobex: Fix segfault caused by interrupted transfer When a obex transfer is interrupted by a peer in the middle, the response G_OBEX_RSP_FORBIDDEN comes and the transfer is freed in transfer_complete. However gobex is still ref'ed and gobex->io continues to be writable, so write_data() and then g_obex_abort() are called. When the abort response comes, struct obc_transfer is already freed, which leads to the crash. Backtrace : __GI___pthread_mutex_lock (mutex=0x65732f74) at pthread_mutex_lock.c:67 0xecc6eeda in dbus_connection_get_object_path_data () from libdbus-1.so.3 0x000457d4 in g_dbus_emit_property_changed_full () at gdbus/object.c:1794 0x00045868 in g_dbus_emit_property_changed () at gdbus/object.c:1832 0x000367f0 in transfer_set_status () at obexd/client/transfer.c:211 0x0003681e in transfer_set_status () at obexd/client/transfer.c:206 xfer_complete () at obexd/client/transfer.c:672 0x00022df6 in transfer_complete () at gobex/gobex-transfer.c:103 0x00022f44 in transfer_abort_response () at gobex/gobex-transfer.c:124 0x00020a0e in handle_response () at gobex/gobex.c:1128 0x00020dde in incoming_data () at gobex/gobex.c:1373 This commit introduces g_obex_drop_tx_queue(), which will be called if a transfer error detected. After the tx queue is dropped, obex shuts down gracefully.

Diffstat

M gobex/gobex-transfer.c | 5 +++++
M gobex/gobex.c | 10 ++++++++++
M gobex/gobex.h | 1 +

3 files changed, 16 insertions(+), 0 deletions(-)

View Full Diff | Patch