NLM: Fix a regression in lockd
Nick Bowler reports:
There are no unusual messages on the client... but I just logged into
the server and I see lots of messages of the following form:
nfsd: request from insecure port (192.168.8.199:35766)!
nfsd: request from insecure port (192.168.8.199:35766)!
nfsd: request from insecure port (192.168.8.199:35766)!
nfsd: request from insecure port (192.168.8.199:35766)!
nfsd: request from insecure port (192.168.8.199:35766)!
Bisected to commit 9247685088
(SUNRPC:
Properly initialize sock_xprt.srcaddr in all cases)
Apparently, removing the 'transport->srcaddr.ss_family = family' from
xs_create_sock() triggers this due to nlmclnt_lookup_host() incorrectly
initialising the srcaddr family to AF_UNSPEC.
Reported-by: Nick Bowler <nbowler@elliptictech.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
6800e4c0ea
commit
8e35f8e7c6
@ -124,7 +124,7 @@ static struct nlm_host *nlm_lookup_host(struct nlm_lookup_host_info *ni)
|
||||
continue;
|
||||
if (host->h_server != ni->server)
|
||||
continue;
|
||||
if (ni->server &&
|
||||
if (ni->server && ni->src_len != 0 &&
|
||||
!rpc_cmp_addr(nlm_srcaddr(host), ni->src_sap))
|
||||
continue;
|
||||
|
||||
@ -167,6 +167,7 @@ static struct nlm_host *nlm_lookup_host(struct nlm_lookup_host_info *ni)
|
||||
host->h_addrlen = ni->salen;
|
||||
rpc_set_port(nlm_addr(host), 0);
|
||||
memcpy(nlm_srcaddr(host), ni->src_sap, ni->src_len);
|
||||
host->h_srcaddrlen = ni->src_len;
|
||||
host->h_version = ni->version;
|
||||
host->h_proto = ni->protocol;
|
||||
host->h_rpcclnt = NULL;
|
||||
@ -238,9 +239,6 @@ struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap,
|
||||
const char *hostname,
|
||||
int noresvport)
|
||||
{
|
||||
const struct sockaddr source = {
|
||||
.sa_family = AF_UNSPEC,
|
||||
};
|
||||
struct nlm_lookup_host_info ni = {
|
||||
.server = 0,
|
||||
.sap = sap,
|
||||
@ -249,8 +247,6 @@ struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap,
|
||||
.version = version,
|
||||
.hostname = hostname,
|
||||
.hostname_len = strlen(hostname),
|
||||
.src_sap = &source,
|
||||
.src_len = sizeof(source),
|
||||
.noresvport = noresvport,
|
||||
};
|
||||
|
||||
@ -357,7 +353,6 @@ nlm_bind_host(struct nlm_host *host)
|
||||
.protocol = host->h_proto,
|
||||
.address = nlm_addr(host),
|
||||
.addrsize = host->h_addrlen,
|
||||
.saddress = nlm_srcaddr(host),
|
||||
.timeout = &timeparms,
|
||||
.servername = host->h_name,
|
||||
.program = &nlm_program,
|
||||
@ -376,6 +371,8 @@ nlm_bind_host(struct nlm_host *host)
|
||||
args.flags |= RPC_CLNT_CREATE_HARDRTRY;
|
||||
if (host->h_noresvport)
|
||||
args.flags |= RPC_CLNT_CREATE_NONPRIVPORT;
|
||||
if (host->h_srcaddrlen)
|
||||
args.saddress = nlm_srcaddr(host);
|
||||
|
||||
clnt = rpc_create(&args);
|
||||
if (!IS_ERR(clnt))
|
||||
|
@ -43,6 +43,7 @@ struct nlm_host {
|
||||
struct sockaddr_storage h_addr; /* peer address */
|
||||
size_t h_addrlen;
|
||||
struct sockaddr_storage h_srcaddr; /* our address (optional) */
|
||||
size_t h_srcaddrlen;
|
||||
struct rpc_clnt *h_rpcclnt; /* RPC client to talk to peer */
|
||||
char *h_name; /* remote hostname */
|
||||
u32 h_version; /* interface version */
|
||||
|
Loading…
Reference in New Issue
Block a user