The dpif flow dump API guarantees that keys it returns are not deleted unless dpif_flow_dump_next_may_destroy_keys() warns that they might be. When dpif_linux_flow_dump_next() needed extra memory for a datapath flow's actions, it would use a special temporary buffer. Unfortunately, it also used memory from this temporary buffer for the keys it returned. Thus, on the next loop this memory would be freed, breaking our invariant.
The correct solution to this problem is probably to fix this rather awkward API. However, this patch's solution is small and simple, so it's fine for now. Signed-off-by: Ethan Jackson <et...@nicira.com> --- lib/dpif-linux.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c index 4af0607..c30f923 100644 --- a/lib/dpif-linux.c +++ b/lib/dpif-linux.c @@ -1221,9 +1221,14 @@ dpif_linux_flow_dump_next(const struct dpif *dpif_, void *iter_, void *state_, } if (actions && !state->flow.actions) { + struct dpif_linux_flow reply; + error = dpif_linux_flow_get__(dpif, state->flow.key, state->flow.key_len, - &state->flow, &state->tmp); + &reply, &state->tmp); + state->flow.actions = reply.actions; + state->flow.actions_len = reply.actions_len; + if (error == ENOENT) { VLOG_DBG("dumped flow disappeared on get"); } else if (error) { -- 1.8.1.2 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev