Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=a25de534f89c515c82d3553c42d3bb02c2d1a7da
Commit:     a25de534f89c515c82d3553c42d3bb02c2d1a7da
Parent:     be702d5e38e2e7e554604b223794f87c12fa6811
Author:     Anton Arapov <[EMAIL PROTECTED]>
AuthorDate: Thu Oct 18 22:00:17 2007 -0700
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Thu Oct 18 22:00:17 2007 -0700

    [INET]: Justification for local port range robustness.
    
      There is a justifying patch for Stephen's patches. Stephen's patches
    disallows using a port range of one single port and brakes the meaning
    of the 'remaining' variable, in some places it has different meaning.
    My patch gives back the sense of 'remaining' variable. It should mean
    how many ports are remaining and nothing else. Also my patch allows
    using a single port.
    
      I sure we must be able to use mentioned port range, this does not
    restricted by documentation and does not brake current behavior.
    
    usefull links:
    Patches posted by Stephen Hemminger
      http://marc.info/?l=linux-netdev&m=119206106218187&w=2
      http://marc.info/?l=linux-netdev&m=119206109918235&w=2
    
    Andrew Morton's comment
      http://marc.info/?l=linux-kernel&m=119248225007737&w=2
    
    1. Allows using a port range of one single port.
    2. Gives back sense of 'remaining' variable.
    
    Signed-off-by: Anton Arapov <[EMAIL PROTECTED]>
    Acked-by: Stephen Hemminger <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 drivers/infiniband/core/cma.c   |    5 +++--
 net/ipv4/inet_connection_sock.c |    2 +-
 net/ipv4/inet_hashtables.c      |    2 +-
 net/ipv4/sysctl_net_ipv4.c      |    4 ++--
 net/ipv4/udp.c                  |    5 +++--
 net/ipv6/inet6_hashtables.c     |    2 +-
 6 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 93644f8..d08fb30 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -2797,11 +2797,12 @@ static void cma_remove_one(struct ib_device *device)
 
 static int cma_init(void)
 {
-       int ret, low, high;
+       int ret, low, high, remaining;
 
        get_random_bytes(&next_port, sizeof next_port);
        inet_get_local_port_range(&low, &high);
-       next_port = ((unsigned int) next_port % (high - low)) + low;
+       remaining = (high - low) + 1;
+       next_port = ((unsigned int) next_port % remaining) + low;
 
        cma_wq = create_singlethread_workqueue("rdma_cm");
        if (!cma_wq)
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
index 3cef128..8fb6ca2 100644
--- a/net/ipv4/inet_connection_sock.c
+++ b/net/ipv4/inet_connection_sock.c
@@ -93,7 +93,7 @@ int inet_csk_get_port(struct inet_hashinfo *hashinfo,
                int remaining, rover, low, high;
 
                inet_get_local_port_range(&low, &high);
-               remaining = high - low;
+               remaining = (high - low) + 1;
                rover = net_random() % remaining + low;
 
                do {
diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c
index fac6398..16eecc7 100644
--- a/net/ipv4/inet_hashtables.c
+++ b/net/ipv4/inet_hashtables.c
@@ -286,7 +286,7 @@ int inet_hash_connect(struct inet_timewait_death_row 
*death_row,
                struct inet_timewait_sock *tw = NULL;
 
                inet_get_local_port_range(&low, &high);
-               remaining = high - low;
+               remaining = (high - low) + 1;
 
                local_bh_disable();
                for (i = 1; i <= remaining; i++) {
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c
index c78acc1..ffddd2b 100644
--- a/net/ipv4/sysctl_net_ipv4.c
+++ b/net/ipv4/sysctl_net_ipv4.c
@@ -122,7 +122,7 @@ static int ipv4_local_port_range(ctl_table *table, int 
write, struct file *filp,
        ret = proc_dointvec_minmax(&tmp, write, filp, buffer, lenp, ppos);
 
        if (write && ret == 0) {
-               if (range[1] <= range[0])
+               if (range[1] < range[0])
                        ret = -EINVAL;
                else
                        set_local_port_range(range);
@@ -150,7 +150,7 @@ static int ipv4_sysctl_local_port_range(ctl_table *table, 
int __user *name,
 
        ret = sysctl_intvec(&tmp, name, nlen, oldval, oldlenp, newval, newlen);
        if (ret == 0 && newval && newlen) {
-               if (range[1] <= range[0])
+               if (range[1] < range[0])
                        ret = -EINVAL;
                else
                        set_local_port_range(range);
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index cb9fc58..35d2b0e 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -147,13 +147,14 @@ int __udp_lib_get_port(struct sock *sk, unsigned short 
snum,
        write_lock_bh(&udp_hash_lock);
 
        if (!snum) {
-               int i, low, high;
+               int i, low, high, remaining;
                unsigned rover, best, best_size_so_far;
 
                inet_get_local_port_range(&low, &high);
+               remaining = (high - low) + 1;
 
                best_size_so_far = UINT_MAX;
-               best = rover = net_random() % (high - low) + low;
+               best = rover = net_random() % remaining + low;
 
                /* 1st pass: look for empty (or shortest) hash chain */
                for (i = 0; i < UDP_HTABLE_SIZE; i++) {
diff --git a/net/ipv6/inet6_hashtables.c b/net/ipv6/inet6_hashtables.c
index 1c2c276..d6f1026 100644
--- a/net/ipv6/inet6_hashtables.c
+++ b/net/ipv6/inet6_hashtables.c
@@ -261,7 +261,7 @@ int inet6_hash_connect(struct inet_timewait_death_row 
*death_row,
                struct inet_timewait_sock *tw = NULL;
 
                inet_get_local_port_range(&low, &high);
-               remaining = high - low;
+               remaining = (high - low) + 1;
 
                local_bh_disable();
                for (i = 1; i <= remaining; i++) {
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to