diff options
author | Grzegorz Kolodziejczyk <grzegorz.kolodziejczyk@codecoup.pl> | 2018-04-26 14:31:58 +0200 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2018-04-26 15:53:37 +0300 |
commit | 1dd33d584ce1e4bd0f1d87e88663350a80f37f01 (patch) | |
tree | efc7aaa981cdaf3eceafe358ac236d239840856f /client/gatt.c | |
parent | 4a37e7d8fcf0f0376d95a28d7e4668d23e5e1436 (diff) | |
download | bluez-1dd33d584ce1e4bd0f1d87e88663350a80f37f01.tar.gz |
client: Fix writing attribute values
Attribute values is not copied with dbus_message_iter_get_fixed_array,
so gatt write callback needs to replace old value with reallocation and
copy.
Diffstat (limited to 'client/gatt.c')
-rw-r--r-- | client/gatt.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/client/gatt.c b/client/gatt.c index 7103c4f83..7d63c0265 100644 --- a/client/gatt.c +++ b/client/gatt.c @@ -1588,12 +1588,26 @@ static DBusMessage *chrc_read_value(DBusConnection *conn, DBusMessage *msg, static int parse_value_arg(DBusMessageIter *iter, uint8_t **value, int *len) { DBusMessageIter array; + uint16_t offset = 0; + uint8_t *read_value; + int read_len; if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY) return -EINVAL; dbus_message_iter_recurse(iter, &array); - dbus_message_iter_get_fixed_array(&array, value, len); + dbus_message_iter_get_fixed_array(&array, &read_value, &read_len); + + dbus_message_iter_next(iter); + if (parse_options(iter, &offset, NULL, NULL, NULL)) + return -EINVAL; + + if ((offset + read_len) > *len) { + *len = offset + read_len; + *value = g_realloc(*value, *len); + } + + memcpy(*value + offset, read_value, read_len); return 0; } |