datapath: Do not free in use mask list, fixes a kernel crash bug
authorAndy Zhou <azhou@nicira.com>
Wed, 29 Jan 2014 16:36:05 +0000 (08:36 -0800)
committerAndy Zhou <azhou@nicira.com>
Wed, 29 Jan 2014 20:48:23 +0000 (12:48 -0800)
Last commit 738a2445c0 introduced a bug where the mask list of
a flow table was freed even when the table's flows and mask list is
reused by another table.

Bug #32932

Reported-by: Len Gao <leng@vmware.com>
Signed-off-by: Andy Zhou <azhou@nicira.com>
Acked-by: Jesse Gross <jesse@nicira.com>
datapath/flow.c

index b9ad608..2e46866 100644 (file)
@@ -502,8 +502,10 @@ static struct flow_table *__flow_tbl_alloc(int new_size)
 
 static void __flow_tbl_destroy(struct flow_table *table)
 {
-       BUG_ON(!list_empty(table->mask_list));
-       kfree(table->mask_list);
+       if (!table->keep_flows) {
+               BUG_ON(!list_empty(table->mask_list));
+               kfree(table->mask_list);
+       }
 
        free_buckets(table->buckets);
        kfree(table);