linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH BlueZ 0/3] More attribute allocation fixes
@ 2011-09-21  2:49 Anderson Lizardo
  2011-09-21  2:49 ` [PATCH BlueZ 1/3] Remove empty line before declaration Anderson Lizardo
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Anderson Lizardo @ 2011-09-21  2:49 UTC (permalink / raw)
  To: linux-bluetooth

Hi,

Since the commit "Fix allocation of attribute values" I submitted last week
(which was authored by Vinicius), we found a few other issues related to
attribute allocation (thanks to Hendrik Sattler for the review of that commit,
BTW). This series fixes those issues. The last commit replaces a few memcpy()
operations with assignments, as suggested by Hendrik.

The allocation fixes have been tested with valgrind to make sure there are no
obvious leaks.

Best Regards,
--
Anderson Lizardo
Instituto Nokia de Tecnologia - INdT
Manaus - Brazil

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH BlueZ 1/3] Remove empty line before declaration
  2011-09-21  2:49 [PATCH BlueZ 0/3] More attribute allocation fixes Anderson Lizardo
@ 2011-09-21  2:49 ` Anderson Lizardo
  2011-09-21  2:49 ` [PATCH BlueZ 2/3] Fix memory allocation of struct attribute Anderson Lizardo
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Anderson Lizardo @ 2011-09-21  2:49 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Anderson Lizardo

---
 attrib/att.c |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

diff --git a/attrib/att.c b/attrib/att.c
index 1ce0f7b..1b95c45 100644
--- a/attrib/att.c
+++ b/attrib/att.c
@@ -857,7 +857,6 @@ uint16_t enc_indication(struct attribute *a, uint8_t *pdu, int len)
 struct attribute *dec_indication(const uint8_t *pdu, int len)
 {
 	const uint16_t min_len = sizeof(pdu[0]) + sizeof(uint16_t);
-
 	struct attribute *a;
 
 	if (pdu == NULL)
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH BlueZ 2/3] Fix memory allocation of struct attribute
  2011-09-21  2:49 [PATCH BlueZ 0/3] More attribute allocation fixes Anderson Lizardo
  2011-09-21  2:49 ` [PATCH BlueZ 1/3] Remove empty line before declaration Anderson Lizardo
