All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mikulas Patocka <mpatocka@redhat.com>
To: Mike Snitzer <msnitzer@redhat.com>, dm-devel@redhat.com
Cc: "Eric Biggers" <ebiggers3@gmail.com>,
	yanmin.zhang@intel.com, "Gilad Ben-Yossef" <gilad@benyossef.com>,
	"Ondrej Mosnáček" <omosnacek+linux-crypto@gmail.com>,
	"Xiao, Jin" <jin.xiao@intel.com>,
	"Alasdair G. Kergon" <agk@redhat.com>,
	"Milan Broz" <mbroz@redhat.com>
Subject: [PATCH] dm verity: don't crash on vmallocated buffer
Date: Wed, 22 Aug 2018 12:45:51 -0400 (EDT)	[thread overview]
Message-ID: <alpine.LRH.2.02.1808221238350.30929@file01.intranet.prod.int.rdu2.redhat.com> (raw)

Since the commit d1ac3ff008fb ("dm verity: switch to using asynchronous"+
hash crypto API"), dm-verity uses asynchronous crypto calls for
verification, so that it can use hardware with asynchronous processing of
crypto operations.

These asynchronous calls don't support vmalloc memory, but the buffer data
can be vmallocated if dm-bufio is short of memory and uses a reserved
buffer that was preallocated in dm_bufio_client_create.

This patch fixes verity_hash_update, so that it deals with vmallocated 
memory correctly.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Reported-by: "Xiao, Jin" <jin.xiao@intel.com>
Fixes: d1ac3ff008fb ("dm verity: switch to using asynchronous hash crypto API")
Cc: stable@vger.kernel.org	# 4.11+

---
 drivers/md/dm-verity-target.c |   24 ++++++++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

Index: linux-2.6/drivers/md/dm-verity-target.c
===================================================================
--- linux-2.6.orig/drivers/md/dm-verity-target.c	2018-08-22 17:18:30.800000000 +0200
+++ linux-2.6/drivers/md/dm-verity-target.c	2018-08-22 17:22:14.810000000 +0200
@@ -99,10 +99,26 @@ static int verity_hash_update(struct dm_
 {
 	struct scatterlist sg;
 
-	sg_init_one(&sg, data, len);
-	ahash_request_set_crypt(req, &sg, NULL, len);
-
-	return crypto_wait_req(crypto_ahash_update(req), wait);
+	if (likely(!is_vmalloc_addr(data))) {
+		sg_init_one(&sg, data, len);
+		ahash_request_set_crypt(req, &sg, NULL, len);
+		return crypto_wait_req(crypto_ahash_update(req), wait);
+	} else {
+		do {
+			int r;
+			size_t this_step = min(len, PAGE_SIZE - offset_in_page(data));
+			flush_kernel_vmap_range((void *)data, this_step);
+			sg_init_table(&sg, 1);
+			sg_set_page(&sg, vmalloc_to_page(data), this_step, offset_in_page(data));
+			ahash_request_set_crypt(req, &sg, NULL, this_step);
+			r = crypto_wait_req(crypto_ahash_update(req), wait);
+			if (unlikely(r))
+				return r;
+			data += this_step;
+			len -= this_step;
+		} while (len);
+		return 0;
+	}
 }
 
 /*

             reply	other threads:[~2018-08-22 16:45 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-22 16:45 Mikulas Patocka [this message]
2018-09-10  2:51 ` [PATCH] dm verity: don't crash on vmallocated buffer Xiao, Jin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.LRH.2.02.1808221238350.30929@file01.intranet.prod.int.rdu2.redhat.com \
    --to=mpatocka@redhat.com \
    --cc=agk@redhat.com \
    --cc=dm-devel@redhat.com \
    --cc=ebiggers3@gmail.com \
    --cc=gilad@benyossef.com \
    --cc=jin.xiao@intel.com \
    --cc=mbroz@redhat.com \
    --cc=msnitzer@redhat.com \
    --cc=omosnacek+linux-crypto@gmail.com \
    --cc=yanmin.zhang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.