[PATCH] NLM: AF_UNSPEC addresses are all equal

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The nlm_cmp_addr() function, which compares two IP addresses, is
sometimes used to check AF_UNSPEC addresses.  If both addresses are
AF_UNSPEC, then it should consider them equal -- the contents of an
AF_UNSPEC address, other than the address family, are
inconsequential.

This is important because the loop in nlm_lookup_host() always
compares the h_srcaddr field to the incoming source address.  For
client nlm_host entries, both are always AF_UNSPEC, and should allow
the entry match to succeed.  If it always fails, then we create a
fresh nlm_host entry every time we mount the same server, even if
all other items in the existing entry (protocol, NLM version, host
address) match.

These extra entries will eventually expire once the server is
unmounted, so the impact of this bug, introduced in 2.6.28 with
commit 781b61a6, should be minor.

Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx>
---
Bruce-

Another minor lockd IPv6 bug fix for 2.6.28.

Alternate fix for this problem is to change nlm_lookup_host() so that
it compares the srcaddrs only when h_server is set.

 include/linux/lockd/lockd.h |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h
index b56d5aa..e8aa108 100644
--- a/include/linux/lockd/lockd.h
+++ b/include/linux/lockd/lockd.h
@@ -344,6 +344,8 @@ static inline int nlm_cmp_addr(const struct sockaddr *sap1,
 {
 	if (sap1->sa_family == sap2->sa_family) {
 		switch (sap1->sa_family) {
+		case AF_UNSPEC:
+			return 1;
 		case AF_INET:
 			return __nlm_cmp_addr4(sap1, sap2);
 		case AF_INET6:

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux