Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 22 Aug 1998 10:20:46 GMT
From:      Luigi Rizzo <luigi@prova.iet.unipi.it>
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   kern/7713: problem with reusing ports with multicast
Message-ID:  <199808221020.KAA00468@prova.iet.unipi.it>

next in thread | raw e-mail | index | archive | help

>Number:         7713
>Category:       kern
>Synopsis:       problem with reusing ports with multicast
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:
>Keywords:
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sat Aug 22 03:20:01 PDT 1998
>Last-Modified:
>Originator:     Luigi Rizzo
>Organization:
DEIT
>Release:        FreeBSD 2.2.7-RELEASE i386
>Environment:

	all versions starting at least from 2.2.6, with
	multicast enabled.

>Description:

some time ago, presumably importing a fix from netbsd, a fix was
applied to the FreeBSD networking code that prevented a process to
reuse the same port unless it was the same uid as the previous owner,
or it was superuser.

While this might make some sense for unicast, it makes absolutely
no sense for multicast where multiple receivers for the same data are
the normal way of operation. It is actually harmful since e.g. it
prevents multiple sdr sessions being run from different users on the
same machine.

The following diff fixes the problem. Would you mind looking at it and
possibly committing it ?

>How-To-Repeat:

    try run multiple instances of sdr (or other multicast receivers,
    e.g. vic i think) as different non-root users on the same machine.

>Fix:
	
diff -ubwr /usr/CVS-luigi-checkout/src/sys/netinet/in_pcb.c /mnt/src/sys/netinet.luigi/in_pcb.c
--- /usr/CVS-luigi-checkout/src/sys/netinet/in_pcb.c	Mon Mar  2 07:58:17 1998
+++ /mnt/src/sys/netinet.luigi/in_pcb.c	Mon Jun  1 08:36:58 1998
@@ -190,7 +190,8 @@
 			if (ntohs(lport) < IPPORT_RESERVED &&
 			    (error = suser(p->p_ucred, &p->p_acflag)))
 				return (EACCES);
-			if (so->so_uid) {
+			if (so->so_uid &&
+			    !IN_MULTICAST(ntohl(sin->sin_addr.s_addr)) ) {
 				t = in_pcblookup(inp->inp_pcbinfo, zeroin_addr,
 				    0, sin->sin_addr, lport,
 				    INPLOOKUP_WILDCARD);

>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199808221020.KAA00468>