ofproto: Fix use-after-free error when ports disappear. branch-1.2
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:06:11 +0000 (14:06 -0700)
commit7d09d61fac2c19d23b7b3cee501a4404220c9f46
treeaca267d9a83652a6e169fe9936103f9e015e8eb3
parentc38e95a3368d68e66387796c26708516f69bcc94
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