freebsd-skq/lib/libc/rpc
Bill Paul 4c45fb08aa Correct a bug in the 'allow arbitrary number of socket descriptors' changes
made to the RPC code some months ago. The value of __svc_fdsetsize is being
calculated incorrectly.

Logically, one would assume that __svc_fdsetsize is being used as a
substitute for FD_SETSIZE, with the difference being that __svc_fdsetsize
can be expanded on the fly to accomodate more descriptors if need be.
There are two problems: first, __svc_fdsetsize is not initialized to 0.
Second, __svc_fdsetsize is being calculated in svc.c:xprt_registere() as:

                __svc_fdsetsize = howmany(sock+1, NFDBITS);

This is wrong. If we are adding a socket with index value 4 to the
descriptor set, then __svc_fdsetsize will be 1 (since fds_bits is
an unsigned long, it can support any descriptor from 0 to 31, so we
only need one of them). In order for this to make sense with the
rest of the code though, it should be:

                __svc_fdsetsize = howmany(sock+1, NFDBITS) * NFDBITS;

Now if sock == 4, __svc_fdsetsize will be 32.

This bug causes 2 errors to occur. First, in xprt_register(), it
causes the __svc_fdset descriptor array to be freed and reallocated
unnecessarily. The code checks if it needs to expand the array using
the test: if (sock + 1 > __svc_fdsetsize). The very first time through,
__svc_fdsetsize is 0, which is fine: an array has to be allocated the
first time out. However __svc_fdsetsize is incorrectly set to 1, so
on the second time through, the test (sock + 1 > __svc_fdsetsize)
will still succeed, and the __svc_fdset array will be destroyed and
reallocated for no reason.

Second, the code in svc_run.c:svc_run() can become hopelessly confused.
The svc_run() routine malloc()s its own fd_set array using the value
of __svc_fdsetsize to decide how much memory to allocate. Once the
xprt_register() function expands the __svc_fdset array the first time,
the value for __svc_fdsetsize becomes 2, which is too small: the resulting
calculation causes the code to allocate an array that's only 32 bits wide
when it actually needs 64 bits. It also uses the valuse of __svc_fdsetsize
when copying the contents of the __svc_fdset array into the new array.
The end result is that all but the first 32 file descriptors get lost.

Note: from what I can tell, this bug originated in OpenBSD and was
brought over to us when the code was merged. The bug is still there
in the OpenBSD source.

