Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Jan 1996 21:31:06 -0500
From:      John Capo <jc@irbs.com>
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/981: clnt_broadcast() is not aware of aliases
Message-ID:  <199601310231.VAA19105@goombay.irbs.com>
Resent-Message-ID: <199601310240.SAA03737@freefall.freebsd.org>

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

>Number:         981
>Category:       bin
>Synopsis:       clnt_broadcast() is not aware of aliases
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Jan 30 18:40:10 PST 1996
>Last-Modified:
>Originator:     John Capo
>Organization:
IRBS Engineering
>Release:        FreeBSD 2.1-STABLE i386
>Environment:

-stable and probably -current.

>Description:

clnt_broadcast() sends a broadcast packet for each aliased address
on an interface.

>How-To-Repeat:

Run ypbind on a system with an Ethernet if that has alias addresses.

>Fix:
	
*** lib/libc/rpc/pmap_rmt.c.orig	Tue May 30 01:41:27 1995
--- lib/libc/rpc/pmap_rmt.c	Tue Jan 30 20:20:55 1996
***************
*** 166,171 ****
--- 166,172 ----
  	int sock;  /* any valid socket will do */
  	char *buf;  /* why allocxate more when we can use existing... */
  {
+ 	struct in_addr addr;
  	struct ifconf ifc;
          struct ifreq ifreq, *ifr;
  	struct sockaddr_in *sin;
***************
*** 196,208 ****
  			sin = (struct sockaddr_in *)&ifr->ifr_addr;
  #ifdef SIOCGIFBRDADDR   /* 4.3BSD */
  			if (ioctl(sock, SIOCGIFBRDADDR, (char *)&ifreq) < 0) {
! 				addrs[i++] =
! 				    inet_makeaddr(inet_netof(sin->sin_addr),
  				    INADDR_ANY);
  			} else {
! 				addrs[i++] = ((struct sockaddr_in*)
  				  &ifreq.ifr_addr)->sin_addr;
  			}
  #else /* 4.2 BSD */
  			addrs[i++] = inet_makeaddr(inet_netof(sin->sin_addr),
  			    INADDR_ANY);
--- 197,216 ----
  			sin = (struct sockaddr_in *)&ifr->ifr_addr;
  #ifdef SIOCGIFBRDADDR   /* 4.3BSD */
  			if (ioctl(sock, SIOCGIFBRDADDR, (char *)&ifreq) < 0) {
! 				addr = inet_makeaddr(inet_netof(sin->sin_addr),
  				    INADDR_ANY);
  			} else {
! 				addr = ((struct sockaddr_in*)
  				  &ifreq.ifr_addr)->sin_addr;
  			}
+ 
+ 			for (n = 0; n < i; n++) {
+ 				if (memcmp(&addrs[n], &addr, sizeof (addr)) == 0)
+ 					goto duplicate;
+ 
+ 			}
+ 			addrs[i++] = addr;
+ duplicate:
  #else /* 4.2 BSD */
  			addrs[i++] = inet_makeaddr(inet_netof(sin->sin_addr),
  			    INADDR_ANY);

>Audit-Trail:
>Unformatted:



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