bond: Fix segfault sending learning packets with LACP disabled.
authorBen Pfaff <blp@nicira.com>
Thu, 29 Nov 2012 17:32:28 +0000 (09:32 -0800)
committerBen Pfaff <blp@nicira.com>
Thu, 29 Nov 2012 21:03:36 +0000 (13:03 -0800)
It is essentially an invalid configuration to disable LACP but request TCP
balancing: in this configuration, the bond drops all packets.  But
may_send_learning_packets() would still indicate that learning packets
should be sent, so bond_compose_learning_packet() would try to choose an
output slave for those packets, which would be NULL (because all packets
are dropped), which would cause a segfault upon dereference.

This commit fixes the problem by making may_send_learning_packets() no
longer indicate that learning packets should be sent.

I tested this issue by modifying bond_should_send_learning_packets() to
always return true if may_send_learning_packets() returns true, and then
introducing the invalid configuration described above.  Without this comit,
ovs-vswitchd segfaults quickly; with this commit, it does not.

Bug #14090.
Reported-by: Kiran Shanbhog <kiran@vmware.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
AUTHORS
lib/bond.c

diff --git a/AUTHORS b/AUTHORS
index 4687865..fa5efed 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -131,6 +131,7 @@ Jeongkeun Lee           jklee@hp.com
 Joan Cirer              joan@ev0.net
 John Galgay             john@galgay.net
 Kevin Mancuso           kevin.mancuso@rackspace.com
+Kiran Shanbhog          kiran@vmware.com
 Kirill Kabardin
 Koichi Yagishita        yagishita.koichi@jrc.co.jp
 Konstantin Khorenko     khorenko@openvz.org
index 25a0fa1..2c59f9d 100644 (file)
@@ -494,7 +494,7 @@ static bool
 may_send_learning_packets(const struct bond *bond)
 {
     return bond->lacp_status == LACP_DISABLED
-        && bond->balance != BM_STABLE
+        && (bond->balance == BM_SLB || bond->balance == BM_AB)
         && bond->active_slave;
 }