client: Fix memory leak connected to params
PATCH 1/2 client: Fix memory leak connected to params
obc_transfer_params (created in obc_session_get) are reused to store params received in the response. But actual parameter data were not freed before g_memdup in get_buf_xfer_progress.
--- client/transfer.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-)
client/transfer.c +6 -1
@@ -533,11 +533,16 @@ int obc_transfer_get(struct obc_transfer *transfer, transfer_callback_t func,g_obex_packet_add_bytes (req,G_OBEX_HDR_TYPE , transfer->type,strlen (transfer->type) +1 ); -if (transfer->params !=NULL ) +if (transfer->params !=NULL ) {g_obex_packet_add_bytes (req,G_OBEX_HDR_APPARAM , transfer->params->data, transfer->params->size); +g_free (transfer->params->data); + transfer->params->size =0 ; + transfer->params->data =NULL ; + } +if (rsp_cb) transfer->xfer =g_obex_send_req (obex, req,-1 , rsp_cb, transfer, &err);
Signature · 1 line
1.7.4.1
PATCH 2/2 client: Fix invalid write in get_buf_xfer_progress
Segmentation fault occurred when there were no (NULL) params in obc_session_get, but actual params were returned in response, as corresponding structure is reused - but not created in the first place.
--- client/session.c | 2 +- client/transfer.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
client/session.c +1 -1
@@ -1231,8 +1231,8 @@ int obc_session_get(struct obc_session *session, const char *type,if (session->obex ==NULL )return -ENOTCONN ; + params = g_new0(struct obc_transfer_params, 1);if (apparam !=NULL ) { - params = g_new0(struct obc_transfer_params, 1); params->data =g_new (guint8, apparam_size);memcpy (params->data, apparam, apparam_size); params->size = apparam_size;
client/transfer.c +1 -1
@@ -533,7 +533,7 @@ int obc_transfer_get(struct obc_transfer *transfer, transfer_callback_t func,g_obex_packet_add_bytes (req,G_OBEX_HDR_TYPE , transfer->type,strlen (transfer->type) +1 ); -if (transfer->params !=NULL ) { +if (transfer->params !=NULL && transfer->params->size !=0 ) {g_obex_packet_add_bytes (req,G_OBEX_HDR_APPARAM , transfer->params->data, transfer->params->size);
Signature · 1 line
1.7.4.1
Luiz Augusto von Dentz
maintainerRe: [PATCH obexd 2/2] client: Fix invalid write in get_buf_xfer_progress
Hi Bartosz,
Quoted 38 lines · Bartosz Szatkowski
Segmentation fault occurred when there were no (NULL) params in
obc_session_get, but actual params were returned in response, as corresponding structure is reused - but not created in the first place.
---
client/session.c | 2 +-
client/transfer.c | 2 +-2 files changed, 2 insertions(+), 2 deletions(-)client/session.c +1
-1@@ -1231,8 +1231,8 @@ int obc_session_get(struct obc_session *session, const char *type, if (session->obex == NULL) return -ENOTCONN; + params = g_new0(struct obc_transfer_params, 1); if (apparam != NULL) { - params = g_new0(struct obc_transfer_params, 1); params->data = g_new(guint8, apparam_size); memcpy(params->data, apparam, apparam_size); params->size = apparam_size;client/transfer.c +1
-2@@ -533,7 +533,7 @@ int obc_transfer_get(struct obc_transfer *transfer, transfer_callback_t func, g_obex_packet_add_bytes(req, G_OBEX_HDR_TYPE, transfer->type, strlen(transfer->type) + 1); - if (transfer->params != NULL) { + if (transfer->params != NULL && transfer->params->size != 0) { g_obex_packet_add_bytes(req, G_OBEX_HDR_APPARAM, transfer->params->data, transfer->params->size); --1.7.4.1
Quoted 1 line
--
Ack.
Signature · 1 line
Luiz Augusto von Dentz
Luiz Augusto von Dentz
maintainerHi Bartosz,
Quoted 32 lines · Bartosz Szatkowski
obc_transfer_params(created inobc_session_get) are reused to store params received in the response. But actual parameter data were not freed beforeg_memdupinget_buf_xfer_progress.
---
client/transfer.c | 7 ++++++-1 files changed, 6 insertions(+), 1 deletions(-)client/transfer.c +6
-2@@ -533,11 +533,16 @@ int obc_transfer_get(struct obc_transfer *transfer, transfer_callback_t func, g_obex_packet_add_bytes(req, G_OBEX_HDR_TYPE, transfer->type, strlen(transfer->type) + 1); - if (transfer->params != NULL) + if (transfer->params != NULL) { g_obex_packet_add_bytes(req, G_OBEX_HDR_APPARAM, transfer->params->data, transfer->params->size); + g_free(transfer->params->data); + transfer->params->size = 0; + transfer->params->data = NULL; + } + if (rsp_cb) transfer->xfer = g_obex_send_req(obex, req, -1, rsp_cb, transfer, &err); --1.7.4.1
Quoted 1 line
--
I would like it better if do this on get_buf_xfer_progress, so whenever we are going to overwrite it we free it before.
Signature · 1 line
Luiz Augusto von Dentz