summaryrefslogtreecommitdiffstats
path: root/sys/rpc
diff options
context:
space:
mode:
authorpfg <pfg@FreeBSD.org>2012-09-01 02:56:17 +0000
committerpfg <pfg@FreeBSD.org>2012-09-01 02:56:17 +0000
commit21bc2e377fee37fa4d9358a5d7e3ac32a8507eef (patch)
tree7e86bb9e8adfdd0c721dae224c762da12dfa5170 /sys/rpc
parent8c9e04b26729438492a4b9a4af9d08aec9b3a704 (diff)
downloadFreeBSD-src-21bc2e377fee37fa4d9358a5d7e3ac32a8507eef.zip
FreeBSD-src-21bc2e377fee37fa4d9358a5d7e3ac32a8507eef.tar.gz
Bring some changes from Bull's NFSv4 libtirpc implementation.
We especifically ignored the glibc compatibility changes but this should help interaction with Solaris and Linux. ____ Fixed infinite loop in svc_run() author Steve Dickson Tue, 10 Jun 2008 12:35:52 -0500 (13:35 -0400) Fixed infinite loop in svc_run() ____ __rpc_taddr2uaddr_af() assumes the netbuf to always have a non-zero data. This is a bad assumption and can lead to a seg-fault. This patch adds a check for zero length and returns NULL when found. author Steve Dickson Mon, 27 Oct 2008 11:46:54 -0500 (12:46 -0400) ____ Changed clnt_spcreateerror() to return clearer and more concise error messages. author Steve Dickson Thu, 20 Nov 2008 08:55:31 -0500 (08:55 -0500) ____ Converted all uid and gid variables of the type uid_t and gid_t. author Steve Dickson Wed, 28 Jan 2009 12:44:46 -0500 (12:44 -0500) ____ libtirpc: set r_netid and r_owner in __rpcb_findaddr_timed These fields in the rpcbind GETADDR call are being passed uninitialized to CLNT_CALL. In the case of x86_64 at least, this usually leads to a segfault. On x86, it sometimes causes segfaults and other times causes garbage to be sent on the wire. rpcbind generally ignores the r_owner field for calls that come in over the wire, so it really doesn't matter what we send in that slot. We just need to send something. The reference implementation from Sun seems to send a blank string. Have ours follow suit. author Jeff Layton Fri, 13 Mar 2009 11:44:16 -0500 (12:44 -0400) ____ libtirpc: be sure to free cl_netid and cl_tp When creating a client with clnt_tli_create, it uses strdup to copy strings for these fields if nconf is passed in. clnt_dg_destroy frees these strings already. Make sure clnt_vc_destroy frees them in the same way. author Jeff Layton Fri, 13 Mar 2009 11:47:36 -0500 (12:47 -0400) Obtained from: Bull GNU/Linux NFSv4 Project MFC after: 3 weeks
Diffstat (limited to 'sys/rpc')
-rw-r--r--sys/rpc/auth.h9
-rw-r--r--sys/rpc/clnt_vc.c4
-rw-r--r--sys/rpc/rpcb_clnt.c7
3 files changed, 15 insertions, 5 deletions
diff --git a/sys/rpc/auth.h b/sys/rpc/auth.h
index 6be08b6..5ec8541 100644
--- a/sys/rpc/auth.h
+++ b/sys/rpc/auth.h
@@ -234,18 +234,17 @@ __END_DECLS
* System style authentication
* 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;
*/
__BEGIN_DECLS
#ifdef _KERNEL
struct ucred;
extern AUTH *authunix_create(struct ucred *);
#else
-extern AUTH *authunix_create(char *, int, int, int,
- int *);
+extern AUTH *authunix_create(char *, uid_t, gid_t, int, gid_t *);
extern AUTH *authunix_create_default(void); /* takes no parameters */
#endif
extern AUTH *authnone_create(void); /* takes no parameters */
diff --git a/sys/rpc/clnt_vc.c b/sys/rpc/clnt_vc.c
index ea3b7d1..26f23fa 100644
--- a/sys/rpc/clnt_vc.c
+++ b/sys/rpc/clnt_vc.c
@@ -836,6 +836,10 @@ clnt_vc_destroy(CLIENT *cl)
soclose(so);
}
mem_free(ct, sizeof(struct ct_data));
+ if (cl->cl_netid && cl->cl_netid[0])
+ mem_free(cl->cl_netid, strlen(cl->cl_netid) +1);
+ if (cl->cl_tp && cl->cl_tp[0])
+ mem_free(cl->cl_tp, strlen(cl->cl_tp) +1);
mem_free(cl, sizeof(CLIENT));
}
diff --git a/sys/rpc/rpcb_clnt.c b/sys/rpc/rpcb_clnt.c
index d484df3..4106dfd 100644
--- a/sys/rpc/rpcb_clnt.c
+++ b/sys/rpc/rpcb_clnt.c
@@ -780,6 +780,13 @@ __rpcb_findaddr_timed(program, version, nconf, host, clpp, tp)
}
parms.r_addr = NULL;
+ parms.r_netid = nconf->nc_netid;
+
+ /*
+ * According to wire captures, the reference implementation
+ * (OpenSolaris) sends a blank string here too.
+ */
+ parms.r_owner = "";
/*
* Use default total timeout if no timeout is specified.
OpenPOWER on IntegriCloud