Fix the krpc so that it can handle NFSv3,UDP mounts with a read/write
data size greater than 8192. Since soreserve(so, 256*1024, 256*1024) would always fail for the default value of sb_max, modify clnt_dg.c so that it uses the calculated values and checks for an error return from soreserve(). Also, add a check for error return from soreserve() to clnt_vc.c and change __rpc_get_t_size() to use sb_max_adj instead of the bogus maxsize == 256*1024. PR: kern/150910 Reviewed by: jhb MFC after: 2 weeks
This commit is contained in:
parent
ac731af567
commit
cec077bc8f
@ -193,6 +193,7 @@ clnt_dg_create(
|
|||||||
struct rpc_msg call_msg;
|
struct rpc_msg call_msg;
|
||||||
struct __rpc_sockinfo si;
|
struct __rpc_sockinfo si;
|
||||||
XDR xdrs;
|
XDR xdrs;
|
||||||
|
int error;
|
||||||
|
|
||||||
if (svcaddr == NULL) {
|
if (svcaddr == NULL) {
|
||||||
rpc_createerr.cf_stat = RPC_UNKNOWNADDR;
|
rpc_createerr.cf_stat = RPC_UNKNOWNADDR;
|
||||||
@ -267,7 +268,12 @@ clnt_dg_create(
|
|||||||
*/
|
*/
|
||||||
cu->cu_closeit = FALSE;
|
cu->cu_closeit = FALSE;
|
||||||
cu->cu_socket = so;
|
cu->cu_socket = so;
|
||||||
soreserve(so, 256*1024, 256*1024);
|
error = soreserve(so, (u_long)sendsz, (u_long)recvsz);
|
||||||
|
if (error != 0) {
|
||||||
|
rpc_createerr.cf_stat = RPC_FAILED;
|
||||||
|
rpc_createerr.cf_error.re_errno = error;
|
||||||
|
goto err2;
|
||||||
|
}
|
||||||
|
|
||||||
sb = &so->so_rcv;
|
sb = &so->so_rcv;
|
||||||
SOCKBUF_LOCK(&so->so_rcv);
|
SOCKBUF_LOCK(&so->so_rcv);
|
||||||
|
@ -288,13 +288,19 @@ clnt_vc_create(
|
|||||||
* Create a client handle which uses xdrrec for serialization
|
* Create a client handle which uses xdrrec for serialization
|
||||||
* and authnone for authentication.
|
* and authnone for authentication.
|
||||||
*/
|
*/
|
||||||
|
sendsz = __rpc_get_t_size(si.si_af, si.si_proto, (int)sendsz);
|
||||||
|
recvsz = __rpc_get_t_size(si.si_af, si.si_proto, (int)recvsz);
|
||||||
|
error = soreserve(ct->ct_socket, sendsz, recvsz);
|
||||||
|
if (error != 0) {
|
||||||
|
if (ct->ct_closeit) {
|
||||||
|
soclose(ct->ct_socket);
|
||||||
|
}
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
cl->cl_refs = 1;
|
cl->cl_refs = 1;
|
||||||
cl->cl_ops = &clnt_vc_ops;
|
cl->cl_ops = &clnt_vc_ops;
|
||||||
cl->cl_private = ct;
|
cl->cl_private = ct;
|
||||||
cl->cl_auth = authnone_create();
|
cl->cl_auth = authnone_create();
|
||||||
sendsz = __rpc_get_t_size(si.si_af, si.si_proto, (int)sendsz);
|
|
||||||
recvsz = __rpc_get_t_size(si.si_af, si.si_proto, (int)recvsz);
|
|
||||||
soreserve(ct->ct_socket, sendsz, recvsz);
|
|
||||||
|
|
||||||
SOCKBUF_LOCK(&ct->ct_socket->so_rcv);
|
SOCKBUF_LOCK(&ct->ct_socket->so_rcv);
|
||||||
soupcall_set(ct->ct_socket, SO_RCV, clnt_vc_soupcall, ct);
|
soupcall_set(ct->ct_socket, SO_RCV, clnt_vc_soupcall, ct);
|
||||||
|
@ -63,6 +63,8 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
#include <rpc/rpc_com.h>
|
#include <rpc/rpc_com.h>
|
||||||
|
|
||||||
|
extern u_long sb_max_adj; /* not defined in socketvar.h */
|
||||||
|
|
||||||
#if __FreeBSD_version < 700000
|
#if __FreeBSD_version < 700000
|
||||||
#define strrchr rindex
|
#define strrchr rindex
|
||||||
#endif
|
#endif
|
||||||
@ -113,9 +115,8 @@ u_int
|
|||||||
/*ARGSUSED*/
|
/*ARGSUSED*/
|
||||||
__rpc_get_t_size(int af, int proto, int size)
|
__rpc_get_t_size(int af, int proto, int size)
|
||||||
{
|
{
|
||||||
int maxsize, defsize;
|
int defsize;
|
||||||
|
|
||||||
maxsize = 256 * 1024; /* XXX */
|
|
||||||
switch (proto) {
|
switch (proto) {
|
||||||
case IPPROTO_TCP:
|
case IPPROTO_TCP:
|
||||||
defsize = 64 * 1024; /* XXX */
|
defsize = 64 * 1024; /* XXX */
|
||||||
@ -131,7 +132,7 @@ __rpc_get_t_size(int af, int proto, int size)
|
|||||||
return defsize;
|
return defsize;
|
||||||
|
|
||||||
/* Check whether the value is within the upper max limit */
|
/* Check whether the value is within the upper max limit */
|
||||||
return (size > maxsize ? (u_int)maxsize : (u_int)size);
|
return (size > sb_max_adj ? (u_int)sb_max_adj : (u_int)size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user