nfs: fix bug about IPv6 address scope checking
Subsystems (2)
PATCH 1/1 nfs: fix bug about IPv6 address scope checking
The result from ipv6_addr_scope() always not be a single SCOPE, so we can't use equal to compare the result with IPV6_ADDR_SCOPE_LINKLOCAL at nfs_sockaddr_match_ipaddr6.
This patch fixs the problem, and lets checking address before scope_id.
Signed-off-by Mi Jinlong <[email protected]>
--- fs/nfs/client.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-)
fs/nfs/client.c +4 -3
@@ -336,11 +336,12 @@ static int nfs_sockaddr_match_ipaddr6(const struct sockaddr *sa1,const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sa1;const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sa2; -if (ipv6_addr_scope (&sin1->sin6_addr) ==IPV6_ADDR_SCOPE_LINKLOCAL && - sin1->sin6_scope_id != sin2->sin6_scope_id) +if (!ipv6_addr_equal (&sin1->sin6_addr, &sin2->sin6_addr))return 0 ; +else if (ipv6_addr_type (&sin1->sin6_addr) &IPV6_ADDR_LINKLOCAL ) +return sin1->sin6_scope_id == sin2->sin6_scope_id; -return ipv6_addr_equal (&sin1->sin6_addr, &sin2->sin6_addr); +return 1 ; }#else /* !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE) */ static int nfs_sockaddr_match_ipaddr6(const struct sockaddr *sa1,
Signature · 1 line
1.7.6
Quoted 5 lines · Mi Jinlong
The result from
ipv6_addr_scope()always not be a single SCOPE, so we can't use equal to compare the result withIPV6_ADDR_SCOPE_LINKLOCALatnfs_sockaddr_match_ipaddr6.This patch fixs the problem, and lets checking address before
scope_id.
Looks right to me, thanks; committing unless someone else catches a problem.
--b.
Quoted 31 lines
Signed-off-by Mi Jinlong <[email protected]>--- fs/nfs/client.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-)fs/nfs/client.c +4
-3@@ -336,11 +336,12 @@ static int nfs_sockaddr_match_ipaddr6(const struct sockaddr *sa1,const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sa1;const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sa2; -if (ipv6_addr_scope (&sin1->sin6_addr) ==IPV6_ADDR_SCOPE_LINKLOCAL && - sin1->sin6_scope_id != sin2->sin6_scope_id) +if (!ipv6_addr_equal (&sin1->sin6_addr, &sin2->sin6_addr))return 0 ; +else if (ipv6_addr_type (&sin1->sin6_addr) &IPV6_ADDR_LINKLOCAL ) +return sin1->sin6_scope_id == sin2->sin6_scope_id; -return ipv6_addr_equal (&sin1->sin6_addr, &sin2->sin6_addr); +return 1 ; }#else /* !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE) */ static int nfs_sockaddr_match_ipaddr6(const struct sockaddr *sa1,Signature · 1 line
1.7.6