summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJesse Gross <jesse@kernel.org>2016-05-28 19:17:27 -0700
committerJesse Gross <jesse@kernel.org>2016-06-21 10:15:28 -0700
commitabdf31d16d9ca28632f9a02d8791cb2671ae9058 (patch)
tree15dbff8ce061f558fe4613b0c03f35533adfcc12 /lib
parent1fc71871a50821aa68e3a2e18c9b44b6e9afede3 (diff)
downloadopenvswitch-abdf31d16d9ca28632f9a02d8791cb2671ae9058.tar.gz
tun-metadata: Use correct offset when accessing fragmented metadata.
Since tunnel metadata is stored in a fixed area in the flow match field, we must allocate space for options as they are registered with the switch. In order to avoid exposing implementation complexity to the controller, we support fragmentation when we run out of contiguous blocks that are large enough to handle new requests. When reading or writing to these fragmented blocks, there is a bug that would cause us to keep on using the area after the allocated space rather than moving to the next offset. This corrects that to use the offset for each block. Unfortunately, while we did have a test for this exact use case, since the same bug was present in both reading and writing code, everything appeared to work as normal from the outside. Signed-off-by: Jesse Gross <jesse@kernel.org> Acked-by: Jarno Rajahalme <jarno@ovn.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/tun-metadata.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/tun-metadata.c b/lib/tun-metadata.c
index a773aea03..7a2a84fca 100644
--- a/lib/tun-metadata.c
+++ b/lib/tun-metadata.c
@@ -490,7 +490,7 @@ memcpy_to_metadata(struct tun_metadata *dst, const void *src,
int addr = 0;
while (chain) {
- memcpy(dst->opts.u8 + loc->c.offset + addr, (uint8_t *)src + addr,
+ memcpy(dst->opts.u8 + chain->offset, (uint8_t *)src + addr,
chain->len);
addr += chain->len;
chain = chain->next;
@@ -507,7 +507,7 @@ memcpy_from_metadata(void *dst, const struct tun_metadata *src,
int addr = 0;
while (chain) {
- memcpy((uint8_t *)dst + addr, src->opts.u8 + loc->c.offset + addr,
+ memcpy((uint8_t *)dst + addr, src->opts.u8 + chain->offset,
chain->len);
addr += chain->len;
chain = chain->next;