mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 22:14:03 +02:00
Merge branch 'fixes-for-bpf_get_fsverity_digest'
Eric Biggers says:
====================
Fixes for bpf_get_fsverity_digest()
Two fixes for bpf_get_fsverity_digest().
Changed in v2:
- Added patch to fix silent truncation.
- Updated commit message to clarify that the size > INT_MAX case
seems to be unreachable currently.
- Added Acked-bys
====================
Link: https://patch.msgid.link/20260803181232.14743-1-ebiggers@kernel.org
Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
This commit is contained in:
commit
7cd8645d2b
|
|
@ -122,11 +122,11 @@ __bpf_kfunc int bpf_get_fsverity_digest(struct file *file, const struct bpf_dynp
|
|||
{
|
||||
const struct bpf_dynptr_kern *digest_ptr = (struct bpf_dynptr_kern *)digest_p;
|
||||
const struct inode *inode = file_inode(file);
|
||||
u32 dynptr_sz = __bpf_dynptr_size(digest_ptr);
|
||||
u64 dynptr_sz = __bpf_dynptr_size(digest_ptr);
|
||||
struct fsverity_digest *arg;
|
||||
const struct fsverity_info *vi;
|
||||
const struct fsverity_hash_alg *hash_alg;
|
||||
int out_digest_sz;
|
||||
u64 out_digest_sz;
|
||||
|
||||
if (dynptr_sz < sizeof(struct fsverity_digest))
|
||||
return -EINVAL;
|
||||
|
|
@ -144,17 +144,20 @@ __bpf_kfunc int bpf_get_fsverity_digest(struct file *file, const struct bpf_dynp
|
|||
|
||||
hash_alg = vi->tree_params.hash_alg;
|
||||
|
||||
out_digest_sz = dynptr_sz - sizeof(struct fsverity_digest);
|
||||
if (out_digest_sz < hash_alg->digest_size)
|
||||
return -EOVERFLOW;
|
||||
|
||||
arg->digest_algorithm = hash_alg - fsverity_hash_algs;
|
||||
arg->digest_size = hash_alg->digest_size;
|
||||
|
||||
out_digest_sz = dynptr_sz - sizeof(struct fsverity_digest);
|
||||
|
||||
/* copy digest */
|
||||
memcpy(arg->digest, vi->file_digest, min_t(int, hash_alg->digest_size, out_digest_sz));
|
||||
memcpy(arg->digest, vi->file_digest, hash_alg->digest_size);
|
||||
|
||||
/* fill the extra buffer with zeros */
|
||||
if (out_digest_sz > hash_alg->digest_size)
|
||||
memset(arg->digest + arg->digest_size, 0, out_digest_sz - hash_alg->digest_size);
|
||||
memset(arg->digest + hash_alg->digest_size, 0,
|
||||
out_digest_sz - hash_alg->digest_size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user