[libtirpc] Updated to latest upstream RC release: libtirpc-0.2.3-rc3

Steve Dickson steved at fedoraproject.org
Thu Apr 26 20:10:40 UTC 2012


commit d1e6fefd836acd11a67ea0c19ee48a2de48b9384
Author: Steve Dickson <steved at redhat.com>
Date:   Thu Apr 26 16:09:22 2012 -0400

    Updated to latest upstream RC release: libtirpc-0.2.3-rc3
    
    Signed-off-by: Steve Dickson <steved at redhat.com>

 .gitignore                         |    2 +
 libtirpc-0.2.2-doc-Makefile.patch  |   21 -
 libtirpc-0.2.2-wrap-segfault.patch |   28 -
 libtirpc-0.2.3-rc3.patch           | 1312 ++++++++++++++++++++++++++++++++++++
 libtirpc.spec                      |   13 +-
 5 files changed, 1320 insertions(+), 56 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index c69dfdb..4e57c88 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
 cscope*
 /libtirpc-0.2.2.tar.bz2
+libtirpc-0.2.2/
+x86_64/
diff --git a/libtirpc-0.2.3-rc3.patch b/libtirpc-0.2.3-rc3.patch
new file mode 100644
index 0000000..1457718
--- /dev/null
+++ b/libtirpc-0.2.3-rc3.patch
@@ -0,0 +1,1312 @@
+diff --git a/configure.ac b/configure.ac
+index 97c6f2c..7ff80a4 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -23,6 +23,7 @@ AC_HEADER_DIRENT
+ AC_PREFIX_DEFAULT(/usr)
+ AC_CHECK_HEADERS([arpa/inet.h fcntl.h libintl.h limits.h locale.h netdb.h netinet/in.h stddef.h stdint.h stdlib.h string.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h syslog.h unistd.h])
+ AC_CHECK_LIB([pthread], [pthread_create])
++AC_CHECK_LIB([nsl], [yp_get_default_domain])
+ 
+ 
+ AC_CONFIG_FILES([Makefile src/Makefile man/Makefile doc/Makefile])
+diff --git a/doc/Makefile.am b/doc/Makefile.am
+index cc4fa76..f8c88b5 100644
+--- a/doc/Makefile.am
++++ b/doc/Makefile.am
+@@ -1,5 +1,5 @@
+ 
+ install: install-am
+-	$(mkinstalldirs) $(DESTDIR)/etc
+-	cp -p ./etc_netconfig $(DESTDIR)/etc/netconfig
+-	chmod 0644 $(DESTDIR)/etc/netconfig
++	$(mkinstalldirs) $(DESTDIR)/$(sysconfdir)
++	cp -p ./etc_netconfig $(DESTDIR)/$(sysconfdir)/netconfig
++	chmod 0644 $(DESTDIR)/$(sysconfdir)/netconfig
+diff --git a/src/Makefile.am b/src/Makefile.am
+index 7ee8cbc..66350f5 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -40,7 +40,7 @@ lib_LTLIBRARIES = libtirpc.la
+ # release number of your package. This is an abuse that only fosters
+ # misunderstanding of the purpose of library versions."
+ #
+-libtirpc_la_LDFLAGS = -lnsl -lpthread -version-info 1:10:0
++libtirpc_la_LDFLAGS = -lpthread -version-info 1:10:0
+ 
+ libtirpc_la_SOURCES = auth_none.c auth_unix.c authunix_prot.c bindresvport.c clnt_bcast.c \
+         clnt_dg.c clnt_generic.c clnt_perror.c clnt_raw.c clnt_simple.c \
+@@ -48,17 +48,16 @@ libtirpc_la_SOURCES = auth_none.c auth_unix.c authunix_prot.c bindresvport.c cln
+         getrpcport.c mt_misc.c pmap_clnt.c pmap_getmaps.c pmap_getport.c \
+         pmap_prot.c pmap_prot2.c pmap_rmt.c rpc_prot.c rpc_commondata.c \
+         rpc_callmsg.c rpc_generic.c rpc_soc.c rpcb_clnt.c rpcb_prot.c \
+-        rpcb_st_xdr.c svc.c svc_auth.c svc_dg.c svc_auth_unix.c svc_generic.c \
+-        svc_raw.c svc_run.c svc_simple.c svc_vc.c getpeereid.c \
+-        auth_time.c auth_des.c authdes_prot.c des_crypt.c
++        rpcb_st_xdr.c svc.c svc_auth.c svc_dg.c svc_auth_unix.c svc_auth_none.c \
++        svc_generic.c svc_raw.c svc_run.c svc_simple.c svc_vc.c getpeereid.c \
++        auth_time.c auth_des.c authdes_prot.c
+ 
+ ## XDR
+ libtirpc_la_SOURCES += xdr.c xdr_rec.c xdr_array.c xdr_float.c xdr_mem.c xdr_reference.c xdr_stdio.c
+ 
+ ## Secure-RPC
+ if GSS
+-    libtirpc_la_SOURCES += auth_gss.c authgss_prot.c svc_auth_gss.c \
+-		svc_auth_none.c
++    libtirpc_la_SOURCES += auth_gss.c authgss_prot.c svc_auth_gss.c
+     libtirpc_la_LDFLAGS += $(GSSGLUE_LIBS)
+     libtirpc_la_CFLAGS = -DHAVE_RPCSEC_GSS $(GSSGLUE_CFLAGS)
+ endif
+diff --git a/src/auth_des.c b/src/auth_des.c
+index 37e7667..f0c8b8c 100644
+--- a/src/auth_des.c
++++ b/src/auth_des.c
+@@ -223,6 +223,7 @@ authdes_pk_seccreate(const char *servername, netobj *pkey, u_int window,
+ 		goto failed;
+ 	}
+ 	ad->ad_nis_srvr = NULL; /* not needed any longer */
++	auth_get(auth);		/* Reference for caller */
+ 	return (auth);
+ 
+ failed:
+@@ -472,6 +473,12 @@ authdes_destroy(AUTH *auth)
+ 	FREE(auth, sizeof(AUTH));
+ }
+ 
++static bool_t
++authdes_wrap(AUTH *auth, XDR *xdrs, xdrproc_t xfunc, caddr_t xwhere)
++{
++	return ((*xfunc)(xdrs, xwhere));
++}
++
+ static struct auth_ops *
+ authdes_ops(void)
+ {
+@@ -487,6 +494,8 @@ authdes_ops(void)
+ 		ops.ah_validate = authdes_validate;
+ 		ops.ah_refresh = authdes_refresh;
+ 		ops.ah_destroy = authdes_destroy;
++		ops.ah_wrap = authdes_wrap;
++		ops.ah_unwrap = authdes_wrap;
+         }
+ 	mutex_unlock(&authdes_ops_lock);
+ 	return (&ops);
+diff --git a/src/auth_gss.c b/src/auth_gss.c
+index df3017a..539101e 100644
+--- a/src/auth_gss.c
++++ b/src/auth_gss.c
+@@ -87,9 +87,9 @@ print_rpc_gss_sec(struct rpc_gss_sec *ptr)
+ int i;
+ char *p;
+ 
+-	log_debug("rpc_gss_sec:");
++	gss_log_debug("rpc_gss_sec:");
+ 	if(ptr->mech == NULL)
+-		log_debug("NULL gss_OID mech");
++		gss_log_debug("NULL gss_OID mech");
+ 	else {
+ 		fprintf(stderr, "     mechanism_OID: {");
+ 		p = (char *)ptr->mech->elements;
+@@ -151,7 +151,7 @@ authgss_create(CLIENT *clnt, gss_name_t name, struct rpc_gss_sec *sec)
+ 	struct rpc_gss_data	*gd;
+ 	OM_uint32		min_stat = 0;
+ 
+-	log_debug("in authgss_create()");
++	gss_log_debug("in authgss_create()");
+ 
+ 	memset(&rpc_createerr, 0, sizeof(rpc_createerr));
+ 
+@@ -200,6 +200,8 @@ authgss_create(CLIENT *clnt, gss_name_t name, struct rpc_gss_sec *sec)
+ 
+ 	if (!authgss_refresh(auth))
+ 		auth = NULL;
++	else
++		auth_get(auth); /* Reference for caller */
+ 
+ 	clnt->cl_auth = save_auth;
+ 
+@@ -214,7 +216,7 @@ authgss_create_default(CLIENT *clnt, char *service, struct rpc_gss_sec *sec)
+ 	gss_buffer_desc		 sname;
+ 	gss_name_t		 name = GSS_C_NO_NAME;
+ 
+-	log_debug("in authgss_create_default()");
++	gss_log_debug("in authgss_create_default()");
+ 
+ 
+ 	sname.value = service;
+@@ -225,7 +227,7 @@ authgss_create_default(CLIENT *clnt, char *service, struct rpc_gss_sec *sec)
+ 		&name);
+ 
+ 	if (maj_stat != GSS_S_COMPLETE) {
+-		log_status("gss_import_name", maj_stat, min_stat);
++		gss_log_status("gss_import_name", maj_stat, min_stat);
+ 		rpc_createerr.cf_stat = RPC_AUTHERROR;
+ 		return (NULL);
+ 	}
+@@ -247,7 +249,7 @@ authgss_get_private_data(AUTH *auth, struct authgss_private_data *pd)
+ {
+ 	struct rpc_gss_data	*gd;
+ 
+-	log_debug("in authgss_get_private_data()");
++	gss_log_debug("in authgss_get_private_data()");
+ 
+ 	if (!auth || !pd)
+ 		return (FALSE);
+@@ -267,7 +269,7 @@ authgss_get_private_data(AUTH *auth, struct authgss_private_data *pd)
+ static void
+ authgss_nextverf(AUTH *auth)
+ {
+-	log_debug("in authgss_nextverf()");
++	gss_log_debug("in authgss_nextverf()");
+ 	/* no action necessary */
+ }
+ 
+@@ -281,7 +283,7 @@ authgss_marshal(AUTH *auth, XDR *xdrs)
+ 	OM_uint32		 maj_stat, min_stat;
+ 	bool_t			 xdr_stat;
+ 
+-	log_debug("in authgss_marshal()");
++	gss_log_debug("in authgss_marshal()");
+ 
+ 	gd = AUTH_PRIVATE(auth);
+ 
+@@ -316,7 +318,7 @@ authgss_marshal(AUTH *auth, XDR *xdrs)
+ 			    &rpcbuf, &checksum);
+ 
+ 	if (maj_stat != GSS_S_COMPLETE) {
+-		log_status("gss_get_mic", maj_stat, min_stat);
++		gss_log_status("gss_get_mic", maj_stat, min_stat);
+ 		if (maj_stat == GSS_S_CONTEXT_EXPIRED) {
+ 			gd->established = FALSE;
+ 			authgss_destroy_context(auth);
+@@ -341,7 +343,7 @@ authgss_validate(AUTH *auth, struct opaque_auth *verf)
+ 	gss_buffer_desc		 signbuf, checksum;
+ 	OM_uint32		 maj_stat, min_stat;
+ 
+-	log_debug("in authgss_validate()");
++	gss_log_debug("in authgss_validate()");
+ 
+ 	gd = AUTH_PRIVATE(auth);
+ 
+@@ -377,7 +379,7 @@ authgss_validate(AUTH *auth, struct opaque_auth *verf)
+ 	maj_stat = gss_verify_mic(&min_stat, gd->ctx, &signbuf,
+ 				  &checksum, &qop_state);
+ 	if (maj_stat != GSS_S_COMPLETE || qop_state != gd->sec.qop) {
+-		log_status("gss_verify_mic", maj_stat, min_stat);
++		gss_log_status("gss_verify_mic", maj_stat, min_stat);
+ 		if (maj_stat == GSS_S_CONTEXT_EXPIRED) {
+ 			gd->established = FALSE;
+ 			authgss_destroy_context(auth);
+@@ -395,7 +397,7 @@ authgss_refresh(AUTH *auth)
+ 	gss_buffer_desc		*recv_tokenp, send_token;
+ 	OM_uint32		 maj_stat, min_stat, call_stat, ret_flags;
+ 
+-	log_debug("in authgss_refresh()");
++	gss_log_debug("in authgss_refresh()");
+ 
+ 	gd = AUTH_PRIVATE(auth);
+ 
+@@ -414,9 +416,9 @@ authgss_refresh(AUTH *auth)
+ #ifdef DEBUG
+ 		/* print the token we just received */
+ 		if (recv_tokenp != GSS_C_NO_BUFFER) {
+-			log_debug("The token we just received (length %d):",
++			gss_log_debug("The token we just received (length %d):",
+ 				  recv_tokenp->length);
+-			log_hexdump(recv_tokenp->value, recv_tokenp->length, 0);
++			gss_log_hexdump(recv_tokenp->value, recv_tokenp->length, 0);
+ 		}
+ #endif
+ 		maj_stat = gss_init_sec_context(&min_stat,
+@@ -439,7 +441,7 @@ authgss_refresh(AUTH *auth)
+ 		}
+ 		if (maj_stat != GSS_S_COMPLETE &&
+ 		    maj_stat != GSS_S_CONTINUE_NEEDED) {
+-			log_status("gss_init_sec_context", maj_stat, min_stat);
++			gss_log_status("gss_init_sec_context", maj_stat, min_stat);
+ 			break;
+ 		}
+ 		if (send_token.length != 0) {
+@@ -447,9 +449,9 @@ authgss_refresh(AUTH *auth)
+ 
+ #ifdef DEBUG
+ 			/* print the token we are about to send */
+-			log_debug("The token being sent (length %d):",
++			gss_log_debug("The token being sent (length %d):",
+ 				  send_token.length);
+-			log_hexdump(send_token.value, send_token.length, 0);
++			gss_log_hexdump(send_token.value, send_token.length, 0);
+ #endif
+ 
+ 			call_stat = clnt_call(gd->clnt, NULLPROC,
+@@ -498,7 +500,7 @@ authgss_refresh(AUTH *auth)
+ 
+ 			if (maj_stat != GSS_S_COMPLETE
+ 					|| qop_state != gd->sec.qop) {
+-				log_status("gss_verify_mic", maj_stat, min_stat);
++				gss_log_status("gss_verify_mic", maj_stat, min_stat);
+ 				if (maj_stat == GSS_S_CONTEXT_EXPIRED) {
+ 					gd->established = FALSE;
+ 					authgss_destroy_context(auth);
+@@ -531,7 +533,7 @@ authgss_service(AUTH *auth, int svc)
+ {
+ 	struct rpc_gss_data	*gd;
+ 
+-	log_debug("in authgss_service()");
++	gss_log_debug("in authgss_service()");
+ 
+ 	if (!auth)
+ 		return(FALSE);
+@@ -549,15 +551,26 @@ authgss_destroy_context(AUTH *auth)
+ 	struct rpc_gss_data	*gd;
+ 	OM_uint32		 min_stat;
+ 
+-	log_debug("in authgss_destroy_context()");
++	gss_log_debug("in authgss_destroy_context()");
+ 
+ 	gd = AUTH_PRIVATE(auth);
+ 
+ 	if (gd->gc.gc_ctx.length != 0) {
+ 		if (gd->established) {
++			AUTH *save_auth = NULL;
++
++			/* Make sure we use the right auth_ops */
++			if (gd->clnt->cl_auth != auth) {
++				save_auth = gd->clnt->cl_auth;
++				gd->clnt->cl_auth = auth;
++			}
++
+ 			gd->gc.gc_proc = RPCSEC_GSS_DESTROY;
+ 			clnt_call(gd->clnt, NULLPROC, (xdrproc_t)xdr_void, NULL,
+ 				  (xdrproc_t)xdr_void, NULL, AUTH_TIMEOUT);
++			
++			if (save_auth != NULL)
++				gd->clnt->cl_auth = save_auth;
+ 		}
+ 		gss_release_buffer(&min_stat, &gd->gc.gc_ctx);
+ 		/* XXX ANDROS check size of context  - should be 8 */
+@@ -582,7 +595,7 @@ authgss_destroy(AUTH *auth)
+ 	struct rpc_gss_data	*gd;
+ 	OM_uint32		 min_stat;
+ 
+-	log_debug("in authgss_destroy()");
++	gss_log_debug("in authgss_destroy()");
+ 
+ 	gd = AUTH_PRIVATE(auth);
+ 
+@@ -603,7 +616,7 @@ authgss_wrap(AUTH *auth, XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr)
+ {
+ 	struct rpc_gss_data	*gd;
+ 
+-	log_debug("in authgss_wrap()");
++	gss_log_debug("in authgss_wrap()");
+ 
+ 	gd = AUTH_PRIVATE(auth);
+ 
+@@ -620,7 +633,7 @@ authgss_unwrap(AUTH *auth, XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr)
+ {
+ 	struct rpc_gss_data	*gd;
+ 
+-	log_debug("in authgss_unwrap()");
++	gss_log_debug("in authgss_unwrap()");
+ 
+ 	gd = AUTH_PRIVATE(auth);
+ 
+diff --git a/src/auth_none.c b/src/auth_none.c
+index a439ec6..008c589 100644
+--- a/src/auth_none.c
++++ b/src/auth_none.c
+@@ -155,6 +155,12 @@ authnone_destroy(AUTH *client)
+ {
+ }
+ 
++static bool_t
++authnone_wrap(AUTH *auth, XDR *xdrs, xdrproc_t xfunc, caddr_t xwhere)
++{
++	return ((*xfunc)(xdrs, xwhere));
++}
++
+ static struct auth_ops *
+ authnone_ops()
+ {
+@@ -170,6 +176,8 @@ authnone_ops()
+ 		ops.ah_validate = authnone_validate;
+ 		ops.ah_refresh = authnone_refresh;
+ 		ops.ah_destroy = authnone_destroy;
++		ops.ah_wrap = authnone_wrap;
++		ops.ah_unwrap = authnone_wrap;
+ 	}
+ 	mutex_unlock(&ops_lock);
+ 	return (&ops);
+diff --git a/src/auth_unix.c b/src/auth_unix.c
+index c2469da..4b9b13f 100644
+--- a/src/auth_unix.c
++++ b/src/auth_unix.c
+@@ -162,6 +162,7 @@ authunix_create(machname, uid, gid, len, aup_gids)
+ 	 */
+ 	auth->ah_cred = au->au_origcred;
+ 	marshal_new_auth(auth);
++	auth_get(auth);		/* Reference for caller */
+ 	return (auth);
+ #ifndef _KERNEL
+  cleanup_authunix_create:
+@@ -396,6 +397,12 @@ marshal_new_auth(auth)
+ 	XDR_DESTROY(xdrs);
+ }
+ 
++static bool_t
++authunix_wrap(AUTH *auth, XDR *xdrs, xdrproc_t xfunc, caddr_t xwhere)
++{
++	return ((*xfunc)(xdrs, xwhere));
++}
++
+ static struct auth_ops *
+ authunix_ops()
+ {
+@@ -411,6 +418,8 @@ authunix_ops()
+ 		ops.ah_validate = authunix_validate;
+ 		ops.ah_refresh = authunix_refresh;
+ 		ops.ah_destroy = authunix_destroy;
++		ops.ah_wrap = authunix_wrap;
++		ops.ah_unwrap = authunix_wrap;
+ 	}
+ 	mutex_unlock(&ops_lock);
+ 	return (&ops);
+diff --git a/src/authgss_prot.c b/src/authgss_prot.c
+index 9d7fa09..a3c93c9 100644
+--- a/src/authgss_prot.c
++++ b/src/authgss_prot.c
+@@ -64,10 +64,10 @@ xdr_rpc_gss_buf(XDR *xdrs, gss_buffer_t buf, u_int maxsize)
+ 	if (xdr_stat && xdrs->x_op == XDR_DECODE)
+ 		buf->length = tmplen;
+ 
+-	log_debug("xdr_rpc_gss_buf: %s %s (%p:%d)",
+-		  (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode",
+-		  (xdr_stat == TRUE) ? "success" : "failure",
+-		  buf->value, buf->length);
++	gss_log_debug("xdr_rpc_gss_buf: %s %s (%p:%d)",
++		      (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode",
++		      (xdr_stat == TRUE) ? "success" : "failure",
++		      buf->value, buf->length);
+ 
+ 	return xdr_stat;
+ }
+@@ -83,12 +83,12 @@ xdr_rpc_gss_cred(XDR *xdrs, struct rpc_gss_cred *p)
+ 		    xdr_enum(xdrs, (enum_t *)&p->gc_svc) &&
+ 		    xdr_rpc_gss_buf(xdrs, &p->gc_ctx, MAX_AUTH_BYTES));
+ 
+-	log_debug("xdr_rpc_gss_cred: %s %s "
+-		  "(v %d, proc %d, seq %d, svc %d, ctx %p:%d)",
+-		  (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode",
+-		  (xdr_stat == TRUE) ? "success" : "failure",
+-		  p->gc_v, p->gc_proc, p->gc_seq, p->gc_svc,
+-		  p->gc_ctx.value, p->gc_ctx.length);
++	gss_log_debug("xdr_rpc_gss_cred: %s %s "
++		      "(v %d, proc %d, seq %d, svc %d, ctx %p:%d)",
++		      (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode",
++		      (xdr_stat == TRUE) ? "success" : "failure",
++		      p->gc_v, p->gc_proc, p->gc_seq, p->gc_svc,
++		      p->gc_ctx.value, p->gc_ctx.length);
+ 
+ 	return (xdr_stat);
+ }
+@@ -101,10 +101,10 @@ xdr_rpc_gss_init_args(XDR *xdrs, gss_buffer_desc *p)
+ 
+ 	xdr_stat = xdr_rpc_gss_buf(xdrs, p, maxlen);
+ 
+-	log_debug("xdr_rpc_gss_init_args: %s %s (token %p:%d)",
+-		  (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode",
+-		  (xdr_stat == TRUE) ? "success" : "failure",
+-		  p->value, p->length);
++	gss_log_debug("xdr_rpc_gss_init_args: %s %s (token %p:%d)",
++		      (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode",
++		      (xdr_stat == TRUE) ? "success" : "failure",
++		      p->value, p->length);
+ 
+ 	return (xdr_stat);
+ }
+@@ -123,13 +123,13 @@ xdr_rpc_gss_init_res(XDR *xdrs, struct rpc_gss_init_res *p)
+ 		    xdr_u_int(xdrs, &p->gr_win) &&
+ 		    xdr_rpc_gss_buf(xdrs, &p->gr_token, tok_maxlen));
+ 
+-	log_debug("xdr_rpc_gss_init_res %s %s "
+-		  "(ctx %p:%d, maj %d, min %d, win %d, token %p:%d)",
+-		  (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode",
+-		  (xdr_stat == TRUE) ? "success" : "failure",
+-		  p->gr_ctx.value, p->gr_ctx.length,
+-		  p->gr_major, p->gr_minor, p->gr_win,
+-		  p->gr_token.value, p->gr_token.length);
++	gss_log_debug("xdr_rpc_gss_init_res %s %s "
++		      "(ctx %p:%d, maj %d, min %d, win %d, token %p:%d)",
++		      (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode",
++		      (xdr_stat == TRUE) ? "success" : "failure",
++		      p->gr_ctx.value, p->gr_ctx.length,
++		      p->gr_major, p->gr_minor, p->gr_win,
++		      p->gr_token.value, p->gr_token.length);
+ 
+ 	return (xdr_stat);
+ }
+@@ -161,6 +161,7 @@ xdr_rpc_gss_wrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
+ 	databuflen = end - start - 4;
+ 	XDR_SETPOS(xdrs, start + 4);
+ 	databuf.value = XDR_INLINE(xdrs, databuflen);
++	databuf.length = databuflen;
+ 
+ 	xdr_stat = FALSE;
+ 
+@@ -169,13 +170,12 @@ xdr_rpc_gss_wrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
+ 		XDR_SETPOS(xdrs, start);
+ 		if (!xdr_u_int(xdrs, (u_int *)&databuflen))
+ 			return (FALSE);
+-		databuf.length = databuflen;
+ 
+ 		/* Checksum rpc_gss_data_t. */
+ 		maj_stat = gss_get_mic(&min_stat, ctx, qop,
+ 				       &databuf, &wrapbuf);
+ 		if (maj_stat != GSS_S_COMPLETE) {
+-			log_debug("gss_get_mic failed");
++			gss_log_debug("gss_get_mic failed");
+ 			return (FALSE);
+ 		}
+ 		/* Marshal checksum. */
+@@ -189,7 +189,7 @@ xdr_rpc_gss_wrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
+ 		maj_stat = gss_wrap(&min_stat, ctx, TRUE, qop, &databuf,
+ 				    &conf_state, &wrapbuf);
+ 		if (maj_stat != GSS_S_COMPLETE) {
+-			log_status("gss_wrap", maj_stat, min_stat);
++			gss_log_status("gss_wrap", maj_stat, min_stat);
+ 			return (FALSE);
+ 		}
+ 		/* Marshal databody_priv. */
+@@ -222,13 +222,13 @@ xdr_rpc_gss_unwrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
+ 	if (svc == RPCSEC_GSS_SVC_INTEGRITY) {
+ 		/* Decode databody_integ. */
+ 		if (!xdr_rpc_gss_buf(xdrs, &databuf, (u_int)-1)) {
+-			log_debug("xdr decode databody_integ failed");
++			gss_log_debug("xdr decode databody_integ failed");
+ 			return (FALSE);
+ 		}
+ 		/* Decode checksum. */
+ 		if (!xdr_rpc_gss_buf(xdrs, &wrapbuf, (u_int)-1)) {
+ 			gss_release_buffer(&min_stat, &databuf);
+-			log_debug("xdr decode checksum failed");
++			gss_log_debug("xdr decode checksum failed");
+ 			return (FALSE);
+ 		}
+ 		/* Verify checksum and QOP. */
+@@ -238,14 +238,14 @@ xdr_rpc_gss_unwrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
+ 
+ 		if (maj_stat != GSS_S_COMPLETE || qop_state != qop) {
+ 			gss_release_buffer(&min_stat, &databuf);
+-			log_status("gss_verify_mic", maj_stat, min_stat);
++			gss_log_status("gss_verify_mic", maj_stat, min_stat);
+ 			return (FALSE);
+ 		}
+ 	}
+ 	else if (svc == RPCSEC_GSS_SVC_PRIVACY) {
+ 		/* Decode databody_priv. */
+ 		if (!xdr_rpc_gss_buf(xdrs, &wrapbuf, (u_int)-1)) {
+-			log_debug("xdr decode databody_priv failed");
++			gss_log_debug("xdr decode databody_priv failed");
+ 			return (FALSE);
+ 		}
+ 		/* Decrypt databody. */
+@@ -258,7 +258,7 @@ xdr_rpc_gss_unwrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
+ 		if (maj_stat != GSS_S_COMPLETE || qop_state != qop ||
+ 			conf_state != TRUE) {
+ 			gss_release_buffer(&min_stat, &databuf);
+-			log_status("gss_unwrap", maj_stat, min_stat);
++			gss_log_status("gss_unwrap", maj_stat, min_stat);
+ 			return (FALSE);
+ 		}
+ 	}
+@@ -271,7 +271,7 @@ xdr_rpc_gss_unwrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
+ 
+ 	/* Verify sequence number. */
+ 	if (xdr_stat == TRUE && seq_num != seq) {
+-		log_debug("wrong sequence number in databody");
++		gss_log_debug("wrong sequence number in databody");
+ 		return (FALSE);
+ 	}
+ 	return (xdr_stat);
+@@ -300,7 +300,7 @@ xdr_rpc_gss_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
+ #include <ctype.h>
+ 
+ void
+-log_debug(const char *fmt, ...)
++gss_log_debug(const char *fmt, ...)
+ {
+ 	va_list ap;
+ 
+@@ -312,7 +312,7 @@ log_debug(const char *fmt, ...)
+ }
+ 
+ void
+-log_status(char *m, OM_uint32 maj_stat, OM_uint32 min_stat)
++gss_log_status(char *m, OM_uint32 maj_stat, OM_uint32 min_stat)
+ {
+ 	OM_uint32 min;
+ 	gss_buffer_desc msg;
+@@ -332,7 +332,7 @@ log_status(char *m, OM_uint32 maj_stat, OM_uint32 min_stat)
+ }
+ 
+ void
+-log_hexdump(const u_char *buf, int len, int offset)
++gss_log_hexdump(const u_char *buf, int len, int offset)
+ {
+ 	u_int i, j, jm;
+ 	int c;
+@@ -367,17 +367,17 @@ log_hexdump(const u_char *buf, int len, int offset)
+ #else
+ 
+ void
+-log_debug(const char *fmt, ...)
++gss_log_debug(const char *fmt, ...)
+ {
+ }
+ 
+ void
+-log_status(char *m, OM_uint32 maj_stat, OM_uint32 min_stat)
++gss_log_status(char *m, OM_uint32 maj_stat, OM_uint32 min_stat)
+ {
+ }
+ 
+ void
+-log_hexdump(const u_char *buf, int len, int offset)
++gss_log_hexdump(const u_char *buf, int len, int offset)
+ {
+ }
+ 
+diff --git a/src/clnt_dg.c b/src/clnt_dg.c
+index 79fed5d..4a1f60a 100644
+--- a/src/clnt_dg.c
++++ b/src/clnt_dg.c
+@@ -366,7 +366,7 @@ call_again:
+ 
+ 	if ((! XDR_PUTINT32(xdrs, (int32_t *)&proc)) ||
+ 	    (! AUTH_MARSHALL(cl->cl_auth, xdrs)) ||
+-	    (! (*xargs)(xdrs, argsp))) {
++	    (! AUTH_WRAP(cl->cl_auth, xdrs, xargs, argsp))) {
+ 		cu->cu_error.re_status = RPC_CANTENCODEARGS;
+ 		goto out;
+ 	}
+@@ -400,8 +400,8 @@ get_reply:
+ 	 * (We assume that this is actually only executed once.)
+ 	 */
+ 	reply_msg.acpted_rply.ar_verf = _null_auth;
+-	reply_msg.acpted_rply.ar_results.where = resultsp;
+-	reply_msg.acpted_rply.ar_results.proc = xresults;
++	reply_msg.acpted_rply.ar_results.where = NULL;
++	reply_msg.acpted_rply.ar_results.proc = (xdrproc_t)xdr_void;
+ 
+         fd.fd = cu->cu_fd;
+         fd.events = POLLIN;
+@@ -512,6 +512,10 @@ get_reply:
+ 					    &reply_msg.acpted_rply.ar_verf)) {
+ 				cu->cu_error.re_status = RPC_AUTHERROR;
+ 				cu->cu_error.re_why = AUTH_INVALIDRESP;
++			} else if (! AUTH_UNWRAP(cl->cl_auth, &reply_xdrs,
++						 xresults, resultsp)) {
++				if (cu->cu_error.re_status == RPC_SUCCESS)
++				     cu->cu_error.re_status = RPC_CANTDECODERES;
+ 			}
+ 			if (reply_msg.acpted_rply.ar_verf.oa_base != NULL) {
+ 				xdrs->x_op = XDR_FREE;
+diff --git a/src/clnt_vc.c b/src/clnt_vc.c
+index 359063c..097cae8 100644
+--- a/src/clnt_vc.c
++++ b/src/clnt_vc.c
+@@ -364,7 +364,7 @@ call_again:
+ 	if ((! XDR_PUTBYTES(xdrs, ct->ct_u.ct_mcallc, ct->ct_mpos)) ||
+ 	    (! XDR_PUTINT32(xdrs, (int32_t *)&proc)) ||
+ 	    (! AUTH_MARSHALL(cl->cl_auth, xdrs)) ||
+-	    (! (*xdr_args)(xdrs, args_ptr))) {
++	    (! AUTH_WRAP(cl->cl_auth, xdrs, xdr_args, args_ptr))) {
+ 		if (ct->ct_error.re_status == RPC_SUCCESS)
+ 			ct->ct_error.re_status = RPC_CANTENCODEARGS;
+ 		(void)xdrrec_endofrecord(xdrs, TRUE);
+@@ -420,7 +420,8 @@ call_again:
+ 		    &reply_msg.acpted_rply.ar_verf)) {
+ 			ct->ct_error.re_status = RPC_AUTHERROR;
+ 			ct->ct_error.re_why = AUTH_INVALIDRESP;
+-		} else if (! (*xdr_results)(xdrs, results_ptr)) {
++		} else if (! AUTH_UNWRAP(cl->cl_auth, xdrs,
++					 xdr_results, results_ptr)) {
+ 			if (ct->ct_error.re_status == RPC_SUCCESS)
+ 				ct->ct_error.re_status = RPC_CANTDECODERES;
+ 		}
+diff --git a/src/rpc_soc.c b/src/rpc_soc.c
+index c678429..63d2197 100644
+--- a/src/rpc_soc.c
++++ b/src/rpc_soc.c
+@@ -560,12 +560,10 @@ clntunix_create(raddr, prog, vers, sockp, sendsz, recvsz)
+ 	u_int recvsz;
+ {
+ 	struct netbuf *svcaddr;
+-	struct netconfig *nconf;
+ 	CLIENT *cl;
+ 	int len;
+ 
+ 	cl = NULL;
+-	nconf = NULL;
+ 	svcaddr = NULL;
+ 	if (((svcaddr = malloc(sizeof(struct netbuf))) == NULL ) ||
+ 	    ((svcaddr->buf = malloc(sizeof(struct sockaddr_un))) == NULL)) {
+diff --git a/src/svc.c b/src/svc.c
+index b4a63d0..08cd6c9 100644
+--- a/src/svc.c
++++ b/src/svc.c
+@@ -77,9 +77,6 @@ static struct svc_callout
+ 
+ extern rwlock_t svc_lock;
+ extern rwlock_t svc_fd_lock;
+-#ifdef HAVE_LIBGSSAPI
+-extern struct svc_auth_ops svc_auth_gss_ops;
+-#endif
+ 
+ static struct svc_callout *svc_find (rpcprog_t, rpcvers_t,
+ 				     struct svc_callout **, char *);
+@@ -717,11 +714,9 @@ svc_getreq_common (fd)
+ 	  SVC_DESTROY (xprt);
+ 	  break;
+ 	}
+-    else if ((xprt->xp_auth != NULL) 
+-#ifdef HAVE_LIBGSSAPI
+-	  	&& (xprt->xp_auth->svc_ah_ops != &svc_auth_gss_ops)
+-#endif
+-	) {
++    else if ((xprt->xp_auth != NULL) &&
++	     (xprt->xp_auth->svc_ah_private == NULL))
++	{
+ 	  xprt->xp_auth = NULL;
+ 	}
+     }
+diff --git a/src/svc_auth.c b/src/svc_auth.c
+index c6b3a0b..e80d5f9 100644
+--- a/src/svc_auth.c
++++ b/src/svc_auth.c
+@@ -98,8 +98,8 @@ _authenticate(rqst, msg)
+ 	rqst->rq_xprt->xp_verf.oa_length = 0;
+ 	cred_flavor = rqst->rq_cred.oa_flavor;
+ 	switch (cred_flavor) {
+-	case AUTH_NULL:
+-		dummy = _svcauth_null(rqst, msg);
++	case AUTH_NONE:
++		dummy = _svcauth_none(rqst, msg);
+ 		return (dummy);
+ 	case AUTH_SYS:
+ 		dummy = _svcauth_unix(rqst, msg);
+@@ -132,15 +132,6 @@ _authenticate(rqst, msg)
+ 	return (AUTH_REJECTEDCRED);
+ }
+ 
+-/*ARGSUSED*/
+-enum auth_stat
+-_svcauth_null(rqst, msg)
+-	struct svc_req *rqst;
+-	struct rpc_msg *msg;
+-{
+-	return (AUTH_OK);
+-}
+-
+ /*
+  *  Allow the rpc service to register new authentication types that it is
+  *  prepared to handle.  When an authentication flavor is registered,
+diff --git a/src/svc_auth_gss.c b/src/svc_auth_gss.c
+index 54b23b1..9c74313 100644
+--- a/src/svc_auth_gss.c
++++ b/src/svc_auth_gss.c
+@@ -87,13 +87,13 @@ svcauth_gss_set_svc_name(gss_name_t name)
+ {
+ 	OM_uint32	maj_stat, min_stat;
+ 
+-	log_debug("in svcauth_gss_set_svc_name()");
++	gss_log_debug("in svcauth_gss_set_svc_name()");
+ 
+ 	if (_svcauth_gss_name != NULL) {
+ 		maj_stat = gss_release_name(&min_stat, &_svcauth_gss_name);
+ 
+ 		if (maj_stat != GSS_S_COMPLETE) {
+-			log_status("gss_release_name", maj_stat, min_stat);
++			gss_log_status("gss_release_name", maj_stat, min_stat);
+ 			return (FALSE);
+ 		}
+ 		_svcauth_gss_name = NULL;
+@@ -101,7 +101,7 @@ svcauth_gss_set_svc_name(gss_name_t name)
+ 	maj_stat = gss_duplicate_name(&min_stat, name, &_svcauth_gss_name);
+ 
+ 	if (maj_stat != GSS_S_COMPLETE) {
+-		log_status("gss_duplicate_name", maj_stat, min_stat);
++		gss_log_status("gss_duplicate_name", maj_stat, min_stat);
+ 		return (FALSE);
+ 	}
+ 
+@@ -115,7 +115,7 @@ svcauth_gss_import_name(char *service)
+ 	gss_buffer_desc	namebuf;
+ 	OM_uint32	maj_stat, min_stat;
+ 
+-	log_debug("in svcauth_gss_import_name()");
++	gss_log_debug("in svcauth_gss_import_name()");
+ 
+ 	namebuf.value = service;
+ 	namebuf.length = strlen(service);
+@@ -124,7 +124,7 @@ svcauth_gss_import_name(char *service)
+ 				   (gss_OID)GSS_C_NT_HOSTBASED_SERVICE, &name);
+ 
+ 	if (maj_stat != GSS_S_COMPLETE) {
+-		log_status("gss_import_name", maj_stat, min_stat);
++		gss_log_status("gss_import_name", maj_stat, min_stat);
+ 		return (FALSE);
+ 	}
+ 	if (svcauth_gss_set_svc_name(name) != TRUE) {
+@@ -139,14 +139,14 @@ svcauth_gss_acquire_cred(void)
+ {
+ 	OM_uint32	maj_stat, min_stat;
+ 
+-	log_debug("in svcauth_gss_acquire_cred()");
++	gss_log_debug("in svcauth_gss_acquire_cred()");
+ 
+ 	maj_stat = gss_acquire_cred(&min_stat, _svcauth_gss_name, 0,
+ 				    GSS_C_NULL_OID_SET, GSS_C_ACCEPT,
+ 				    &_svcauth_gss_creds, NULL, NULL);
+ 
+ 	if (maj_stat != GSS_S_COMPLETE) {
+-		log_status("gss_acquire_cred", maj_stat, min_stat);
++		gss_log_status("gss_acquire_cred", maj_stat, min_stat);
+ 		return (FALSE);
+ 	}
+ 	return (TRUE);
+@@ -157,12 +157,12 @@ svcauth_gss_release_cred(void)
+ {
+ 	OM_uint32	maj_stat, min_stat;
+ 
+-	log_debug("in svcauth_gss_release_cred()");
++	gss_log_debug("in svcauth_gss_release_cred()");
+ 
+ 	maj_stat = gss_release_cred(&min_stat, &_svcauth_gss_creds);
+ 
+ 	if (maj_stat != GSS_S_COMPLETE) {
+-		log_status("gss_release_cred", maj_stat, min_stat);
++		gss_log_status("gss_release_cred", maj_stat, min_stat);
+ 		return (FALSE);
+ 	}
+ 
+@@ -181,7 +181,7 @@ svcauth_gss_accept_sec_context(struct svc_req *rqst,
+ 	gss_OID			 mech;
+ 	OM_uint32		 maj_stat = 0, min_stat = 0, ret_flags, seq;
+ 
+-	log_debug("in svcauth_gss_accept_context()");
++	gss_log_debug("in svcauth_gss_accept_context()");
+ 
+ 	gd = SVCAUTH_PRIVATE(rqst->rq_xprt->xp_auth);
+ 	gc = (struct rpc_gss_cred *)rqst->rq_clntcred;
+@@ -208,7 +208,7 @@ svcauth_gss_accept_sec_context(struct svc_req *rqst,
+ 
+ 	if (gr->gr_major != GSS_S_COMPLETE &&
+ 	    gr->gr_major != GSS_S_CONTINUE_NEEDED) {
+-		log_status("accept_sec_context", gr->gr_major, gr->gr_minor);
++		gss_log_status("accept_sec_context", gr->gr_major, gr->gr_minor);
+ 		gd->ctx = GSS_C_NO_CONTEXT;
+ 		gss_release_buffer(&min_stat, &gr->gr_token);
+ 		return (FALSE);
+@@ -238,7 +238,7 @@ svcauth_gss_accept_sec_context(struct svc_req *rqst,
+ 		maj_stat = gss_display_name(&min_stat, gd->client_name,
+ 					    &gd->cname, &gd->sec.mech);
+ 		if (maj_stat != GSS_S_COMPLETE) {
+-			log_status("display_name", maj_stat, min_stat);
++			gss_log_status("display_name", maj_stat, min_stat);
+ 			return (FALSE);
+ 		}
+ #ifdef DEBUG
+@@ -248,19 +248,19 @@ svcauth_gss_accept_sec_context(struct svc_req *rqst,
+ 
+ 			gss_oid_to_str(&min_stat, mech, &mechname);
+ 
+-			log_debug("accepted context for %.*s with "
+-				  "<mech %.*s, qop %d, svc %d>",
+-				  gd->cname.length, (char *)gd->cname.value,
+-				  mechname.length, (char *)mechname.value,
+-				  gd->sec.qop, gd->sec.svc);
++			gss_log_debug("accepted context for %.*s with "
++				      "<mech %.*s, qop %d, svc %d>",
++				      gd->cname.length, (char *)gd->cname.value,
++				      mechname.length, (char *)mechname.value,
++				      gd->sec.qop, gd->sec.svc);
+ 
+ 			gss_release_buffer(&min_stat, &mechname);
+ 		}
+ #elif HAVE_HEIMDAL
+-		log_debug("accepted context for %.*s with "
+-			  "<mech {}, qop %d, svc %d>",
+-			  gd->cname.length, (char *)gd->cname.value,
+-			  gd->sec.qop, gd->sec.svc);
++		gss_log_debug("accepted context for %.*s with "
++			      "<mech {}, qop %d, svc %d>",
++			      gd->cname.length, (char *)gd->cname.value,
++			      gd->sec.qop, gd->sec.svc);
+ #endif
+ #endif /* DEBUG */
+ 		seq = htonl(gr->gr_win);
+@@ -289,7 +289,7 @@ svcauth_gss_validate(struct svc_rpc_gss_data *gd, struct rpc_msg *msg)
+ 	u_char			 rpchdr[128];
+ 	int32_t			*buf;
+ 
+-	log_debug("in svcauth_gss_validate()");
++	gss_log_debug("in svcauth_gss_validate()");
+ 
+ 	memset(rpchdr, 0, sizeof(rpchdr));
+ 
+@@ -326,7 +326,7 @@ svcauth_gss_validate(struct svc_rpc_gss_data *gd, struct rpc_msg *msg)
+ 				  &qop_state);
+ 
+ 	if (maj_stat != GSS_S_COMPLETE) {
+-		log_status("gss_verify_mic", maj_stat, min_stat);
++		gss_log_status("gss_verify_mic", maj_stat, min_stat);
+ 		return (FALSE);
+ 	}
+ 	return (TRUE);
+@@ -339,7 +339,7 @@ svcauth_gss_nextverf(struct svc_req *rqst, u_int num)
+ 	gss_buffer_desc		 signbuf, checksum;
+ 	OM_uint32		 maj_stat, min_stat;
+ 
+-	log_debug("in svcauth_gss_nextverf()");
++	gss_log_debug("in svcauth_gss_nextverf()");
+ 
+ 	if (rqst->rq_xprt->xp_auth == NULL)
+ 		return (FALSE);
+@@ -353,7 +353,7 @@ svcauth_gss_nextverf(struct svc_req *rqst, u_int num)
+ 			       &signbuf, &checksum);
+ 
+ 	if (maj_stat != GSS_S_COMPLETE) {
+-		log_status("gss_get_mic", maj_stat, min_stat);
++		gss_log_status("gss_get_mic", maj_stat, min_stat);
+ 		return (FALSE);
+ 	}
+ 	rqst->rq_xprt->xp_verf.oa_flavor = RPCSEC_GSS;
+@@ -373,7 +373,7 @@ _svcauth_gss(struct svc_req *rqst, struct rpc_msg *msg, bool_t *no_dispatch)
+ 	struct rpc_gss_init_res	 gr;
+ 	int			 call_stat, offset;
+ 
+-	log_debug("in svcauth_gss()");
++	gss_log_debug("in svcauth_gss()");
+ 
+ 	/* Initialize reply. */
+ 	rqst->rq_xprt->xp_verf = _null_auth;
+@@ -519,7 +519,7 @@ svcauth_gss_destroy(SVCAUTH *auth)
+ 	struct svc_rpc_gss_data	*gd;
+ 	OM_uint32		 min_stat;
+ 
+-	log_debug("in svcauth_gss_destroy()");
++	gss_log_debug("in svcauth_gss_destroy()");
+ 
+ 	gd = SVCAUTH_PRIVATE(auth);
+ 
+@@ -540,7 +540,7 @@ svcauth_gss_wrap(SVCAUTH *auth, XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr)
+ {
+ 	struct svc_rpc_gss_data	*gd;
+ 
+-	log_debug("in svcauth_gss_wrap()");
++	gss_log_debug("in svcauth_gss_wrap()");
+ 
+ 	gd = SVCAUTH_PRIVATE(auth);
+ 
+@@ -557,7 +557,7 @@ svcauth_gss_unwrap(SVCAUTH *auth, XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr
+ {
+ 	struct svc_rpc_gss_data	*gd;
+ 
+-	log_debug("in svcauth_gss_unwrap()");
++	gss_log_debug("in svcauth_gss_unwrap()");
+ 
+ 	gd = SVCAUTH_PRIVATE(auth);
+ 
+diff --git a/src/svc_auth_unix.c b/src/svc_auth_unix.c
+index ce83859..9585069 100644
+--- a/src/svc_auth_unix.c
++++ b/src/svc_auth_unix.c
+@@ -43,6 +43,8 @@
+ 
+ #include <rpc/rpc.h>
+ 
++extern SVCAUTH svc_auth_none;
++
+ /*
+  * Unix longhand authenticator
+  */
+@@ -67,6 +69,8 @@ _svcauth_unix(rqst, msg)
+ 	assert(rqst != NULL);
+ 	assert(msg != NULL);
+ 
++	rqst->rq_xprt->xp_auth = &svc_auth_none;
++
+ 	area = (struct area *) rqst->rq_clntcred;
+ 	aup = &area->area_aup;
+ 	aup->aup_machname = area->area_machname;
+@@ -142,5 +146,6 @@ _svcauth_short(rqst, msg)
+ 	struct svc_req *rqst;
+ 	struct rpc_msg *msg;
+ {
++	rqst->rq_xprt->xp_auth = &svc_auth_none;
+ 	return (AUTH_REJECTEDCRED);
+ }
+diff --git a/src/svc_dg.c b/src/svc_dg.c
+index 66a56ee..081db61 100644
+--- a/src/svc_dg.c
++++ b/src/svc_dg.c
+@@ -134,6 +134,7 @@ svc_dg_create(fd, sendsize, recvsize)
+ 	su->su_cache = NULL;
+ 	xprt->xp_fd = fd;
+ 	xprt->xp_p2 = su;
++	xprt->xp_auth = NULL;
+ 	xprt->xp_verf.oa_base = su->su_verfbody;
+ 	svc_dg_ops(xprt);
+ 	xprt->xp_rtaddr.maxlen = sizeof (struct sockaddr_storage);
+@@ -234,10 +235,27 @@ svc_dg_reply(xprt, msg)
+ 	bool_t stat = FALSE;
+ 	size_t slen;
+ 
++	xdrproc_t xdr_results;
++	caddr_t xdr_location;
++	bool_t has_args;
++
++	if (msg->rm_reply.rp_stat == MSG_ACCEPTED &&
++	    msg->rm_reply.rp_acpt.ar_stat == SUCCESS) {
++		has_args = TRUE;
++		xdr_results = msg->acpted_rply.ar_results.proc;
++		xdr_location = msg->acpted_rply.ar_results.where;
++
++		msg->acpted_rply.ar_results.proc = (xdrproc_t)xdr_void;
++		msg->acpted_rply.ar_results.where = NULL;
++	} else
++		has_args = FALSE;
++
+ 	xdrs->x_op = XDR_ENCODE;
+ 	XDR_SETPOS(xdrs, 0);
+ 	msg->rm_xid = su->su_xid;
+-	if (xdr_replymsg(xdrs, msg)) {
++	if (xdr_replymsg(xdrs, msg) &&
++	    (!has_args || (xprt->xp_auth &&
++	     SVCAUTH_WRAP(xprt->xp_auth, xdrs, xdr_results, xdr_location)))) {
+ 		struct msghdr *msg = &su->su_msghdr;
+ 		struct iovec iov;
+ 
+@@ -264,7 +282,12 @@ svc_dg_getargs(xprt, xdr_args, args_ptr)
+ 	xdrproc_t xdr_args;
+ 	void *args_ptr;
+ {
+-	return (*xdr_args)(&(su_data(xprt)->su_xdrs), args_ptr);
++	if (! SVCAUTH_UNWRAP(xprt->xp_auth, &(su_data(xprt)->su_xdrs),
++			     xdr_args, args_ptr)) {
++		(void)svc_freeargs(xprt, xdr_args, args_ptr);
++		return FALSE;
++	}
++	return TRUE;
+ }
+ 
+ static bool_t
+@@ -288,6 +311,10 @@ svc_dg_destroy(xprt)
+ 	xprt_unregister(xprt);
+ 	if (xprt->xp_fd != -1)
+ 		(void)close(xprt->xp_fd);
++	if (xprt->xp_auth != NULL) {
++		SVCAUTH_DESTROY(xprt->xp_auth);
++		xprt->xp_auth = NULL;
++	}
+ 	XDR_DESTROY(&(su->su_xdrs));
+ 	(void) mem_free(rpc_buffer(xprt), su->su_iosz);
+ 	(void) mem_free(su, sizeof (*su));
+diff --git a/src/svc_vc.c b/src/svc_vc.c
+index aaaf2d7..4c70de8 100644
+--- a/src/svc_vc.c
++++ b/src/svc_vc.c
+@@ -172,6 +172,7 @@ svc_vc_create(fd, sendsize, recvsize)
+ 	xprt->xp_p1 = r;
+ 	xprt->xp_p2 = NULL;
+ 	xprt->xp_p3 = NULL;
++	xprt->xp_auth = NULL;
+ 	xprt->xp_verf = _null_auth;
+ 	svc_vc_rendezvous_ops(xprt);
+ 	xprt->xp_port = (u_short)-1;	/* It is the rendezvouser */
+@@ -283,6 +284,7 @@ makefd_xprt(fd, sendsize, recvsize)
+ 	xdrrec_create(&(cd->xdrs), sendsize, recvsize,
+ 	    xprt, read_vc, write_vc);
+ 	xprt->xp_p1 = cd;
++	xprt->xp_auth = NULL;
+ 	xprt->xp_verf.oa_base = cd->verf_body;
+ 	svc_vc_ops(xprt);  /* truely deals with calls */
+ 	xprt->xp_port = 0;  /* this is a connection, not a rendezvouser */
+@@ -412,6 +414,10 @@ __svc_vc_dodestroy(xprt)
+ 		XDR_DESTROY(&(cd->xdrs));
+ 		mem_free(cd, sizeof(struct cf_conn));
+ 	}
++	if (xprt->xp_auth != NULL) {
++		SVCAUTH_DESTROY(xprt->xp_auth);
++		xprt->xp_auth = NULL;
++	}
+ 	if (xprt->xp_rtaddr.buf)
+ 		mem_free(xprt->xp_rtaddr.buf, xprt->xp_rtaddr.maxlen);
+ 	if (xprt->xp_ltaddr.buf)
+@@ -610,7 +616,11 @@ svc_vc_recv(xprt, msg)
+ 	}
+ 
+ 	xdrs->x_op = XDR_DECODE;
+-	(void)xdrrec_skiprecord(xdrs);
++	/*
++	 * No need skip records with nonblocking connections
++	 */
++	if (cd->nonblock == FALSE)
++		(void)xdrrec_skiprecord(xdrs);
+ 	if (xdr_callmsg(xdrs, msg)) {
+ 		cd->x_id = msg->rm_xid;
+ 		return (TRUE);
+@@ -628,8 +638,13 @@ svc_vc_getargs(xprt, xdr_args, args_ptr)
+ 
+ 	assert(xprt != NULL);
+ 	/* args_ptr may be NULL */
+-	return ((*xdr_args)(&(((struct cf_conn *)(xprt->xp_p1))->xdrs),
+-	    args_ptr));
++
++	if (! SVCAUTH_UNWRAP(xprt->xp_auth,
++			     &(((struct cf_conn *)(xprt->xp_p1))->xdrs),
++			     xdr_args, args_ptr)) {
++		return FALSE;  
++	}
++	return TRUE;
+ }
+ 
+ static bool_t
+@@ -658,15 +673,35 @@ svc_vc_reply(xprt, msg)
+ 	XDR *xdrs;
+ 	bool_t rstat;
+ 
++	xdrproc_t xdr_results;
++	caddr_t xdr_location;
++	bool_t has_args;
++
+ 	assert(xprt != NULL);
+ 	assert(msg != NULL);
+ 
+ 	cd = (struct cf_conn *)(xprt->xp_p1);
+ 	xdrs = &(cd->xdrs);
+ 
++	if (msg->rm_reply.rp_stat == MSG_ACCEPTED &&
++	    msg->rm_reply.rp_acpt.ar_stat == SUCCESS) {
++		has_args = TRUE;
++		xdr_results = msg->acpted_rply.ar_results.proc;
++		xdr_location = msg->acpted_rply.ar_results.where;
++
++		msg->acpted_rply.ar_results.proc = (xdrproc_t)xdr_void;
++		msg->acpted_rply.ar_results.where = NULL;
++	} else
++		has_args = FALSE;
++
+ 	xdrs->x_op = XDR_ENCODE;
+ 	msg->rm_xid = cd->x_id;
+-	rstat = xdr_replymsg(xdrs, msg);
++	rstat = FALSE;
++	if (xdr_replymsg(xdrs, msg) &&
++	    (!has_args || (xprt->xp_auth &&
++	     SVCAUTH_WRAP(xprt->xp_auth, xdrs, xdr_results, xdr_location)))) {
++		rstat = TRUE;
++	}
+ 	(void)xdrrec_endofrecord(xdrs, TRUE);
+ 	return (rstat);
+ }
+diff --git a/src/xdr_rec.c b/src/xdr_rec.c
+index 4e815d7..2aca623 100644
+--- a/src/xdr_rec.c
++++ b/src/xdr_rec.c
+@@ -64,7 +64,6 @@
+ #include <rpc/clnt.h>
+ #include <stddef.h>
+ #include "rpc_com.h"
+-#include <unistd.h>
+ static bool_t	xdrrec_getlong(XDR *, long *);
+ static bool_t	xdrrec_putlong(XDR *, const long *);
+ static bool_t	xdrrec_getbytes(XDR *, char *, u_int);
+@@ -330,22 +329,22 @@ xdrrec_getpos(xdrs)
+ 	RECSTREAM *rstrm = (RECSTREAM *)xdrs->x_private;
+ 	off_t pos;
+ 
+-	pos = lseek((int)(u_long)rstrm->tcp_handle, (off_t)0, 1);
+-	if (pos != -1)
+-		switch (xdrs->x_op) {
++	switch (xdrs->x_op) {
+ 
+-		case XDR_ENCODE:
+-			pos += rstrm->out_finger - rstrm->out_base;
+-			break;
++	case XDR_ENCODE:
++		pos = rstrm->out_finger - rstrm->out_base
++			- BYTES_PER_XDR_UNIT;
++		break;
+ 
+-		case XDR_DECODE:
+-			pos -= rstrm->in_boundry - rstrm->in_finger;
+-			break;
++	case XDR_DECODE:
++		pos = rstrm->in_boundry - rstrm->in_finger
++			- BYTES_PER_XDR_UNIT;
++		break;
+ 
+-		default:
+-			pos = (off_t) -1;
+-			break;
+-		}
++	default:
++		pos = (off_t) -1;
++		break;
++	}
+ 	return ((u_int) pos);
+ }
+ 
+diff --git a/tirpc/rpc/auth.h b/tirpc/rpc/auth.h
+index 734e6b9..e7bbe36 100644
+--- a/tirpc/rpc/auth.h
++++ b/tirpc/rpc/auth.h
+@@ -51,6 +51,7 @@
+ #include <sys/cdefs.h>
+ #include <sys/socket.h>
+ #include <sys/types.h>
++#include <stdio.h>
+ 
+ 
+ #define MAX_AUTH_BYTES	400
+@@ -203,8 +204,22 @@ typedef struct __auth {
+ 
+ 	} *ah_ops;
+ 	void *ah_private;
++	int ah_refcnt;
+ } AUTH;
+ 
++static __inline int
++auth_get(AUTH *auth)
++{
++	return __sync_add_and_fetch(&auth->ah_refcnt, 1);
++}
++
++static __inline int
++auth_put(AUTH *auth)
++{
++	return __sync_sub_and_fetch(&auth->ah_refcnt, 1);
++}
++
++
+ 
+ /*
+  * Authentication ops.
+@@ -234,10 +249,29 @@ typedef struct __auth {
+ #define auth_refresh(auth, msg)		\
+ 		((*((auth)->ah_ops->ah_refresh))(auth, msg))
+ 
+-#define AUTH_DESTROY(auth)		\
+-		((*((auth)->ah_ops->ah_destroy))(auth))
+-#define auth_destroy(auth)		\
+-		((*((auth)->ah_ops->ah_destroy))(auth))
++#if defined(__GNUC__) && defined(DEBUG)
++#define auth_log_debug(fmt,args...) printf(stderr, fmt, args)
++#else
++#define auth_log_debug(fmt,args...)
++#endif
++
++#define AUTH_DESTROY(auth)						\
++		do {							\
++			int refs;					\
++			if ((refs = auth_put((auth))) == 0)		\
++				((*((auth)->ah_ops->ah_destroy))(auth));\
++			auth_log_debug("%s: auth_put(), refs %d\n",	\
++				__func__, refs);			\
++		} while (0)
++
++#define auth_destroy(auth)						\
++		do {							\
++			int refs;					\
++			if ((refs = auth_put((auth))) == 0)		\
++				((*((auth)->ah_ops->ah_destroy))(auth));\
++			auth_log_debug("%s: auth_put(), refs %d\n",	\
++				__func__, refs);			\
++		} while (0)
+ 
+ #define AUTH_WRAP(auth, xdrs, xfunc, xwhere)            \
+ 		((*((auth)->ah_ops->ah_wrap))(auth, xdrs, \
+@@ -373,7 +407,7 @@ __END_DECLS
+ __BEGIN_DECLS
+ struct svc_req;
+ struct rpc_msg;
+-enum auth_stat _svcauth_null (struct svc_req *, struct rpc_msg *);
++enum auth_stat _svcauth_none (struct svc_req *, struct rpc_msg *);
+ enum auth_stat _svcauth_short (struct svc_req *, struct rpc_msg *);
+ enum auth_stat _svcauth_unix (struct svc_req *, struct rpc_msg *);
+ __END_DECLS
+diff --git a/tirpc/rpc/auth_gss.h b/tirpc/rpc/auth_gss.h
+index 633b11f..fc3ffbd 100644
+--- a/tirpc/rpc/auth_gss.h
++++ b/tirpc/rpc/auth_gss.h
+@@ -120,10 +120,10 @@ bool_t authgss_service		__P((AUTH *auth, int svc));
+ bool_t authgss_get_private_data	__P((AUTH *auth,
+ 	    			     struct authgss_private_data *));
+ 
+-void	log_debug		__P((const char *fmt, ...));
+-void	log_status		__P((char *m, OM_uint32 major,
++void	gss_log_debug		__P((const char *fmt, ...));
++void	gss_log_status		__P((char *m, OM_uint32 major,
+ 				     OM_uint32 minor));
+-void	log_hexdump		__P((const u_char *buf, int len, int offset));
++void	gss_log_hexdump		__P((const u_char *buf, int len, int offset));
+ 
+ __END_DECLS
+ 
+diff --git a/tirpc/rpc/des.h b/tirpc/rpc/des.h
+index e3d6897..d2881ad 100644
+--- a/tirpc/rpc/des.h
++++ b/tirpc/rpc/des.h
+@@ -33,6 +33,9 @@
+  * Copyright (c) 1986 by Sun Microsystems, Inc.
+  */
+ 
++#ifndef _RPC_DES_H_
++#define _RPC_DES_H_
++
+ #define DES_MAXLEN 	65536	/* maximum # of bytes to encrypt  */
+ #define DES_QUICKLEN	16	/* maximum # of bytes to encrypt quickly */
+ 
+@@ -80,3 +83,5 @@ struct desparams {
+  * Software DES.
+  */
+ extern int _des_crypt( char *, int, struct desparams * );
++
++#endif
+diff --git a/tirpc/rpc/svc_auth.h b/tirpc/rpc/svc_auth.h
+index 659e90c..14269d1 100644
+--- a/tirpc/rpc/svc_auth.h
++++ b/tirpc/rpc/svc_auth.h
+@@ -44,17 +44,23 @@
+ /*
+  * Interface to server-side authentication flavors.
+  */
+-typedef struct {
++typedef struct SVCAUTH {
+ 	struct svc_auth_ops {
+-		int   (*svc_ah_wrap)(void);
+-		int   (*svc_ah_unwrap)(void);
+-		int   (*svc_ah_destroy)(void);
++		int     (*svc_ah_wrap)(struct SVCAUTH *, XDR *, xdrproc_t,
++				       caddr_t);
++		int     (*svc_ah_unwrap)(struct SVCAUTH *, XDR *, xdrproc_t,
++					 caddr_t);
++		int     (*svc_ah_destroy)(struct SVCAUTH *);
+ 		} *svc_ah_ops;
+ 	caddr_t svc_ah_private;
+ } SVCAUTH;
+ 
+-#define SVCAUTH_DESTROY(cred)		((*(cred)->svc_ah_ops->svc_ah_destroy)())
+-#define svcauth_destroy(cred)		((*(cred)->svc_ah_ops->svc_ah_destroy)())
++#define SVCAUTH_WRAP(auth, xdrs, xfunc, xwhere) \
++	((*((auth)->svc_ah_ops->svc_ah_wrap))(auth, xdrs, xfunc, xwhere))
++#define SVCAUTH_UNWRAP(auth, xdrs, xfunc, xwhere) \
++	((*((auth)->svc_ah_ops->svc_ah_unwrap))(auth, xdrs, xfunc, xwhere))
++#define SVCAUTH_DESTROY(auth) \
++	((*((auth)->svc_ah_ops->svc_ah_destroy))(auth))
+ 
+ /*
+  * Server side authenticator
diff --git a/libtirpc.spec b/libtirpc.spec
index 05268b7..6906e9b 100644
--- a/libtirpc.spec
+++ b/libtirpc.spec
@@ -2,7 +2,7 @@
 
 Name:		   libtirpc
 Version:		0.2.2
-Release:		31%{?dist}
+Release:		41%{?dist}
 Summary:		Transport Independent RPC Library
 Group:		  	System Environment/Libraries
 License:		SISSL and BSD
@@ -11,9 +11,7 @@ URL:  			http://nfsv4.bullopensource.org/
 BuildRoot:	%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 Source0:	http://downloads.sourceforge.net/libtirpc/libtirpc-%{version}.tar.bz2
 
-Patch001: libtirpc-0.2.3-rc1.patch
-Patch002: libtirpc-0.2.2-wrap-segfault.patch
-Patch003: libtirpc-0.2.2-doc-Makefile.patch
+Patch001: libtirpc-0.2.3-rc3.patch
 
 BuildRequires:		automake, autoconf, libtool, pkgconfig
 BuildRequires:		libgssglue-devel
@@ -45,8 +43,6 @@ developing programs which use the tirpc library.
 %setup -q
 
 %patch001 -p1
-%patch002 -p1
-%patch003 -p1
 
 # Remove .orig files
 find . -name "*.orig" | xargs rm -f
@@ -135,7 +131,10 @@ rm -rf %{buildroot}
 %{_mandir}/*/*
 
 %changelog
-* Mon Mar 19 2012 Steve Dickson <steved at redhat.com> 0.2.1-3
+* Thu Apr 26 2012 Steve Dickson <steved at redhat.com> 0.2.1-4.1
+- Updated to latest upstream RC release: libtirpc-0.2.3-rc3
+
+* Mon Mar 19 2012 Steve Dickson <steved at redhat.com> 0.2.1-3.1
 - Fixed the install path in doc/Makefile.am
 
 * Fri Jan 13 2012 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 0.2.2-2.1


More information about the scm-commits mailing list