Total nervous breakdown averted by: Electric Fence 2.0.5
1997-10-14 21:50:17 +00:00
..
PSD.doc Add Sun RPC documentation, which should eventually go into our PSD. 1994-08-07 18:46:28 +00:00
auth_des.c Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
auth_none.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
auth_time.c Remember to zero sockaddr_in struct before calling uaddr_to_sockaddr() to 1997-06-15 21:03:32 +00:00
auth_unix.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
authdes_prot.c Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
authunix_prot.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
bindresvport.3 Show the real revision date and not the date that this 1997-06-23 04:03:49 +00:00
bindresvport.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
clnt_generic.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
clnt_perror.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
clnt_raw.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
clnt_simple.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
clnt_tcp.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
clnt_udp.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
clnt_unix.c Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
crypt_client.c Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
des_crypt.3 Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
des_crypt.c Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
des_soft.c Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
DISCLAIMER This commit was manufactured by cvs2svn to create branch 'WPAUL'. 1996-01-12 07:03:35 +00:00
get_myaddress.c Make selection logic more strict. Only select AF_INET loopback interfaces 1997-09-21 23:04:51 +00:00
getpublickey.c Add a stub version of getpublickey(), in order to eliminate an 1997-08-28 21:50:33 +00:00
getrpcent.3 Show the real revision date and not the date that this 1997-06-23 04:03:49 +00:00
getrpcent.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
getrpcport.3 Show the real revision date and not the date that this 1997-06-23 04:03:49 +00:00
getrpcport.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
key_call.c Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
key_prot_xdr.c Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
Makefile.inc Add a stub version of getpublickey(), in order to eliminate an 1997-08-28 21:50:33 +00:00
netname.c Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
netnamer.c getnetid() crashes if no /etc/netid file is present (it tries to fclose() 1997-06-12 18:42:43 +00:00
pmap_clnt.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
pmap_getmaps.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
pmap_getport.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
pmap_prot2.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
pmap_prot.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
pmap_rmt.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
publickey.3 Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
publickey.5 Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
README This commit was manufactured by cvs2svn to create branch 'WPAUL'. 1996-01-12 07:03:35 +00:00
rpc_callmsg.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
rpc_commondata.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
rpc_dtablesize.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
rpc_prot.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
rpc_secure.3 Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
rpc.3 Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
rpc.5 Show the real revision date and not the date that this 1997-06-23 04:03:49 +00:00
rpcdname.c Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
rstat_svc.8 Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
rstat.1 Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
rtime.3 Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
rtime.c Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
svc_auth_des.c Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
svc_auth_unix.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
svc_auth.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
svc_raw.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
svc_run.c Fix other small things that got lost in the merge: 1997-05-28 16:38:35 +00:00
svc_simple.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
svc_tcp.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
svc_udp.c Resolve conflicts. 1997-05-28 05:05:31 +00:00
svc_unix.c Now the biggest step: import the changes to the main RPC code. 1997-05-28 05:00:11 +00:00
svc.c Correct a bug in the 'allow arbitrary number of socket descriptors' changes 1997-10-14 21:50:17 +00:00

RPCSRC 4.0 7/11/89

This distribution contains Sun Microsystem's implementation of the
RPC and XDR protocols and is compatible with 4.2BSD and 4.3BSD.  Also
included is complete documentation, utilities, RPC service
specification files, and demonstration services in the format used by
the RPC protocol compiler (rpcgen).  See WHAT'S NEW below for
details.

NOTE ABOUT SECURE RPC:

This release of RPCSRC contains most of the code needed to implement
Secure RPC (see "DES Authentication" in the RPC Protocol Specification,
doc/rpc.rfc.ms).  Due to legal considerations, we are unable to
distribute an implementation of DES, the Data Encryption Standard, which
Secure RPC requires.  For this reason, all of the files, documentation, and
programs associated with Secure RPC have been placed into a separate
directory, secure_rpc.  The RPC library contained in the main body of this
release *DOES NOT* support Secure RPC.  See secure_rpc/README for more
details.  (A DES library was posted in Volume 18 of comp.sources.unix.)

If you wish to report bugs found in this release, send mail to:

Portable ONC/NFS
Sun Microsystems, Inc
MS 12-33
2550 Garcia Avenue
Mountain View, CA  94043

or send Email to nfsnet@sun.com (the Internet) or sun!nfsnet (Usenet).

ROADMAP

The directory hierarchy is as follows:

    demo/       Various demonstration services
    demo/dir        Remote directory lister
    demo/msg        Remote console message delivery service
    demo/sort       Remote sort service

    doc/        Documentation for RPC, XDR and NFS in "-ms" format.

    etc/        Utilities (rpcinfo and portmap).  portmap must be
                started by root before any other RPC network services are
                used.  SEE BELOW FOR BUGFIX TO 4.3BSD COMPILER.

    man/        Manual pages for RPC library, rpcgen, and utilities.

    rpc/        The RPC and XDR library.  SEE BELOW
                FOR BUGFIX TO 4.2BSD COMPILER.

    rpcgen/     The RPC Language compiler (for .x files)

    rpcsvc/     Service definition files for various services and the
                server and client code for the Remote Status service.

    secure_rpc/ The files in this directory are used to build a version of
                the RPC library with DES Authentication.  See the README
                file in that directory for more details.

BUILD INSTRUCTIONS

Makefiles can be found in all directories except for man.  The
Makefile in the top directory will cause these others to be invoked
(except for in the doc, man and demo directories), in turn building the
entire release.

WARNING!  THE DEFAULT INSTALLATION PROCEDURES WILL INSTALL FILES
IN /usr/include, /usr/lib, /usr/bin and /etc.

The master RPC include file, rpc/rpc.h, is used by all programs and
routines that use RPC.  It includes other RPC and system include files
needed by the RPC system.  PLEASE NOTE: If your system has NFS, it
may have been based on Sun's NFS Source.  The include files installed
by this package may duplicate include files you will find on your NFS
system.  The RPCSRC 4.0 include files are upwardly compatible to all
NFS Source include files as of the date of this distribution (not
including any new definitions or declarations added by your system
vendor).  HOWEVER: Please read the comments towards the end of
rpc/rpc.h regarding rpc/netdb.h.  You may need to uncomment the
inclusion of that file if the structures it defines are already
defined by your system's include files.

After making any compiler fixes that are needed (see below), at
the top directory, type:

    make install

For all installations, the Makefile macro DESTDIR is prepended to the
installation path.  It is defined to be null in the Makefiles, so
installations are relative to root.  (You will probably need root
privileges for installing the files under the default path.)  To
install the files under some other tree (e.g., /usr/local), use the
command:

    make install DESTDIR=/usr/local

This will place the include files in /usr/local/usr/include, the RPC
library in /usr/local/usr/lib, rpcgen in /usr/local/usr/bin, and the
utilities in /usr/local/etc.  You'll have to edit the Makefiles or
install the files by hand if you want to do anything other than this
kind of relocation of the installation tree.

The RPC library will be built and installed first.  By default it is
installed in /usr/lib as "librpclib.a".  The directory
/usr/include/rpc will also be created, and several header files will
be installed there.  ALL RPC SERVICES INCLUDE THESE HEADER FILES.

The programs in etc/ link in routines from librpclib.a.  If you change
where it is installed, be sure to edit etc/'s Makefile to reflect this.
These programs are installed in /etc.  PORTMAP MUST BE RUNNING ON
YOUR SYSTEM BEFORE YOU START ANY OTHER RPC SERVICE.

rpcgen is installed in /usr/bin.  This program is required to build
the demonstration services in demo and the rstat client and server in
rpcsvc/.

The rpcsvc/ directory will install its files in the directory
/usr/include/rpcsvc.  The Remote Status service (rstat_svc) will be
compiled and installed in /etc.  If you wish to make this service
available, you should either start this service when needed or have
it started at boot time by invoking it in your /etc/rc.local script.
(Be sure that portmap is started first!)  Sun has modified its
version of inetd to automatically start RPC services.  (Use "make
LIB=" when building rstat on a Sun Workstation.)  The Remote Status
client (rstat) will be installed in /usr/bin.  This program queries
the rstat_svc on a remote host and prints a system status summary
similar to the one printed by "uptime".

The documentation is not built during the "make install" command.
Typing "make" in the doc directory will cause all of the manuals to
be formatted using nroff into a single file.  We have had a report
that certain "troff" equivalents have trouble processing the full
manual.  If you have trouble, try building the manuals individually
(see the Makefile).

The demonstration services in the demo directory are not built by the
top-level "make install" command.  To build these, cd to the demo
directory and enter "make".  The three services will be built.
RPCGEN MUST BE INSTALLED in a path that make can find.  To run the
services, start the portmap program as root and invoke the service
(you probably will want to put it in the background).  rpcinfo can be
used to check that the service succeeded in getting registered with
portmap, and to ping the service (see rpcinfo's man page).  You can
then use the corresponding client program to exercise the service.
To build these services on a Sun workstation, you must prevent the
Makefile from trying to link the RPC library (as these routines are
already a part of Sun's libc).  Use: "make LIB=".

BUGFIX FOR 4.3BSD COMPILER

The use of a 'void *' declaration for one of the arguments in
the reply_proc() procedure in etc/rpcinfo.c will trigger a bug
in the 4.3BSD compiler.  The bug is fixed by the following change to
the compiler file mip/manifest.h:

*** manifest.h.r1.1	Thu Apr 30 13:52:25 1987
--- manifest.h.r1.2	Mon Nov 23 18:58:17 1987
***************
*** 21,27 ****
  /*
   * Bogus type values
   */
! #define TNULL	PTR		/* pointer to UNDEF */
  #define TVOID	FTN		/* function returning UNDEF (for void) */
  
  /*
--- 21,27 ----
  /*
   * Bogus type values
   */
! #define TNULL	INCREF(MOETY)	/* pointer to MOETY -- impossible type */
  #define TVOID	FTN		/* function returning UNDEF (for void) */
  
  /*

If you cannot fix your compiler, change the declaration in reply_proc()
from 'void *' to 'char *'.

BUGFIX FOR 4.2BSD COMPILER

Unpatched 4.2BSD compilers complain about valid C.  You can make old
compilers happy by changing some voids to ints.  However, the fix to
the 4.2 VAX compiler is as follows (to mip/trees.c):

*** trees.c.r1.1	Mon May 11 13:47:58 1987
--- trees.c.r1.2	Wed Jul  2 18:28:52 1986
***************
*** 1247,1253 ****
  		if(o==CAST && mt1==0)return(TYPL+TYMATCH);
  		if( mt12 & MDBI ) return( TYPL+LVAL+TYMATCH );
  		else if( (mt1&MENU)||(mt2&MENU) ) return( LVAL+NCVT+TYPL+PTMATCH+PUN );
! 		else if( mt12 == 0 ) break;
  		else if( mt1 & MPTR ) return( LVAL+PTMATCH+PUN );
  		else if( mt12 & MPTI ) return( TYPL+LVAL+TYMATCH+PUN );
  		break;
--- 1261,1269 ----
  		if(o==CAST && mt1==0)return(TYPL+TYMATCH);
  		if( mt12 & MDBI ) return( TYPL+LVAL+TYMATCH );
  		else if( (mt1&MENU)||(mt2&MENU) ) return( LVAL+NCVT+TYPL+PTMATCH+PUN );
! 		/* if right is TVOID and looks like a CALL, is not ok */
! 		else if (mt2 == 0 && (p->in.right->in.op == CALL || p->in.right->in.op == UNARY CALL))
! 			break;
  		else if( mt1 & MPTR ) return( LVAL+PTMATCH+PUN );
  		else if( mt12 & MPTI ) return( TYPL+LVAL+TYMATCH+PUN );
  		break;

WHAT'S NEW IN THIS RELEASE: RPCSRC 4.0

The previous release was RPCSRC 3.9.  As with all previous releases,
this release is based directly on files from Sun Microsystem's
implementation.

Upgrade from RPCSRC 3.9

1)  RPCSRC 4.0 upgrades RPCSRC 3.9.  Improvements from SunOS 4.0 have
    been integrated into this release.

Secure RPC (in the secure_rpc/ directory)

2)  DES Authentication routines and programs are provided.
3)  A new manual, "Secure NFS" is provided, which describes Secure RPC
    and Secure NFS.
4)  Skeleton routines and manual pages are provided which describe the
    DES encryption procedures required by Secure RPC.  HOWEVER, NO DES
    ROUTINE IS PROVIDED.

New Functionality

5)  rpcinfo can now be used to de-register services from the portmapper
    which may have terminated abnormally.
6)  A new client, rstat, is provided which queries the rstat_svc and
    prints a status line similar to the one displayed by "uptime".