diff options
author | Andrei Emeltchenko <andrei.emeltchenko@intel.com> | 2014-08-11 10:50:42 +0300 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2014-08-11 16:27:56 +0300 |
commit | cfdb4b82def192a16c2d2195a8d08283e68b285b (patch) | |
tree | fc66f6f4f3e36e00e87ffdff7738e87ced6717ca /gobex | |
parent | 4830f41e034706133b93b065b6bf9415ffce3e0b (diff) | |
download | bluez-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.c | 9 |
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; |