The dataset stores the source and the alfred_tlv of the send data next to the actual data buffer. The source and alfred_tlv::type was used to find an entry in the dataset hashtable when reading/updating the buffer. The alfred_tlv::length is always updated when the size of the associated buffer gets modified.
But the alfred_tlv::version is only written when receiving the first data for a dataset. But this initial (maybe outdated) version is always propagated when a client asks over the unix socket or the dataset is exchanged between alfred servers. This has to also be updated when new data is added to the dataset to avoid clients to interpret the data using the wrong data format version.
Signed-off-by: Sven Eckelmann sven@narfation.org --- recv.c | 1 + unix_sock.c | 1 + 2 files changed, 2 insertions(+)
diff --git a/recv.c b/recv.c index 34a16fc..e0252eb 100644 --- a/recv.c +++ b/recv.c @@ -91,6 +91,7 @@ static int finish_alfred_push_data(struct globals *globals, goto err;
dataset->data.header.length = data_len; + dataset->data.header.version = data->header.version; memcpy(dataset->buf, data->data, data_len);
/* if the sender is also the the source of the dataset, we diff --git a/unix_sock.c b/unix_sock.c index ae86956..0707252 100644 --- a/unix_sock.c +++ b/unix_sock.c @@ -151,6 +151,7 @@ static int unix_sock_add_data(struct globals *globals, goto err;
dataset->data.header.length = data_len; + dataset->data.header.version = data->header.version; memcpy(dataset->buf, data->data, data_len);
ret = 0;