Fix verity_fec_ctr() to reject too-small hash devices by correctly
taking hash_start into account.

Note that this is necessary because dm-verity doesn't call
dm_bufio_set_sector_offset() on the hash device's bufio client
(v->bufio).  Thus, dm_bufio_get_device_size(v->bufio) returns a size
relative to 0 rather than hash_start.  An alternative fix would be to
call dm_bufio_set_sector_offset() on v->bufio, but then all the code
that reads from the hash device would have to be adjusted accordingly.

Fixes: a739ff3f543a ("dm verity: add support for forward error correction")
Cc: [email protected]
Signed-off-by: Eric Biggers <[email protected]>
---
 drivers/md/dm-verity-fec.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c
index 5c276d0fc20c0..9f06bd66bae31 100644
--- a/drivers/md/dm-verity-fec.c
+++ b/drivers/md/dm-verity-fec.c
@@ -686,11 +686,12 @@ int verity_fec_ctr(struct dm_verity *v)
        /*
         * Metadata is accessed through the hash device, so we require
         * it to be large enough.
         */
        f->hash_blocks = f->blocks - v->data_blocks;
-       if (dm_bufio_get_device_size(v->bufio) < f->hash_blocks) {
+       if (dm_bufio_get_device_size(v->bufio) <
+           v->hash_start + f->hash_blocks) {
                ti->error = "Hash device is too small for "
                        DM_VERITY_OPT_FEC_BLOCKS;
                return -E2BIG;
        }
 
-- 
2.52.0


Reply via email to