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 20:58:11 +0000 (13:58 -0700)
commitc698e3b1e14025ce067d7e15e4530a86a3895b6c
tree22025c198a203b0c96db1bed19ad365614df8946
parenta39101373ba026ce7f6ca40cac80bafe269e3a61
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