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:
@@ -124,7 +124,7 @@ static struct nlm_host *nlm_lookup_host(struct nlm_lookup_host_info *ni)
|
|||||||
continue;
|
continue;
|
||||||
if (host->h_server != ni->server)
|
if (host->h_server != ni->server)
|
||||||
continue;
|
continue;
|
||||||
if (ni->server &&
|
if (ni->server && ni->src_len != 0 &&
|
||||||
!rpc_cmp_addr(nlm_srcaddr(host), ni->src_sap))
|
!rpc_cmp_addr(nlm_srcaddr(host), ni->src_sap))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -167,6 +167,7 @@ static struct nlm_host *nlm_lookup_host(struct nlm_lookup_host_info *ni)
|
|||||||
host->h_addrlen = ni->salen;
|
host->h_addrlen = ni->salen;
|
||||||
rpc_set_port(nlm_addr(host), 0);
|
rpc_set_port(nlm_addr(host), 0);
|
||||||
memcpy(nlm_srcaddr(host), ni->src_sap, ni->src_len);
|
memcpy(nlm_srcaddr(host), ni->src_sap, ni->src_len);
|
||||||
|
host->h_srcaddrlen = ni->src_len;
|
||||||
host->h_version = ni->version;
|
host->h_version = ni->version;
|
||||||
host->h_proto = ni->protocol;
|
host->h_proto = ni->protocol;
|
||||||
host->h_rpcclnt = NULL;
|
host->h_rpcclnt = NULL;
|
||||||
@@ -238,9 +239,6 @@ struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap,
|
|||||||
const char *hostname,
|
const char *hostname,
|
||||||
int noresvport)
|
int noresvport)
|
||||||
{
|
{
|
||||||
const struct sockaddr source = {
|
|
||||||
.sa_family = AF_UNSPEC,
|
|
||||||
};
|
|
||||||
struct nlm_lookup_host_info ni = {
|
struct nlm_lookup_host_info ni = {
|
||||||
.server = 0,
|
.server = 0,
|
||||||
.sap = sap,
|
.sap = sap,
|
||||||
@@ -249,8 +247,6 @@ struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap,
|
|||||||
.version = version,
|
.version = version,
|
||||||
.hostname = hostname,
|
.hostname = hostname,
|
||||||
.hostname_len = strlen(hostname),
|
.hostname_len = strlen(hostname),
|
||||||
.src_sap = &source,
|
|
||||||
.src_len = sizeof(source),
|
|
||||||
.noresvport = noresvport,
|
.noresvport = noresvport,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -357,7 +353,6 @@ nlm_bind_host(struct nlm_host *host)
|
|||||||
.protocol = host->h_proto,
|
.protocol = host->h_proto,
|
||||||
.address = nlm_addr(host),
|
.address = nlm_addr(host),
|
||||||
.addrsize = host->h_addrlen,
|
.addrsize = host->h_addrlen,
|
||||||
.saddress = nlm_srcaddr(host),
|
|
||||||
.timeout = &timeparms,
|
.timeout = &timeparms,
|
||||||
.servername = host->h_name,
|
.servername = host->h_name,
|
||||||
.program = &nlm_program,
|
.program = &nlm_program,
|
||||||
@@ -376,6 +371,8 @@ nlm_bind_host(struct nlm_host *host)
|
|||||||
args.flags |= RPC_CLNT_CREATE_HARDRTRY;
|
args.flags |= RPC_CLNT_CREATE_HARDRTRY;
|
||||||
if (host->h_noresvport)
|
if (host->h_noresvport)
|
||||||
args.flags |= RPC_CLNT_CREATE_NONPRIVPORT;
|
args.flags |= RPC_CLNT_CREATE_NONPRIVPORT;
|
||||||
|
if (host->h_srcaddrlen)
|
||||||
|
args.saddress = nlm_srcaddr(host);
|
||||||
|
|
||||||
clnt = rpc_create(&args);
|
clnt = rpc_create(&args);
|
||||||
if (!IS_ERR(clnt))
|
if (!IS_ERR(clnt))
|
||||||
|
@@ -43,6 +43,7 @@ struct nlm_host {
|
|||||||
struct sockaddr_storage h_addr; /* peer address */
|
struct sockaddr_storage h_addr; /* peer address */
|
||||||
size_t h_addrlen;
|
size_t h_addrlen;
|
||||||
struct sockaddr_storage h_srcaddr; /* our address (optional) */
|
struct sockaddr_storage h_srcaddr; /* our address (optional) */
|
||||||
|
size_t h_srcaddrlen;
|
||||||
struct rpc_clnt *h_rpcclnt; /* RPC client to talk to peer */
|
struct rpc_clnt *h_rpcclnt; /* RPC client to talk to peer */
|
||||||
char *h_name; /* remote hostname */
|
char *h_name; /* remote hostname */
|
||||||
u32 h_version; /* interface version */
|
u32 h_version; /* interface version */
|
||||||
|
Reference in New Issue
Block a user