@ 2011-09-21  2:49 ` Anderson Lizardo
  2011-09-21  2:49 ` [PATCH BlueZ 3/3] Refactor value assignments of bt_uuid_t variables Anderson Lizardo
  2011-09-27  9:19 ` [PATCH BlueZ 0/3] More attribute allocation fixes Johan Hedberg
  3 siblings, 0 replies; 5+ messages in thread
From: Anderson Lizardo @ 2011-09-21  2:49 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Anderson Lizardo

On commit 6a6da5de107e192f62ce2ecdde96eae985181df0 the struct
attribute "data[0]" member was replaced with a dynamically allocated
"data" pointer. This commit fixes remaining places where the old
allocation scheme was still assumed.
---
 attrib/att.c        |    7 +++----
 src/attrib-server.c |   33 +++++++++++++++------------------
 2 files changed, 18 insertions(+), 22 deletions(-)

diff --git a/attrib/att.c b/attrib/att.c
index 1b95c45..c3cbf86 100644
--- a/attrib/att.c
+++ b/attrib/att.c
@@ -868,11 +868,10 @@ struct attribute *dec_indication(const uint8_t *pdu, int len)
 	if (len < min_len)
 		return NULL;
 
-	a = g_malloc0(sizeof(struct attribute) + len - min_len);
-	a->len = len - min_len;
-
+	a = g_new0(struct attribute, 1);
 	a->handle = att_get_u16(&pdu[1]);
-	memcpy(a->data, &pdu[3], a->len);
+	a->len = len - min_len;
+	a->data = g_memdup(&pdu[3], a->len);
 
 	return a;
 }
diff --git a/src/attrib-server.c b/src/attrib-server.c
index 5c86085..2e99a52 100644
--- a/src/attrib-server.c
+++ b/src/attrib-server.c
@@ -271,10 +271,9 @@ static struct attribute *client_cfg_attribute(struct gatt_channel *channel,
 		/* Create a private copy of the Client Characteristic
 		 * Configuration attribute */
 		a = g_new0(struct attribute, 1);
-		a->data = g_malloc0(vlen);
-
-		memcpy(a, orig_attr, sizeof(*a));
-		memcpy(a->data, value, vlen);
+		*a = *orig_attr;
+		a->len = vlen;
+		a->data = g_memdup(value, vlen);
 		a->write_cb = client_set_notifications;
 		a->cb_user_data = channel;
 
@@ -776,6 +775,14 @@ static uint16_t mtu_exchange(struct gatt_channel *channel, uint16_t mtu,
 	return enc_mtu_resp(old_mtu, pdu, len);
 }
 
+static void attrib_free(void *data)
+{
+	struct attribute *a = data;
+
+	g_free(a->data);
+	g_free(a);
+}
+
 static void channel_disconnect(void *user_data)
 {
 	struct gatt_channel *channel = user_data;
@@ -785,7 +792,7 @@ static void channel_disconnect(void *user_data)
 
 	g_slist_free(channel->notify);
 	g_slist_free(channel->indicate);
-	g_slist_free_full(channel->configs, g_free);
+	g_slist_free_full(channel->configs, attrib_free);
 
 	g_free(channel);
 }
@@ -1123,14 +1130,6 @@ failed:
 	return -1;
 }
 
-static void attrib_free(void *data)
-{
-	struct attribute *a = data;
-
-	g_free(a->data);
-	g_free(a);
-}
-
 void attrib_server_exit(void)
 {
 	GSList *l;
@@ -1152,7 +1151,7 @@ void attrib_server_exit(void)
 
 		g_slist_free(channel->notify);
 		g_slist_free(channel->indicate);
-		g_slist_free_full(channel->configs, g_free);
+		g_slist_free_full(channel->configs, attrib_free);
 
 		g_attrib_unref(channel->attrib);
 		g_free(channel);
@@ -1253,14 +1252,12 @@ struct attribute *attrib_db_add(uint16_t handle, bt_uuid_t *uuid, int read_reqs,
 		return NULL;
 
 	a = g_new0(struct attribute, 1);
-	a->data = g_malloc0(len);
-
+	a->len = len;
+	a->data = g_memdup(value, len);
 	a->handle = handle;
 	memcpy(&a->uuid, uuid, sizeof(bt_uuid_t));
 	a->read_reqs = read_reqs;
 	a->write_reqs = write_reqs;
-	a->len = len;
-	memcpy(a->data, value, len);
 
 	database = g_slist_insert_sorted(database, a, attribute_cmp);
 
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH BlueZ 3/3] Refactor value assignments of bt_uuid_t variables
  2011-09-21  2:49 [PATCH BlueZ 0/3] More attribute allocation fixes Anderson Lizardo
  2011-09-21  2:49 ` [PATCH BlueZ 1/3] Remove empty line before declaration Anderson Lizardo
  2011-09-21  2:49 ` [PATCH BlueZ 2/3] Fix memory allocation of struct attribute Anderson Lizardo
@ 2011-09-21  2:49 ` Anderson Lizardo
  2011-09-27  9:19 ` [PATCH BlueZ 0/3] More attribute allocation fixes Johan Hedberg
  3 siblings, 0 replies; 5+ messages in thread
From: Anderson Lizardo @ 2011-09-21  2:49 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Anderson Lizardo

Prior to this commit, the assignments were made with memcpy(). This can
be unsafe and less readable, therefore it was replaced with code like:

<dst> = *src;

This also allows more compiler safety checks.
---
 attrib/gatt.c       |    2 +-
 lib/uuid.c          |    2 +-
 src/attrib-server.c |    4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/attrib/gatt.c b/attrib/gatt.c
index 77c96f3..a62f348 100644
--- a/attrib/gatt.c
+++ b/attrib/gatt.c
@@ -241,7 +241,7 @@ guint gatt_discover_primary(GAttrib *attrib, bt_uuid_t *uuid, gatt_cb_t func,
 	dp->user_data = user_data;
 
 	if (uuid) {
-		memcpy(&dp->uuid, uuid, sizeof(bt_uuid_t));
+		dp->uuid = *uuid;
 		cb = primary_by_uuid_cb;
 	} else
 		cb = primary_all_cb;
diff --git a/lib/uuid.c b/lib/uuid.c
index 325016a..a3e2a1a 100644
--- a/lib/uuid.c
+++ b/lib/uuid.c
@@ -74,7 +74,7 @@ void bt_uuid_to_uuid128(const bt_uuid_t *src, bt_uuid_t *dst)
 {
 	switch (src->type) {
 	case BT_UUID128:
-		memcpy(dst, src, sizeof(bt_uuid_t));
+		*dst = *src;
 		break;
 	case BT_UUID32:
 		bt_uuid32_to_uuid128(src, dst);
diff --git a/src/attrib-server.c b/src/attrib-server.c
index 2e99a52..59dddf6 100644
--- a/src/attrib-server.c
+++ b/src/attrib-server.c
@@ -1255,7 +1255,7 @@ struct attribute *attrib_db_add(uint16_t handle, bt_uuid_t *uuid, int read_reqs,
 	a->len = len;
 	a->data = g_memdup(value, len);
 	a->handle = handle;
-	memcpy(&a->uuid, uuid, sizeof(bt_uuid_t));
+	a->uuid = *uuid;
 	a->read_reqs = read_reqs;
 	a->write_reqs = write_reqs;
 
@@ -1287,7 +1287,7 @@ int attrib_db_update(uint16_t handle, bt_uuid_t *uuid, const uint8_t *value,
 	memcpy(a->data, value, len);
 
 	if (uuid != NULL)
-		memcpy(&a->uuid, uuid, sizeof(bt_uuid_t));
+		a->uuid = *uuid;
 
 	if (attr)
 		*attr = a;
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH BlueZ 0/3] More attribute allocation fixes
  2011-09-21  2:49 [PATCH BlueZ 0/3] More attribute allocation fixes Anderson Lizardo
                   ` (2 preceding siblings ...)
  2011-09-21  2:49 ` [PATCH BlueZ 3/3] Refactor value assignments of bt_uuid_t variables Anderson Lizardo
@ 2011-09-27  9:19 ` Johan Hedberg
  3 siblings, 0 replies; 5+ messages in thread
