Ephemeral port selection (patch)
Rui Paulo
rpaulo at fnop.net
Wed Feb 27 21:14:58 UTC 2008
On Mon, Feb 25, 2008 at 8:16 AM, Fernando Gont <fernando at gont.com.ar> wrote:
> Folks,
>
> This patch simply eliminates duplicated code in the in_pcb_bind() function.
>
> Index: in_pcb.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/netinet/in_pcb.c,v
> retrieving revision 1.198
> diff -u -r1.198 in_pcb.c
> --- in_pcb.c 22 Dec 2007 10:06:11 -0000 1.198
> +++ in_pcb.c 25 Feb 2008 06:10:04 -0000
> @@ -393,7 +393,7 @@
> if (*lportp != 0)
> lport = *lportp;
> if (lport == 0) {
> - u_short first, last;
> + u_short first, last, aux;
> int count;
>
> if (laddr.s_addr != INADDR_ANY)
> @@ -440,47 +440,28 @@
> /*
> * Simple check to ensure all ports are not used up causing
> * a deadlock here.
> - *
> - * We split the two cases (up and down) so that the direction
> - * is not being tested on each round of the loop.
> */
> if (first > last) {
> - /*
> - * counting down
> - */
> - if (dorandom)
> - *lastport = first -
> - (arc4random() % (first - last));
> - count = first - last;
> -
> - do {
> - if (count-- < 0) /* completely used? */
> - return (EADDRNOTAVAIL);
> - --*lastport;
> - if (*lastport > first || *lastport < last)
> - *lastport = first;
> - lport = htons(*lastport);
> - } while (in_pcblookup_local(pcbinfo, laddr, lport,
> - wild));
> - } else {
> - /*
> - * counting up
> - */
> - if (dorandom)
> - *lastport = first +
> - (arc4random() % (last - first));
> - count = last - first;
> -
> - do {
> - if (count-- < 0) /* completely used? */
> - return (EADDRNOTAVAIL);
> - ++*lastport;
> - if (*lastport < first || *lastport > last)
> - *lastport = first;
> - lport = htons(*lastport);
> - } while (in_pcblookup_local(pcbinfo, laddr, lport,
> - wild));
> + aux = first;
> + first = last;
> + last = aux;
> }
> +
> + if (dorandom)
> + *lastport = first +
> + (arc4random() % (last - first));
> +
> + count = last - first;
> +
> + do {
> + if (count-- < 0) /* completely used? */
> + return (EADDRNOTAVAIL);
> + ++*lastport;
> + if (*lastport < first || *lastport > last)
> + *lastport = first;
> + lport = htons(*lastport);
> + } while (in_pcblookup_local(pcbinfo, laddr, lport,
> + wild));
> }
> if (prison_ip(cred, 0, &laddr.s_addr))
> return (EINVAL);
>
>
> --
> Fernando Gont
> e-mail: fernando at gont.com.ar || fgont at acm.org
> PGP Fingerprint: 7809 84F5 322E 45C7 F1C9 3945 96EE A9EF D076 FFF1
>
>
Yeah, you're right. I'll try to commit this.
Regards.
--
Rui Paulo
More information about the freebsd-net
mailing list