mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
[TCP/DCCP]: Randomize port selection
This patch randomizes the port selected on bind() for connections to help with possible security attacks. It should also be faster in most cases because there is no need for a global lock. Signed-off-by: Stephen Hemminger <[email protected]> Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
This commit is contained in:
parent
6151b31c96
commit
6df716340d
6 changed files with 10 additions and 56 deletions
|
|
@ -114,16 +114,9 @@ static int tcp_v6_get_port(struct sock *sk, unsigned short snum)
|
|||
int low = sysctl_local_port_range[0];
|
||||
int high = sysctl_local_port_range[1];
|
||||
int remaining = (high - low) + 1;
|
||||
int rover;
|
||||
int rover = net_random() % (high - low) + low;
|
||||
|
||||
spin_lock(&tcp_hashinfo.portalloc_lock);
|
||||
if (tcp_hashinfo.port_rover < low)
|
||||
rover = low;
|
||||
else
|
||||
rover = tcp_hashinfo.port_rover;
|
||||
do { rover++;
|
||||
if (rover > high)
|
||||
rover = low;
|
||||
do {
|
||||
head = &tcp_hashinfo.bhash[inet_bhashfn(rover, tcp_hashinfo.bhash_size)];
|
||||
spin_lock(&head->lock);
|
||||
inet_bind_bucket_for_each(tb, node, &head->chain)
|
||||
|
|
@ -132,9 +125,9 @@ static int tcp_v6_get_port(struct sock *sk, unsigned short snum)
|
|||
break;
|
||||
next:
|
||||
spin_unlock(&head->lock);
|
||||
if (++rover > high)
|
||||
rover = low;
|
||||
} while (--remaining > 0);
|
||||
tcp_hashinfo.port_rover = rover;
|
||||
spin_unlock(&tcp_hashinfo.portalloc_lock);
|
||||
|
||||
/* Exhausted local port range during search? It is not
|
||||
* possible for us to be holding one of the bind hash
|
||||
|
|
|
|||
Loading…
Reference in a new issue