sctp: prevent too-fast association id reuse
authorVlad Yasevich <vladislav.yasevich@hp.com>
Mon, 23 Nov 2009 20:54:01 +0000 (15:54 -0500)
committerVlad Yasevich <vladislav.yasevich@hp.com>
Mon, 23 Nov 2009 20:54:01 +0000 (15:54 -0500)
We use the idr subsystem and always ask for an id
at or above 1.  This results in a id reuse when one
association is terminated while another is created.

To prevent re-use, we keep track of the last id returned
and ask for that id + 1 as a base for each query.  We let
the idr spin lock protect this base id as well.

Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
net/sctp/associola.c

index 6e96f83570c957df2e3804f26342d902b8f1ab5a..df5abbff63e22b5de97b3579173adf37519a8df3 100644 (file)
 static void sctp_assoc_bh_rcv(struct work_struct *work);
 static void sctp_assoc_free_asconf_acks(struct sctp_association *asoc);
 
+/* Keep track of the new idr low so that we don't re-use association id
+ * numbers too fast.  It is protected by they idr spin lock is in the
+ * range of 1 - INT_MAX.
+ */
+static u32 idr_low = 1;
+
 
 /* 1st Level Abstractions. */
 
@@ -1553,7 +1559,12 @@ retry:
 
        spin_lock_bh(&sctp_assocs_id_lock);
        error = idr_get_new_above(&sctp_assocs_id, (void *)asoc,
-                                   1, &assoc_id);
+                                   idr_low, &assoc_id);
+       if (!error) {
+               idr_low = assoc_id + 1;
+               if (idr_low == INT_MAX)
+                       idr_low = 1;
+       }
        spin_unlock_bh(&sctp_assocs_id_lock);
        if (error == -EAGAIN)
                goto retry;