From: Joe Stringer Date: Sun, 4 May 2014 22:14:18 +0000 (+1200) Subject: tunnel: Fix bug where misconfiguration persists. X-Git-Tag: v2.1.3~39 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=0fe1d7f39de9836fea01c560a6fdbfd1405096ea tunnel: Fix bug where misconfiguration persists. Previously, misconfiguring a tunnel port to use the exact same settings would cause the corresponding netdev to never be destroyed. When attempting to re-use the port as a different type, this would fail and result in a discrepancy between reported port type and actual netdev in use. An example configuration that would previously give unexpected behaviour: ovs-vsctl add-port br0 p0 -- set int p0 type=gre options:remote_ip=1.2.3.4 ovs-vsctl add-port br0 p1 -- set int p1 type=internal ovs-vsctl set int p1 type=gre options:remote_ip=1.2.3.4 ovs-vsctl set int p1 type=internal The final command would report in the ovs-vswitchd logs that it is attempting to configure the port with the same gre settings as p0, despite the command specifying the type as internal. Even after deleting and re-adding the port, the message would reappear. This patch fixes the bug by dereferencing the netdev in the failure case of tnl_port_add__(), and ensures that the tnl_port structure is freed in that case as well. Bug #1198386. Signed-off-by: Joe Stringer Acked-by: Ryan Wilson Acked-by: Alex Wang --- diff --git a/ofproto/tunnel.c b/ofproto/tunnel.c index 46e1adbdb..d39cf499c 100644 --- a/ofproto/tunnel.c +++ b/ofproto/tunnel.c @@ -119,8 +119,9 @@ tnl_port_add__(const struct ofport_dpif *ofport, const struct netdev *netdev, "port '%s' (%s)", tnl_port_get_name(tnl_port), tnl_port_get_name(existing_port), ds_cstr(&ds)); ds_destroy(&ds); - free(tnl_port); } + netdev_close(tnl_port->netdev); + free(tnl_port); return false; }