From: Johan Hedberg @ 2011-09-27  9:19 UTC (permalink / raw)
  To: Anderson Lizardo; +Cc: linux-bluetooth

Hi Lizardo,

On Tue, Sep 20, 2011, Anderson Lizardo wrote:
> Since the commit "Fix allocation of attribute values" I submitted last week
> (which was authored by Vinicius), we found a few other issues related to
> attribute allocation (thanks to Hendrik Sattler for the review of that commit,
> BTW). This series fixes those issues. The last commit replaces a few memcpy()
> operations with assignments, as suggested by Hendrik.
> 
> The allocation fixes have been tested with valgrind to make sure there are no
> obvious leaks.

All three patches have been applied. Thanks.

Johan

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2011-09-27  9:19 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-09-21  2:49 [PATCH BlueZ 0/3] More attribute allocation fixes Anderson Lizardo
2011-09-21  2:49 ` [PATCH BlueZ 1/3] Remove empty line before declaration Anderson Lizardo
2011-09-21  2:49 ` [PATCH BlueZ 2/3] Fix memory allocation of struct attribute Anderson Lizardo
2011-09-21  2:49 ` [PATCH BlueZ 3/3] Refactor value assignments of bt_uuid_t variables Anderson Lizardo
2011-09-27  9:19 ` [PATCH BlueZ 0/3] More attribute allocation fixes Johan Hedberg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).