datapath: Fix use-after-free error in datapath destruction.
authorBen Pfaff <blp@nicira.com>
Fri, 26 Jun 2009 21:15:04 +0000 (14:15 -0700)
committerBen Pfaff <blp@nicira.com>
Fri, 26 Jun 2009 21:15:46 +0000 (14:15 -0700)
commit7793a4aaeb0d550d71fab4b7a5c075b0526c8b05
tree3353f94a95ce63a1590fc0ac15cca3ffceb9fcf4
parent312b427dab326ffacfc64daaa57ed4d31595302b
datapath: Fix use-after-free error in datapath destruction.

When we create a datapath we do this:

1. Create local port.
2. Call add_dp hook.
3. Allow userspace to add more ports.

When we deleted a datapath we were doing this:

1. Call del_dp hook
2. Delete all the ports.

Unfortunately step 1 destroys dp->ifobj, then dp_del_port on any port other
than the local port in step 2 tries to reference dp->ifobj through a call
to sysfs_remove_link().

This commit fixes the problem by changing datapath deletion to mirror
creation:

1. Delete all the ports but the local port.
2. Call dp_del hook.
3. Delete local port.

Commit 010082639 "datapath: Add sysfs support for all (otherwise supported)
Linux versions" makes this problem obvious on a 2.6.25+ kernel configured
with slab debugging, because on such kernels the ifobj is a pointer to a
slab object that is freed by the del_dp hook function (when brcompat_mod
is loaded).  This bug may be just as present on older kernels, but there
the ifobj is part of struct datapath, not a pointer, and thus it is much
harder to trigger.

Bug #1465.
datapath/datapath.c