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:
Kumar Kartikeya Dwivedi 2026-08-04 09:24:25 +02:00
commit 7cd8645d2b
No known key found for this signature in database
GPG Key ID: 472D377B63542F83

View File

@ -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;
}