SOURCES: libtirpc-git.patch (NEW) - fixes from libtirpc GIT

baggins baggins at pld-linux.org
Wed Mar 4 23:01:01 CET 2009


Author: baggins                      Date: Wed Mar  4 22:01:01 2009 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- fixes from libtirpc GIT

---- Files affected:
SOURCES:
   libtirpc-git.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/libtirpc-git.patch
diff -u /dev/null SOURCES/libtirpc-git.patch:1.1
--- /dev/null	Wed Mar  4 23:01:02 2009
+++ SOURCES/libtirpc-git.patch	Wed Mar  4 23:00:56 2009
@@ -0,0 +1,357 @@
+commit 951a1b9b0195cbe58e1e62142e84d7ec4658943f
+Author: Steve Dickson <steved at redhat.com>
+Date:   Wed Jan 28 12:44:46 2009 -0500
+
+    Converted all uid and gid variables of the type uid_t and gid_t.
+    
+    Signed-off-by: Steve Dickson <steved at redhat.com>
+
+commit 5bc80ccd81e0c7ef185de34e7f34a7766bce0e27
+Author: Steve Dickson <steved at redhat.com>
+Date:   Wed Jan 28 09:56:10 2009 -0500
+
+    Removed a number warnings by adding a number of type casts.
+    
+    Signed-off-by: Steve Dickson <steved at redhat.com>
+
+commit 2bb4c8d7ec8a98e1be9133d5901149a81ea9b5d9
+Author: Chuck Lever <chuck.lever at oracle.com>
+Date:   Wed Jan 28 09:19:07 2009 -0500
+
+    backwards compatibility: fix order of fields in TI-RPC's svc_req
+    
+    Preserve ABI compatibility between glibc's RPC implementation and
+    the legacy RPC implementation in libtirpc by moving the rq_xprt
+    field in the TI-RPC version of the svc_req struct so it is
+    backwards compatible with the legacy version of this structure.
+    
+    Linux's legacy svc_req struct, from /usr/include/rpc/svc.h, looks
+    like this:
+    
+    struct svc_req {
+      rpcprog_t rq_prog;		/* service program number */
+      rpcvers_t rq_vers;		/* service protocol version */
+      rpcproc_t rq_proc;		/* the desired procedure */
+      struct opaque_auth rq_cred;	/* raw creds from the wire */
+      caddr_t rq_clntcred;		/* read only cooked cred */
+      SVCXPRT *rq_xprt;		/* associated transport */
+    };
+    
+    The new TI-RPC svc_req struct, from /usr/include/tirpc/rpc/svc.h,
+    looks like this:
+    
+    struct svc_req {
+      u_int32_t rq_prog;		/* service program number */
+      u_int32_t rq_vers;		/* service protocol version */
+      u_int32_t rq_proc;		/* the desired procedure */
+      struct opaque_auth rq_cred;	/* raw creds from the wire */
+      void *rq_clntcred;		/* read only cooked cred */
+      caddr_t rq_clntname;		/* read only client name */
+      caddr_t rq_svcname;		/* read only cooked service cred */
+      SVCXPRT *rq_xprt;		/* associated transport */
+    };
+    
+    Note the extra fields rq_clntname and rq_svcname.  These are used for
+    TI-RPC's RPCSEC GSS flavor support.
+    
+    This issue came to light because rpc.statd still uses only legacy RPC
+    calls, and thus includes /usr/include/rpc/svc.h.  However, other parts
+    of nfs-utils now link with TI-RPC, so the legacy RPC functions in
+    libtirpc are used in favor of glibc's RPC functions.  The libtirpc svc
+    functions use the new svc_req struct, but rpc.statd uses the old
+    svc_req struct.
+    
+    Since the svc_req fields were different, rpc.statd broke after recent
+    IPv6-related changes, even though I hadn't made any changes to it.
+    Note that rpc.mountd also references the rq_xprt field, so it has the
+    same issue.
+    
+    In most operating systems, there is only one rpc/svc.h and one version
+    of svc_req so this is not a problem.  We should audit all of the
+    structures and functions under /usr/include/rpc and
+    /usr/include/tirpc/rpc to ensure we have a reasonable level of
+    backwards compatibility until such a time it is decided to merge these
+    implementations or get rid of RPC support in glibc.
+    
+    Signed-off-by: Chuck Lever <chuck.lever at oracle.com>
+    Signed-off-by: Steve Dickson <steved at redhat.com>
+
+commit 12129663ddc356aed44434aeda28ff1ce2dfc786
+Author: Sandeep Josh <sdjres at yahoo.com>
+Date:   Thu Jan 22 12:34:19 2009 -0500
+
+    tirpc header file fixes for C++
+    
+    Added a __THROW to a couple extern declarations.
+    
+    Signed-off-by: Steve Dickson <steved at redhat.com>
+
+commit e145633cf10c92aa6f24b8a1a322435b4e874b02
+Author: Steve Dickson <steved at redhat.com>
+Date:   Thu Nov 20 08:55:31 2008 -0500
+
+    Changed clnt_spcreateerror() to return clearer
+    and more concise error messages.
+    
+    Signed-off-by: Steve Dickson <steved at redhat.com>
+
+commit 7c78a0362fcd3e0749330f11d0fdecb62131a6a3
+Author: Steve Dickson <steved at redhat.com>
+Date:   Thu Nov 20 08:53:52 2008 -0500
+
+    The clnt_fd_lock mutex lock was not being
+    released during an error path in clnt_dg_call.
+    
+    Signed-off-by: Steve Dickson <steved at redhat.com>
+
+diff --git a/src/auth_gss.c b/src/auth_gss.c
+index 8f7919c..bf6cba6 100644
+--- a/src/auth_gss.c
++++ b/src/auth_gss.c
+@@ -221,7 +221,7 @@ authgss_create_default(CLIENT *clnt, char *service, struct rpc_gss_sec *sec)
+ 	sname.length = strlen(service);
+ 
+ 	maj_stat = gss_import_name(&min_stat, &sname,
+-		GSS_C_NT_HOSTBASED_SERVICE,
++		(gss_OID)GSS_C_NT_HOSTBASED_SERVICE,
+ 		&name);
+ 
+ 	if (maj_stat != GSS_S_COMPLETE) {
+diff --git a/src/auth_unix.c b/src/auth_unix.c
+index c2727e0..04ee5dd 100644
+--- a/src/auth_unix.c
++++ b/src/auth_unix.c
+@@ -84,10 +84,10 @@ struct audata {
+ AUTH *
+ authunix_create(machname, uid, gid, len, aup_gids)
+ 	char *machname;
+-	int uid;
+-	int gid;
++	uid_t uid;
++	gid_t gid;
+ 	int len;
+-	int *aup_gids;
++	gid_t *aup_gids;
+ {
+ 	struct authunix_parms aup;
+ 	char mymem[MAX_AUTH_BYTES];
+@@ -189,8 +189,7 @@ authunix_create_default()
+ 	if ((len = getgroups(NGRPS, gids)) < 0)
+ 		abort();
+ 	/* XXX: interface problem; those should all have been unsigned */
+-	return (authunix_create(machname, (int)uid, (int)gid, len,
+-	    (int *)gids));
++	return (authunix_create(machname, uid, gid, len, gids));
+ }
+ 
+ /*
+diff --git a/src/authgss_prot.c b/src/authgss_prot.c
+index 97724f1..be0d1a6 100644
+--- a/src/authgss_prot.c
++++ b/src/authgss_prot.c
+@@ -176,10 +176,11 @@ xdr_rpc_gss_unwrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
+ 	XDR		tmpxdrs;
+ 	gss_buffer_desc	databuf, wrapbuf;
+ 	OM_uint32	maj_stat, min_stat;
+-	u_int		seq_num, conf_state, qop_state;
++	u_int		seq_num, qop_state;
++	int			conf_state;
+ 	bool_t		xdr_stat;
+ 
+-	if (xdr_func == xdr_void || xdr_ptr == NULL)
++	if (xdr_func == (xdrproc_t)xdr_void || xdr_ptr == NULL)
+ 		return (TRUE);
+ 
+ 	memset(&databuf, 0, sizeof(databuf));
+diff --git a/src/authunix_prot.c b/src/authunix_prot.c
+index 01c1711..79f2fb6 100644
+--- a/src/authunix_prot.c
++++ b/src/authunix_prot.c
+@@ -57,8 +57,8 @@ xdr_authunix_parms(xdrs, p)
+ 
+ 	if (xdr_u_long(xdrs, &(p->aup_time))
+ 	    && xdr_string(xdrs, &(p->aup_machname), MAX_MACHINE_NAME)
+-	    && xdr_int(xdrs, &(p->aup_uid))
+-	    && xdr_int(xdrs, &(p->aup_gid))
++	    && xdr_u_int(xdrs, &(p->aup_uid))
++	    && xdr_u_int(xdrs, &(p->aup_gid))
+ 	    && xdr_array(xdrs, (caddr_t *)&(p->aup_gids),
+ 		    &(p->aup_len), NGRPS, sizeof(int), (xdrproc_t)xdr_int) ) {
+ 		return (TRUE);
+diff --git a/src/clnt_dg.c b/src/clnt_dg.c
+index da01c5b..9a574eb 100644
+--- a/src/clnt_dg.c
++++ b/src/clnt_dg.c
+@@ -402,6 +402,7 @@ get_reply:
+ 
+         fd.fd = cu->cu_fd;
+         fd.events = POLLIN;
++        fd.revents = 0;
+ 	while (total_time > 0) {
+ 		tv = total_time < nextsend_time ? total_time : nextsend_time;
+                 switch (poll(&fd, 1, tv)) {
+@@ -455,6 +456,7 @@ get_reply:
+ 		{
+ 		  e = (struct sock_extended_err *) CMSG_DATA(cmsg);
+ 		  cu->cu_error.re_errno = e->ee_errno;
++		  release_fd_lock(cu->cu_fd, mask);
+ 		  return (cu->cu_error.re_status = RPC_CANTRECV);
+ 		}
+ 	}
+diff --git a/src/clnt_perror.c b/src/clnt_perror.c
+index 8f53f8e..1c1c705 100644
+--- a/src/clnt_perror.c
++++ b/src/clnt_perror.c
+@@ -239,7 +239,7 @@ char *
+ clnt_spcreateerror(s)
+ 	const char *s;
+ {
+-	char *str;
++	char *str, *err;
+ 	size_t len, i;
+ 
+ 	if (s == NULL)
+@@ -257,8 +257,21 @@ clnt_spcreateerror(s)
+ 	switch (rpc_createerr.cf_stat) {
+ 	case RPC_PMAPFAILURE:
+ 		(void) strncat(str, " - ", len - 1);
+-		(void) strncat(str,
+-		    clnt_sperrno(rpc_createerr.cf_error.re_status), len - 4);
++		 err = clnt_sperrno(rpc_createerr.cf_error.re_status);
++		if (err)
++			(void) strncat(str, err+5, len-5);
++		switch(rpc_createerr.cf_error.re_status) {
++		case RPC_CANTSEND:
++		case RPC_CANTRECV:
++			i = strlen(str);
++			len -= i;
++			snprintf(str+i, len, ": errno %d (%s)", 
++				rpc_createerr.cf_error.re_errno,
++				strerror(rpc_createerr.cf_error.re_errno)); 
++			break;
++		default:
++			break;
++		}
+ 		break;
+ 
+ 	case RPC_SYSTEMERROR:
+diff --git a/src/svc_auth_gss.c b/src/svc_auth_gss.c
+index 346e5b1..9e9ff81 100644
+--- a/src/svc_auth_gss.c
++++ b/src/svc_auth_gss.c
+@@ -190,7 +190,7 @@ svcauth_gss_accept_sec_context(struct svc_req *rqst,
+ 	/* Deserialize arguments. */
+ 	memset(&recv_tok, 0, sizeof(recv_tok));
+ 
+-	if (!svc_getargs(rqst->rq_xprt, xdr_rpc_gss_init_args,
++	if (!svc_getargs(rqst->rq_xprt, (xdrproc_t)xdr_rpc_gss_init_args,
+ 			 (caddr_t)&recv_tok))
+ 		return (FALSE);
+ 
+@@ -469,8 +469,8 @@ _svcauth_gss(struct svc_req *rqst, struct rpc_msg *msg, bool_t *no_dispatch)
+ 
+ 		*no_dispatch = TRUE;
+ 
+-		call_stat = svc_sendreply(rqst->rq_xprt, xdr_rpc_gss_init_res,
+-					  (caddr_t)&gr);
++		call_stat = svc_sendreply(rqst->rq_xprt, 
++			(xdrproc_t)xdr_rpc_gss_init_res, (caddr_t)&gr);
+ 
+ 		if (!call_stat)
+ 			return (AUTH_FAILED);
+diff --git a/src/svc_auth_unix.c b/src/svc_auth_unix.c
+index 77a1272..7a7eeaa 100644
+--- a/src/svc_auth_unix.c
++++ b/src/svc_auth_unix.c
+@@ -59,7 +59,7 @@ _svcauth_unix(rqst, msg)
+ 	struct area {
+ 		struct authunix_parms area_aup;
+ 		char area_machname[MAX_MACHINE_NAME+1];
+-		int area_gids[NGRPS];
++		gid_t area_gids[NGRPS];
+ 	} *area;
+ 	u_int auth_len;
+ 	size_t str_len, gid_len;
+diff --git a/tirpc/rpc/auth.h b/tirpc/rpc/auth.h
+index c6c418c..532a8cb 100644
+--- a/tirpc/rpc/auth.h
++++ b/tirpc/rpc/auth.h
+@@ -279,8 +279,7 @@ int authany_wrap(void), authany_unwrap(void);
+  *	int *aup_gids;
+  */
+ __BEGIN_DECLS
+-extern AUTH *authunix_create(char *, int, int, int,
+-    int *);
++extern AUTH *authunix_create(char *, uid_t, uid_t, int, uid_t *);
+ extern AUTH *authunix_create_default(void);	/* takes no parameters */
+ extern AUTH *authnone_create(void);		/* takes no parameters */
+ __END_DECLS
+diff --git a/tirpc/rpc/auth_unix.h b/tirpc/rpc/auth_unix.h
+index 41f0f44..0839fb3 100644
+--- a/tirpc/rpc/auth_unix.h
++++ b/tirpc/rpc/auth_unix.h
+@@ -60,10 +60,10 @@
+ struct authunix_parms {
+ 	u_long	 aup_time;
+ 	char	*aup_machname;
+-	int	 aup_uid;
+-	int	 aup_gid;
++	uid_t 	 aup_uid;
++	gid_t  	 aup_gid;
+ 	u_int	 aup_len;
+-	int	*aup_gids;
++	gid_t 	*aup_gids;
+ };
+ 
+ #define authsys_parms authunix_parms
+diff --git a/tirpc/rpc/rpc.h b/tirpc/rpc/rpc.h
+index 23e3197..f93479e 100644
+--- a/tirpc/rpc/rpc.h
++++ b/tirpc/rpc/rpc.h
+@@ -83,7 +83,7 @@
+ 
+ __BEGIN_DECLS
+ extern int get_myaddress(struct sockaddr_in *);
+-extern int bindresvport(int, struct sockaddr_in *);
++extern int bindresvport(int, struct sockaddr_in *) __THROW;
+ extern int registerrpc(int, int, int, char *(*)(char [UDPMSGSIZE]),
+     xdrproc_t, xdrproc_t);
+ extern int callrpc(const char *, int, int, int, xdrproc_t, void *,
+diff --git a/tirpc/rpc/rpcent.h b/tirpc/rpc/rpcent.h
+index eff86aa..1cee74c 100644
+--- a/tirpc/rpc/rpcent.h
++++ b/tirpc/rpc/rpcent.h
+@@ -62,8 +62,8 @@ __BEGIN_DECLS
+ //extern struct rpcent *getrpcbyname(char *);
+ //extern struct rpcent *getrpcbynumber(int);
+ //extern struct rpcent *getrpcent(void);
+-extern void setrpcent(int);
+-extern void endrpcent(void);
++extern void setrpcent(int) __THROW;
++extern void endrpcent(void) __THROW;
+ __END_DECLS
+ 
+ #endif /* !_RPC_CENT_H */
+diff --git a/tirpc/rpc/svc.h b/tirpc/rpc/svc.h
+index ec5914f..ea2985d 100644
+--- a/tirpc/rpc/svc.h
++++ b/tirpc/rpc/svc.h
+@@ -131,14 +131,17 @@ typedef struct __rpc_svcxprt {
+  * Service request
+  */
+ struct svc_req {
++	/* ORDER: compatibility with legacy RPC */
+ 	u_int32_t	rq_prog;	/* service program number */
+ 	u_int32_t	rq_vers;	/* service protocol version */
+ 	u_int32_t	rq_proc;	/* the desired procedure */
+ 	struct opaque_auth rq_cred;	/* raw creds from the wire */
+ 	void		*rq_clntcred;	/* read only cooked cred */
++	SVCXPRT		*rq_xprt;	/* associated transport */
++
++	/* New with TI-RPC */
+ 	caddr_t		rq_clntname;	/* read only client name */
+ 	caddr_t		rq_svcname;	/* read only cooked service cred */
+-	SVCXPRT		*rq_xprt;	/* associated transport */
+ };
+ 
+ /*
================================================================


More information about the pld-cvs-commit mailing list