ofproto: Fix use-after-free error when ports disappear.
authorBen Pfaff <blp@nicira.com>
Mon, 23 Apr 2012 16:16:18 +0000 (09:16 -0700)
committerBen Pfaff <blp@nicira.com>
Mon, 23 Apr 2012 21:01:10 +0000 (14:01 -0700)
commit87096e18f7c1012a47799d9f23be3bfec0174600
treed35643859f0c990b7df67ef7e0439eb26fe0450a
parent57250b7a198a097ecf7e89bc674cda3061118759
ofproto: Fix use-after-free error when ports disappear.

update_port() can delete the port for which it is called, if the underlying
network device has been destroyed, so HMAP_FOR_EACH is unsafe in
ofproto_run().

Less obviously, update_port() can delete unrelated ports.  For example,
suppose that initially device A is port 1 and device B is port 2.  If
update_port("A") runs just after this, then it will ofport_remove() both
ports, then ofport_install() A as the new port 2.

So this commit first assembles a list of ports to update, then updates them
in a separate loop.

Without this commit, running "ovs-dpctl del-dp" while ovs-vswitchd is
running consistently causes a crash for me within a few seconds.

Signed-off-by: Ben Pfaff <blp@nicira.com>
ofproto/ofproto.c