client: Fix writing attribute values 73/204973/1
authorGrzegorz Kolodziejczyk <grzegorz.kolodziejczyk@codecoup.pl>
Thu, 26 Apr 2018 12:31:58 +0000 (14:31 +0200)
committerAmit Purwar <amit.purwar@samsung.com>
Mon, 29 Apr 2019 04:02:45 +0000 (09:32 +0530)
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.

Change-Id: I7a22c69f50d289d2d4c8430e938ec2516071d7cc
Signed-off-by: Amit Purwar <amit.purwar@samsung.com>
client/gatt.c

index 7103c4f..7d63c02 100755 (executable)
@@ -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;
 }