[openib-general] Re: [PATCH] SDP: fix oops with port reuse
    Michael S. Tsirkin 
    mst at mellanox.co.il
       
    Tue Aug 16 02:19:51 PDT 2005
    
    
  
This is what I committed. I'm not against making sdp_inet_port_put void,
looking at libsdp this shouldnt introduce any problems, but lets make it
a separate patch.
Maybe its a good idea to init bind_next at socket creation, at port_put
we could call list_del_init, and/or use list_empty to figure out
whether the socket is on the bind list.
Quoting r. Tom Duffy <tduffy at sun.com>:
> Subject: [PATCH] SDP: fix oops with port reuse
> 
> This patch fixes an oops that I introduced in my conversion to use linux
> lists for binds (committed in revision 2874).  If two sockets tried to
> use the same port, after failing to get the port (again), it would
> attempt a put and the second attempt would oops the machine.
Signed-off-by: Tom Duffy <tduffy at sun.com>
Signed-off-by: Michael S. Tsirkin <mst at mellanox.co.il>
Index: linux-kernel/drivers/infiniband/ulp/sdp/sdp_conn.c
===================================================================
--- linux-kernel/drivers/infiniband/ulp/sdp/sdp_conn.c	(revision 3103)
+++ linux-kernel/drivers/infiniband/ulp/sdp/sdp_conn.c	(working copy)
@@ -493,16 +493,17 @@ done:
 int sdp_inet_port_put(struct sdp_sock *conn)
 {
 	unsigned long flags;
-
-	if (list_empty(&dev_root_s.bind_list))
-		return -EADDRNOTAVAIL;
+	int result = -EADDRNOTAVAIL;
 
 	spin_lock_irqsave(&dev_root_s.bind_lock, flags);
-	list_del(&conn->bind_next);
-	conn->src_port = 0;
+	if (conn->src_port) {
+		list_del(&conn->bind_next);
+		conn->src_port = 0;
+		result = 0;
+	}
 	spin_unlock_irqrestore(&dev_root_s.bind_lock, flags);
 
-	return 0;
+	return result;
 }
 
 /*
-- 
MST
    
    
More information about the general
mailing list