Apply by doing:
	cd /usr/src
	patch -p0 < 016_approval.patch

And then rebuild and install rshd, rexecd and atrun:
	cd libexec/rshd
	make obj
	make depend
	make && make install

	cd ../rexecd
	make obj
	make depend
	make && make install

	cd ../atrun
	make obj
	make depend
	make && make install

Index: libexec/atrun/atrun.c
===================================================================
RCS file: /cvs/src/libexec/atrun/atrun.c,v
retrieving revision 1.15
retrieving revision 1.15.2.1
diff -u -r1.15 -r1.15.2.1
--- libexec/atrun/atrun.c	27 Aug 2001 16:18:58 -0000	1.15
+++ libexec/atrun/atrun.c	19 Mar 2002 04:28:22 -0000	1.15.2.1
@@ -134,6 +134,7 @@
 	uid_t nuid;
 	gid_t ngid;
 	login_cap_t *lc;
+	auth_session_t *as;
 
 	PRIV_START
 
@@ -160,6 +161,13 @@
 		    uid, filename);
 		exit(EXIT_FAILURE);
 	}
+
+	as = auth_open();
+	if (as == NULL || auth_setpwd(as, pw) != 0) {
+		syslog(LOG_ERR,"Unable to allocate memory - aborting job %s",
+		    filename);
+		exit(EXIT_FAILURE);
+	}
 	PRIV_START
 
 	stream = fopen(filename, "r");
@@ -307,9 +315,10 @@
 		if (setusercontext(lc, pw, pw->pw_uid, LOGIN_SETALL) < 0)
 			perr("Cannot set user context");
 
-		if (auth_approval(NULL, lc, pw->pw_name, "at") <= 0)
+		if (auth_approval(as, lc, pw->pw_name, "at") <= 0)
 			perr2("Approval failure for ", pw->pw_name);
 
+		auth_close(as);
 		login_close(lc);
 
 		if (chdir(pw->pw_dir) < 0)
Index: libexec/rexecd/rexecd.c
===================================================================
RCS file: /cvs/src/libexec/rexecd/rexecd.c,v
retrieving revision 1.18
retrieving revision 1.18.2.1
diff -u -r1.18 -r1.18.2.1
--- libexec/rexecd/rexecd.c	9 Jul 2001 07:04:44 -0000	1.18
+++ libexec/rexecd/rexecd.c	19 Mar 2002 04:28:22 -0000	1.18.2.1
@@ -73,7 +73,6 @@
 char	*remote;
 char	*envinit[1];
 extern char **environ;
-login_cap_t *lc;
 
 struct	sockaddr_in asin = { AF_INET };
 
@@ -108,6 +107,10 @@
 	hp = gethostbyaddr((char *) &from.sin_addr, sizeof(from.sin_addr),
 	    from.sin_family);
 	remote = strdup(hp ? hp->h_name : inet_ntoa(from.sin_addr));
+	if (remote == NULL) {
+		(void)fprintf(stderr, "rexecd: strdup: %s\n", strerror(errno));
+		exit(1);
+	}
 
 	doit(0, &from);
 	exit(0);
@@ -128,6 +131,8 @@
 	char buf[BUFSIZ], sig;
 	int one = 1;
 	int maxfd;
+	login_cap_t *lc;
+	auth_session_t *as;
 
 	(void) signal(SIGINT, SIG_DFL);
 	(void) signal(SIGQUIT, SIG_DFL);
@@ -168,6 +173,11 @@
 		error("Login class incorrect.\n");
 		exit(1);
 	}
+	as = auth_open();
+	if (as == NULL || auth_setpwd(as, pwd) != 0) {
+		error("Unable to allocate memory.\n");
+		exit(1);
+	}
 	endpwent();
 	if (pwd->pw_uid)
 		auth_checknologin(lc);
@@ -274,8 +284,10 @@
 		err(1, "unable to setup environment");
 	if (setusercontext(lc, pwd, pwd->pw_uid, LOGIN_SETALL))
 		err(1, "unable to set user context");
-	if (auth_approval(NULL, lc, pwd->pw_name, "rexec") <= 0)
+	if (auth_approval(as, lc, pwd->pw_name, "rexec") <= 0)
 		err(1, "approval failure");
+	auth_close(as);
+	login_close(lc);
 
 	cp = strrchr(pwd->pw_shell, '/');
 	if (cp)
Index: libexec/rshd/rshd.c
===================================================================
RCS file: /cvs/src/libexec/rshd/rshd.c,v
retrieving revision 1.40
retrieving revision 1.40.2.1
diff -u -r1.40 -r1.40.2.1
--- libexec/rshd/rshd.c	5 Sep 2001 22:32:36 -0000	1.40
+++ libexec/rshd/rshd.c	19 Mar 2002 04:28:22 -0000	1.40.2.1
@@ -225,6 +225,7 @@
 	char saddr[NI_MAXHOST];
 	char raddr[NI_MAXHOST];
 	char pbuf[NI_MAXSERV];
+	auth_session_t *as;
 #ifdef NI_WITHSCOPEID
 	const int niflags = NI_NUMERICHOST | NI_NUMERICSERV | NI_WITHSCOPEID;
 #else
@@ -494,6 +495,15 @@
 			errorstr = "Login incorrect.\n";
 		goto fail;
 	}
+	as = auth_open();
+	if (as == NULL || auth_setpwd(as, pwd) != 0) {
+		syslog(LOG_INFO|LOG_AUTH,
+		    "%s@%s as %s: unable to allocate memory. cmd='%.80s'",
+		    remuser, hostname, locuser, cmdbuf);
+		if (errorstr == NULL)
+			errorstr = "Cannot allocate memory.\n";
+		goto fail;
+	}
 
 	setegid(pwd->pw_gid);
 	seteuid(pwd->pw_uid);
@@ -730,8 +740,10 @@
 
 	if (setusercontext(lc, pwd, pwd->pw_uid, LOGIN_SETALL))
 		errx(1, "cannot set user context");
-	if (auth_approval(NULL, lc, pwd->pw_name, "rsh") <= 0)
+	if (auth_approval(as, lc, pwd->pw_name, "rsh") <= 0)
 		errx(1, "approval failure");
+	auth_close(as);
+	login_close(lc);
 
 	cp = strrchr(pwd->pw_shell, '/');
 	if (cp)
