On Dec 2, 2009, at 7:16 PM, Kelly Anderson wrote:
On 12/02/2009 04:32 PM, Chuck Lever wrote:
[Cc: correct mailing list]
IPv6 support in mountd is entirely experimental (ie not guaranteed
to work), and exists only my personal git repo, not in the official
nfs-utils git repo. However, it looks like you are working against
my code.
I got it from the following.
git://git.linux-nfs.org/projects/cel/nfs-utils.git
Also, we prefer patches submitted inline, not as attachments, as
that makes it easy to hit "reply" and comment on the content of the
patch. A patch description and a Signed-off-by: line is required.
Take a look in the archives of this mailing list for examples.
Basically your patch misapplies the address mask in
check_subnet_v6, so I don't think it's the right fix. Instead of
"sin6 & mask" you have "sin6 & sin6" which basically means the mask
is ignored, and the check will always succeed.
Maybe the mask generation code in init_netmask() is not correct?
I think you missread the patch. So I posted the complete patched
function. The problem was sin6->sin6_addr.s6_addr should be sin6-
>sin6_addr.s6_addr32. It doesn't make sense to compare an 8 bit
value with a 32 bit value.
A typo. Patch merged, thanks. It may be a little while before I
publish an update.
Notice it's really comparing "address" to "sin6" so it's really
((address ^ sin6) & mask). sin6 is a poor choice of variable names
in this case since it makes it hard to interpret the code.
static int
check_subnet_v6(const struct sockaddr_in6 *address,
const struct sockaddr_in6 *mask, const struct addrinfo *ai)
{
for (; ai; ai = ai->ai_next) {
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)ai->ai_addr;
if (sin6->sin6_family != AF_INET6)
continue;
if (mask_match(address->sin6_addr.s6_addr32[0],
sin6->sin6_addr.s6_addr32[0],
mask->sin6_addr.s6_addr32[0]) &&
mask_match(address->sin6_addr.s6_addr32[1],
sin6->sin6_addr.s6_addr32[1],
mask->sin6_addr.s6_addr32[1]) &&
mask_match(address->sin6_addr.s6_addr32[2],
sin6->sin6_addr.s6_addr32[2],
mask->sin6_addr.s6_addr32[2]) &&
mask_match(address->sin6_addr.s6_addr32[3],
sin6->sin6_addr.s6_addr32[3],
mask->sin6_addr.s6_addr32[3]))
return 1;
}
return 0;
}
--- ./support/export/client.c.orig 2009-11-30 08:06:18.000000000
-0700
+++ ./support/export/client.c 2009-12-02 15:16:55.361725808 -0700
@@ -505,16 +505,16 @@ check_subnet_v6(const struct sockaddr_in
continue;
if (mask_match(address->sin6_addr.s6_addr32[0],
- sin6->sin6_addr.s6_addr[0],
+ sin6->sin6_addr.s6_addr32[0],
mask->sin6_addr.s6_addr32[0]) &&
mask_match(address->sin6_addr.s6_addr32[1],
- sin6->sin6_addr.s6_addr[1],
+ sin6->sin6_addr.s6_addr32[1],
mask->sin6_addr.s6_addr32[1]) &&
mask_match(address->sin6_addr.s6_addr32[2],
- sin6->sin6_addr.s6_addr[2],
+ sin6->sin6_addr.s6_addr32[2],
mask->sin6_addr.s6_addr32[2]) &&
mask_match(address->sin6_addr.s6_addr32[3],
- sin6->sin6_addr.s6_addr[3],
+ sin6->sin6_addr.s6_addr32[3],
mask->sin6_addr.s6_addr32[3]))
return 1;
}
--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com
--
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