]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
IPoIB: Fix crash in path_rec_completion()
authorYossi Etigin <yosefe@Voltaire.COM>
Wed, 12 Nov 2008 18:24:39 +0000 (10:24 -0800)
committerRoland Dreier <rolandd@cisco.com>
Wed, 12 Nov 2008 18:24:39 +0000 (10:24 -0800)
Fix a crash in path_rec_completion() during an SM up/down loop.  If
more than one path record request is issued, the first completion
releases path->done, allowing ipoib_flush_paths() to free the path,
and thus corrupting it for the second completion.

Commit ee1e2c82 ("IPoIB: Refresh paths instead of flushing them on SM
change events") added the field path->valid and changed the test "if
(!path)" to "if (!path || !path->valid)".  This change made it
possible for a path with an outstanding query to pass the test and
issue another query on the same path.  Having two queries on the same
path leads to a crash.

This fixes <https://bugs.openfabrics.org/show_bug.cgi?id=1325>.

Signed-off-by: Yossi Etigin <yosefe@voltaire.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/ulp/ipoib/ipoib_main.c

index 0b2f601e8cafa594e79d82334e080497f56cb65b..85257f6b9576f77b6a5e24820ad895267d65e50c 100644 (file)
@@ -664,7 +664,7 @@ static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev,
                        skb_push(skb, sizeof *phdr);
                        __skb_queue_tail(&path->queue, skb);
 
-                       if (path_rec_start(dev, path)) {
+                       if (!path->query && path_rec_start(dev, path)) {
                                spin_unlock_irqrestore(&priv->lock, flags);
                                path_free(dev, path);
                                return;