Broadcast RPC bug (SunRPC 3.9, 4.3bsd) +FIX

Jonathan jonathan at comp.vuw.ac.nz
Sun Sep 4 13:22:01 AEST 1988


Symptom:
	Any calls to clnt_broadcast() fail on 4.3bsd with error
	message "Cannot send broadcast packet: Permission denied",
	even for the super-user.

	On Pyramid OSx 4.0, clnt_broadcast() succeeds, but
	no broadcast UDP packet leaves the local machine.

Repeat_By:
	The broadcast RPC example from the manual is
	probably sufficient.

Diagnosis:
	On 4.3bsd systems, a socket must be setsockopt()'ed
	SO_BROADCAST before it can be used for broadcast.
	SunRPC 3.9 doesn't, causing sendto() to return EACCESS.
	
Fix:
	For 4.3bsd systems, apply the following context diff.

	It can easily be made applicable to other 4.3bsd-derived
	systems (eg, OSx 4.0), if you are prepared to replace the
	vendor's definition of clnt_broadcast() with the patched
	SunRPC 3.9 source.

	I don't know what the effect on non-bsd systems is.
*** pmap_rmt.c	Sun Sep  4 14:29:24 1988
--- pmap_rmt.bsdfix.c	Sun Sep  4 14:28:11 1988
***************
*** 52,57 ****
--- 52,59 ----
  #include <arpa/inet.h>
  #define MAX_BROADCAST_SIZE 1400
  
+ #include <sys/param.h>
+ 
  extern int errno;
  static struct timeval timeout = { 3, 0 };
  
***************
*** 241,246 ****
--- 243,249 ----
  	struct rpc_msg msg;
  	struct timeval t; 
  	char outbuf[MAX_BROADCAST_SIZE], inbuf[UDPMSGSIZE];
+ 	int brdcst_enbl =1;
  
  	/*
  	 * initialization: create a socket, a broadcast address, and
***************
*** 262,267 ****
--- 265,279 ----
  	baddr.sin_family = AF_INET;
  	baddr.sin_port = htons(PMAPPORT);
  	baddr.sin_addr.s_addr = htonl(INADDR_ANY);
+ 
+ #ifdef BSD4_3
+ 	if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &brdcst_enbl, sizeof (brdcst_enbl)) < 0) {
+ 		perror("Broadcast authorization problem");
+ 		stat = RPC_CANTSEND;
+ 		goto done_broad;
+ 	}
+ #endif BSD4_3
+ 
  /*	baddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); */
  	(void)gettimeofday(&t, (struct timezone *)0);
  	msg.rm_xid = xid = getpid() ^ t.tv_sec ^ t.tv_usec;

-- 
-----------------------------------------------------------------------------
sane mailers: jonathan at comp.vuw.ac.nz |    Industrial democracy:
UUCP path: ...!uunet!vuwcomp!jonathan |           One factory, one vode!



More information about the Comp.sources.bugs mailing list