ovs-ofctl: Avoid use-after-free upon "ofctl/unblock" when connection dies.
authorBen Pfaff <blp@nicira.com>
Thu, 12 Jul 2012 23:32:56 +0000 (16:32 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 12 Jul 2012 23:34:08 +0000 (16:34 -0700)
commit4f8f2439c3cd93b856442816f97e77e95e605042
treef99472a4f67d5ea5b6e6ff98b95eab63cd93686e
parentbe812f2d2b0c948e5f52017c4df79645809fcb90
ovs-ofctl: Avoid use-after-free upon "ofctl/unblock" when connection dies.

The implementation of "ofctl/block" used a nested poll loop, with an inner
call to unixctl_server_run().  This poll loop always ran inside an outer
call to unixctl_server_run(), since that's the context within which unixctl
command implementations run.  That means that, if a unixctl connection got
closed within the inner poll loop, and the outer poll loop happened to be
processing the same unixctl connection, then the outer poll loop would
dereference data in the freed connection.

The simplest solution is to avoid a nested poll loop, so that's what this
commit does.

This didn't cause a failure in the unit tests on i386 (which is why I
didn't catch it before pushing) but it did, reliably, on x86-64, and it
showed up in valgrind everywhere.

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