mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-11-27 20:13:57 +08:00
ext4: make xattr char unsignedness in hash explicit
Commit f3bbac3247
("ext4: deal with legacy signed xattr name hash
values") added a hashing function for the legacy case of having the
xattr hash calculated using a signed 'char' type. It left the unsigned
case alone, since it's all implicitly handled by the '-funsigned-char'
compiler option.
However, there's been some noise about back-porting it all into stable
kernels that lack the '-funsigned-char', so let's just make that at
least possible by making the whole 'this uses unsigned char' very
explicit in the code itself. Whether such a back-port is really
warranted or not, I'll leave to others, but at least together with this
change it is technically sensible.
Also, add a 'pr_warn_once()' for reporting the "hey, signedness for this
hash calculation has changed" issue. Hopefully it never triggers except
for that xfstests generic/454 test-case, but even if it does it's just
good information to have.
If for no other reason than "we can remove the legacy signed hash code
entirely if nobody ever sees the message any more".
Cc: Sasha Levin <sashal@kernel.org>
Cc: Eric Biggers <ebiggers@kernel.org>
Cc: Andreas Dilger <adilger@dilger.ca>
Cc: Theodore Ts'o <tytso@mit.edu>,
Cc: Jason Donenfeld <Jason@zx2c4.com>
Cc: Masahiro Yamada <masahiroy@kernel.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
7bf70dbb18
commit
854f0912f8
@ -482,11 +482,12 @@ ext4_xattr_inode_verify_hashes(struct inode *ea_inode,
|
||||
*/
|
||||
e_hash = ext4_xattr_hash_entry_signed(entry->e_name, entry->e_name_len,
|
||||
&tmp_data, 1);
|
||||
if (e_hash == entry->e_hash)
|
||||
return 0;
|
||||
|
||||
/* Still no match - bad */
|
||||
return -EFSCORRUPTED;
|
||||
if (e_hash != entry->e_hash)
|
||||
return -EFSCORRUPTED;
|
||||
|
||||
/* Let people know about old hash */
|
||||
pr_warn_once("ext4: filesystem with signed xattr name hash");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -3096,7 +3097,7 @@ static __le32 ext4_xattr_hash_entry(char *name, size_t name_len, __le32 *value,
|
||||
while (name_len--) {
|
||||
hash = (hash << NAME_HASH_SHIFT) ^
|
||||
(hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^
|
||||
*name++;
|
||||
(unsigned char)*name++;
|
||||
}
|
||||
while (value_count--) {
|
||||
hash = (hash << VALUE_HASH_SHIFT) ^
|
||||
|
Loading…
Reference in New Issue
Block a user