summaryrefslogtreecommitdiff
path: root/gobex
diff options
context:
space:
mode:
authorAndrei Emeltchenko <andrei.emeltchenko@intel.com>2014-08-11 10:50:42 +0300
committerJohan Hedberg <johan.hedberg@intel.com>2014-08-11 16:27:56 +0300
commitcfdb4b82def192a16c2d2195a8d08283e68b285b (patch)
treefc66f6f4f3e36e00e87ffdff7738e87ced6717ca /gobex
parent4830f41e034706133b93b065b6bf9415ffce3e0b (diff)
downloadbluez-cfdb4b82def192a16c2d2195a8d08283e68b285b.tar.gz
gobex: Fix use after free
Refactor function transfer_get_req_first() to avoid use after free.
Diffstat (limited to 'gobex')
-rw-r--r--gobex/gobex-transfer.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/gobex/gobex-transfer.c b/gobex/gobex-transfer.c
index efae72bf8..d7707f996 100644
--- a/gobex/gobex-transfer.c
+++ b/gobex/gobex-transfer.c
@@ -553,7 +553,8 @@ static gssize get_get_data(void *buf, gsize len, gpointer user_data)
return ret;
}
-static void transfer_get_req_first(struct transfer *transfer, GObexPacket *rsp)
+static gboolean transfer_get_req_first(struct transfer *transfer,
+ GObexPacket *rsp)
{
GError *err = NULL;
@@ -564,7 +565,10 @@ static void transfer_get_req_first(struct transfer *transfer, GObexPacket *rsp)
if (!g_obex_send(transfer->obex, rsp, &err)) {
transfer_complete(transfer, err);
g_error_free(err);
+ return FALSE;
}
+
+ return TRUE;
}
static void transfer_get_req(GObex *obex, GObexPacket *req, gpointer user_data)
@@ -596,7 +600,8 @@ guint g_obex_get_rsp_pkt(GObex *obex, GObexPacket *rsp,
transfer = transfer_new(obex, G_OBEX_OP_GET, complete_func, user_data);
transfer->data_producer = data_func;
- transfer_get_req_first(transfer, rsp);
+ if (!transfer_get_req_first(transfer, rsp))
+ return 0;
if (!g_slist_find(transfers, transfer))
return 0;