提交 72392ed0 编写于 作者: R Rasmus Villemoes 提交者: Greg Kroah-Hartman

kernfs: Fix kernfs_name_compare

Returning a difference from a comparison functions is usually wrong
(see acbbe6fb "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: NRasmus Villemoes <linux@rasmusvillemoes.dk>
Acked-by: NTejun Heo <tj@kernel.org>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 b7392d22
...@@ -201,10 +201,14 @@ static unsigned int kernfs_name_hash(const char *name, const void *ns) ...@@ -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, static int kernfs_name_compare(unsigned int hash, const char *name,
const void *ns, const struct kernfs_node *kn) const void *ns, const struct kernfs_node *kn)
{ {
if (hash != kn->hash) if (hash < kn->hash)
return hash - kn->hash; return -1;
if (ns != kn->ns) if (hash > kn->hash)
return ns - kn->ns; return 1;
if (ns < kn->ns)
return -1;
if (ns > kn->ns)
return 1;
return strcmp(name, kn->name); return strcmp(name, kn->name);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册