[dm-devel] [PATCH] dm-verity: Fix biovecs hash calculation regression
Mikulas Patocka
mpatocka at redhat.com
Mon Apr 14 20:29:55 UTC 2014
On Mon, 14 Apr 2014, Milan Broz wrote:
> The commit
> 003b5c5719f159f4f4bf97511c4702a0638313dd
> block: Convert drivers to immutable biovecs
>
> incorrectly converted biovec iteration in dm-verity to always
> calculate hash from full biovec, while the function need
> to calculate hash only from part of it (up to "todo"
> calculated value).
>
> This patch fixes the issue by limiting hash input to only
> really requested data size.
>
> The problem is easily reproducible using cryptsetup
> regression test for veritysetup (verity-compat-test).
>
> (Patch should be applied also to 3.14 stable.)
>
> Signed-off-by: Milan Broz <gmazyland at gmail.com>
Acked-by: Mikulas Patocka <mpatocka at redhat.com>
Cc: stable at vger.kernel.org # 3.14
> ---
> drivers/md/dm-verity.c | 15 +++++++++------
> 1 file changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/md/dm-verity.c b/drivers/md/dm-verity.c
> index 796007a..7a7bab8 100644
> --- a/drivers/md/dm-verity.c
> +++ b/drivers/md/dm-verity.c
> @@ -330,15 +330,17 @@ test_block_hash:
> return r;
> }
> }
> -
> todo = 1 << v->data_dev_block_bits;
> - while (io->iter.bi_size) {
> + do {
> u8 *page;
> + unsigned len;
> struct bio_vec bv = bio_iter_iovec(bio, io->iter);
>
> page = kmap_atomic(bv.bv_page);
> - r = crypto_shash_update(desc, page + bv.bv_offset,
> - bv.bv_len);
> + len = bv.bv_len;
> + if (likely(len >= todo))
> + len = todo;
> + r = crypto_shash_update(desc, page + bv.bv_offset, len);
> kunmap_atomic(page);
>
> if (r < 0) {
> @@ -346,8 +348,9 @@ test_block_hash:
> return r;
> }
>
> - bio_advance_iter(bio, &io->iter, bv.bv_len);
> - }
> + bio_advance_iter(bio, &io->iter, len);
> + todo -= len;
> + } while (todo);
>
> if (!v->version) {
> r = crypto_shash_update(desc, v->salt, v->salt_size);
> --
> 1.9.2
>
More information about the dm-devel
mailing list