summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKumar Kartikeya Dwivedi <memxor@gmail.com>2026-08-04 09:24:25 +0200
committerKumar Kartikeya Dwivedi <memxor@gmail.com>2026-08-04 09:24:25 +0200
commit7cd8645d2b23e396228c78d83ef80a210154a1d9 (patch)
treeda04d64e72a3032b5e25b45f57b984d8057ba858
parente5fd3f514e27db1f05fbd72ba615d74941e23c51 (diff)
parent7c68ed5c5ad4c185ea9654f5d8ee36560277b7dd (diff)
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>
-rw-r--r--fs/verity/measure.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/fs/verity/measure.c b/fs/verity/measure.c
index cfe2d5e535f9..68dfccb69772 100644
--- a/fs/verity/measure.c
+++ b/fs/verity/measure.c
@@ -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;
}