kernfs: Fix kernfs_name_compare
Returning a difference from a comparison functions is usually wrong (see acbbe6fbb240 "kcmp: fix standard comparison bug" for the long story). Here there is the additional twist that if the void pointers ns and kn->ns happen to differ by a multiple of 2^32, kernfs_name_compare returns 0, falsely reporting a match to the caller. Technically 'hash - kn->hash' is ok since the hashes are restricted to 31 bits, but it's better to avoid that subtlety. Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> Acked-by: Tejun Heo <tj@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
b7392d2247
commit
72392ed0eb
@ -201,10 +201,14 @@ static unsigned int kernfs_name_hash(const char *name, const void *ns)
|
||||
static int kernfs_name_compare(unsigned int hash, const char *name,
|
||||
const void *ns, const struct kernfs_node *kn)
|
||||
{
|
||||
if (hash != kn->hash)
|
||||
return hash - kn->hash;
|
||||
if (ns != kn->ns)
|
||||
return ns - kn->ns;
|
||||
if (hash < kn->hash)
|
||||
return -1;
|
||||
if (hash > kn->hash)
|
||||
return 1;
|
||||
if (ns < kn->ns)
|
||||
return -1;
|
||||
if (ns > kn->ns)
|
||||
return 1;
|
||||
return strcmp(name, kn->name);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user