bridge: Fix segfault when updating learning table for deleted port.
authorJesse Gross <jesse@nicira.com>
Thu, 12 Nov 2009 01:05:22 +0000 (17:05 -0800)
committerJesse Gross <jesse@nicira.com>
Thu, 12 Nov 2009 01:15:10 +0000 (17:15 -0800)
A function call using in_port was accidentally moved before the check
to see if it is null.  in_port can be null if a port was deleted but
an update is still pending.  This moves the call after the check.

Bug #2313

vswitchd/bridge.c

index 276f49640f946a166402ce843611c3cb3533eebd..fb6a1413fc57099aa8a9eef630f45154b0c8ff04 100644 (file)
@@ -2092,16 +2092,17 @@ bridge_account_flow_ofhook_cb(const flow_t *flow,
 {
     struct bridge *br = br_;
     struct port *in_port;
-    int vlan;
     const union odp_action *a;
 
     /* Feed information from the active flows back into the learning table
      * to ensure that table is always in sync with what is actually flowing
      * through the datapath. */
     in_port = port_from_dp_ifidx(br, flow->in_port);
-    vlan = flow_get_vlan(br, flow, in_port, false);
-    if (in_port && vlan >= 0) {
-        update_learning_table(br, flow, vlan, in_port);
+    if (in_port) {
+        int vlan = flow_get_vlan(br, flow, in_port, false);
+         if (vlan >= 0) {
+            update_learning_table(br, flow, vlan, in_port);
+        }
     }
 
     if (!br->has_bonded_ports) {