Skip to content

Commit

Permalink
fs/hfs/catalog.c: fix comparison bug in hfs_cat_keycmp
Browse files Browse the repository at this point in the history
Relying on the sign (after casting to int) of the difference of two
quantities for comparison is usually wrong.  For example, should a-b
turn out to be 2^31, the return value of cmp(a,b) is -2^31; but that
would also be the return value from cmp(b, a).  So a compares less than
b and b compares less than a.  One can also easily find three values
a,b,c such that a compares less than b, b compares less than c, but a
does not compare less than c.

Signed-off-by: Rasmus Villemoes <[email protected]>
Reviewed-by: Vyacheslav Dubeyko <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Villemoes authored and torvalds committed Dec 11, 2014
1 parent 705304a commit ddbc22e
Showing 1 changed file with 8 additions and 6 deletions.
14 changes: 8 additions & 6 deletions fs/hfs/catalog.c
Original file line number Diff line number Diff line change
Expand Up @@ -162,14 +162,16 @@ int hfs_cat_create(u32 cnid, struct inode *dir, struct qstr *str, struct inode *
*/
int hfs_cat_keycmp(const btree_key *key1, const btree_key *key2)
{
int retval;
__be32 k1p, k2p;

retval = be32_to_cpu(key1->cat.ParID) - be32_to_cpu(key2->cat.ParID);
if (!retval)
retval = hfs_strcmp(key1->cat.CName.name, key1->cat.CName.len,
key2->cat.CName.name, key2->cat.CName.len);
k1p = key1->cat.ParID;
k2p = key2->cat.ParID;

return retval;
if (k1p != k2p)
return be32_to_cpu(k1p) < be32_to_cpu(k2p) ? -1 : 1;

return hfs_strcmp(key1->cat.CName.name, key1->cat.CName.len,
key2->cat.CName.name, key2->cat.CName.len);
}

/* Try to get a catalog entry for given catalog id */
Expand Down

0 comments on commit ddbc22e

Please sign in to comment.