diff --git a/attrib/att.c b/attrib/att.c
index 1b95c45..c3cbf86 100644
--- a/attrib/att.c
+++ b/attrib/att.c
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
/* 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;
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;
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);
}
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;
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);
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);