From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
stable@vger.kernel.org,
"Demi Marie Obenour" <demi@invisiblethingslab.com>,
"Juergen Gross" <jgross@suse.com>,
"Roger Pau Monné" <roger.pau@citrix.com>
Subject: [PATCH 5.10 49/58] xen/blkfront: dont use gnttab_query_foreign_access() for mapped status
Date: Thu, 10 Mar 2022 15:19:09 +0100 [thread overview]
Message-ID: <20220310140814.264466581@linuxfoundation.org> (raw)
In-Reply-To: <20220310140812.869208747@linuxfoundation.org>
From: Juergen Gross <jgross@suse.com>
Commit abf1fd5919d6238ee3bc5eb4a9b6c3947caa6638 upstream.
It isn't enough to check whether a grant is still being in use by
calling gnttab_query_foreign_access(), as a mapping could be realized
by the other side just after having called that function.
In case the call was done in preparation of revoking a grant it is
better to do so via gnttab_end_foreign_access_ref() and check the
success of that operation instead.
For the ring allocation use alloc_pages_exact() in order to avoid
high order pages in case of a multi-page ring.
If a grant wasn't unmapped by the backend without persistent grants
being used, set the device state to "error".
This is CVE-2022-23036 / part of XSA-396.
Reported-by: Demi Marie Obenour <demi@invisiblethingslab.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/block/xen-blkfront.c | 63 +++++++++++++++++++++++++------------------
1 file changed, 37 insertions(+), 26 deletions(-)
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -1352,7 +1352,8 @@ free_shadow:
rinfo->ring_ref[i] = GRANT_INVALID_REF;
}
}
- free_pages((unsigned long)rinfo->ring.sring, get_order(info->nr_ring_pages * XEN_PAGE_SIZE));
+ free_pages_exact(rinfo->ring.sring,
+ info->nr_ring_pages * XEN_PAGE_SIZE);
rinfo->ring.sring = NULL;
if (rinfo->irq)
@@ -1436,9 +1437,15 @@ static int blkif_get_final_status(enum b
return BLKIF_RSP_OKAY;
}
-static bool blkif_completion(unsigned long *id,
- struct blkfront_ring_info *rinfo,
- struct blkif_response *bret)
+/*
+ * Return values:
+ * 1 response processed.
+ * 0 missing further responses.
+ * -1 error while processing.
+ */
+static int blkif_completion(unsigned long *id,
+ struct blkfront_ring_info *rinfo,
+ struct blkif_response *bret)
{
int i = 0;
struct scatterlist *sg;
@@ -1461,7 +1468,7 @@ static bool blkif_completion(unsigned lo
/* Wait the second response if not yet here. */
if (s2->status < REQ_DONE)
- return false;
+ return 0;
bret->status = blkif_get_final_status(s->status,
s2->status);
@@ -1512,42 +1519,43 @@ static bool blkif_completion(unsigned lo
}
/* Add the persistent grant into the list of free grants */
for (i = 0; i < num_grant; i++) {
- if (gnttab_query_foreign_access(s->grants_used[i]->gref)) {
+ if (!gnttab_try_end_foreign_access(s->grants_used[i]->gref)) {
/*
* If the grant is still mapped by the backend (the
* backend has chosen to make this grant persistent)
* we add it at the head of the list, so it will be
* reused first.
*/
- if (!info->feature_persistent)
- pr_alert_ratelimited("backed has not unmapped grant: %u\n",
- s->grants_used[i]->gref);
+ if (!info->feature_persistent) {
+ pr_alert("backed has not unmapped grant: %u\n",
+ s->grants_used[i]->gref);
+ return -1;
+ }
list_add(&s->grants_used[i]->node, &rinfo->grants);
rinfo->persistent_gnts_c++;
} else {
/*
- * If the grant is not mapped by the backend we end the
- * foreign access and add it to the tail of the list,
- * so it will not be picked again unless we run out of
- * persistent grants.
+ * If the grant is not mapped by the backend we add it
+ * to the tail of the list, so it will not be picked
+ * again unless we run out of persistent grants.
*/
- gnttab_end_foreign_access(s->grants_used[i]->gref, 0, 0UL);
s->grants_used[i]->gref = GRANT_INVALID_REF;
list_add_tail(&s->grants_used[i]->node, &rinfo->grants);
}
}
if (s->req.operation == BLKIF_OP_INDIRECT) {
for (i = 0; i < INDIRECT_GREFS(num_grant); i++) {
- if (gnttab_query_foreign_access(s->indirect_grants[i]->gref)) {
- if (!info->feature_persistent)
- pr_alert_ratelimited("backed has not unmapped grant: %u\n",
- s->indirect_grants[i]->gref);
+ if (!gnttab_try_end_foreign_access(s->indirect_grants[i]->gref)) {
+ if (!info->feature_persistent) {
+ pr_alert("backed has not unmapped grant: %u\n",
+ s->indirect_grants[i]->gref);
+ return -1;
+ }
list_add(&s->indirect_grants[i]->node, &rinfo->grants);
rinfo->persistent_gnts_c++;
} else {
struct page *indirect_page;
- gnttab_end_foreign_access(s->indirect_grants[i]->gref, 0, 0UL);
/*
* Add the used indirect page back to the list of
* available pages for indirect grefs.
@@ -1562,7 +1570,7 @@ static bool blkif_completion(unsigned lo
}
}
- return true;
+ return 1;
}
static irqreturn_t blkif_interrupt(int irq, void *dev_id)
@@ -1628,12 +1636,17 @@ static irqreturn_t blkif_interrupt(int i
}
if (bret.operation != BLKIF_OP_DISCARD) {
+ int ret;
+
/*
* We may need to wait for an extra response if the
* I/O request is split in 2
*/
- if (!blkif_completion(&id, rinfo, &bret))
+ ret = blkif_completion(&id, rinfo, &bret);
+ if (!ret)
continue;
+ if (unlikely(ret < 0))
+ goto err;
}
if (add_id_to_freelist(rinfo, id)) {
@@ -1740,8 +1753,7 @@ static int setup_blkring(struct xenbus_d
for (i = 0; i < info->nr_ring_pages; i++)
rinfo->ring_ref[i] = GRANT_INVALID_REF;
- sring = (struct blkif_sring *)__get_free_pages(GFP_NOIO | __GFP_HIGH,
- get_order(ring_size));
+ sring = alloc_pages_exact(ring_size, GFP_NOIO);
if (!sring) {
xenbus_dev_fatal(dev, -ENOMEM, "allocating shared ring");
return -ENOMEM;
@@ -1751,7 +1763,7 @@ static int setup_blkring(struct xenbus_d
err = xenbus_grant_ring(dev, rinfo->ring.sring, info->nr_ring_pages, gref);
if (err < 0) {
- free_pages((unsigned long)sring, get_order(ring_size));
+ free_pages_exact(sring, ring_size);
rinfo->ring.sring = NULL;
goto fail;
}
@@ -2729,11 +2741,10 @@ static void purge_persistent_grants(stru
list_for_each_entry_safe(gnt_list_entry, tmp, &rinfo->grants,
node) {
if (gnt_list_entry->gref == GRANT_INVALID_REF ||
- gnttab_query_foreign_access(gnt_list_entry->gref))
+ !gnttab_try_end_foreign_access(gnt_list_entry->gref))
continue;
list_del(&gnt_list_entry->node);
- gnttab_end_foreign_access(gnt_list_entry->gref, 0, 0UL);
rinfo->persistent_gnts_c--;
gnt_list_entry->gref = GRANT_INVALID_REF;
list_add_tail(&gnt_list_entry->node, &rinfo->grants);
next prev parent reply other threads:[~2022-03-10 14:42 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-10 14:18 [PATCH 5.10 00/58] 5.10.105-rc2 review Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 01/58] x86,bugs: Unconditionally allow spectre_v2=retpoline,amd Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 02/58] x86/speculation: Rename RETPOLINE_AMD to RETPOLINE_LFENCE Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 03/58] x86/speculation: Add eIBRS + Retpoline options Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 04/58] Documentation/hw-vuln: Update spectre doc Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 05/58] x86/speculation: Include unprivileged eBPF status in Spectre v2 mitigation reporting Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 06/58] x86/speculation: Use generic retpoline by default on AMD Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 07/58] x86/speculation: Update link to AMD speculation whitepaper Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 08/58] x86/speculation: Warn about Spectre v2 LFENCE mitigation Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 09/58] x86/speculation: Warn about eIBRS + LFENCE + Unprivileged eBPF + SMT Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 10/58] ARM: report Spectre v2 status through sysfs Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 11/58] ARM: early traps initialisation Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 12/58] ARM: use LOADADDR() to get load address of sections Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 13/58] ARM: Spectre-BHB workaround Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 14/58] ARM: include unprivileged BPF status in Spectre V2 reporting Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 15/58] arm64: cputype: Add CPU implementor & types for the Apple M1 cores Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 16/58] arm64: Add Neoverse-N2, Cortex-A710 CPU part definition Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 17/58] arm64: Add Cortex-X2 " Greg Kroah-Hartman
2022-03-10 14:18 ` Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 18/58] arm64: Add Cortex-A510 " Greg Kroah-Hartman
2022-03-10 14:18 ` Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 19/58] arm64: Add HWCAP for self-synchronising virtual counter Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 20/58] arm64: add ID_AA64ISAR2_EL1 sys register Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 21/58] arm64: cpufeature: add HWCAP for FEAT_AFP Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 22/58] arm64: cpufeature: add HWCAP for FEAT_RPRES Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 23/58] arm64: entry.S: Add ventry overflow sanity checks Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 24/58] arm64: spectre: Rename spectre_v4_patch_fw_mitigation_conduit Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 25/58] arm64: entry: Make the trampoline cleanup optional Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 26/58] arm64: entry: Free up another register on kptis tramp_exit path Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 27/58] arm64: entry: Move the trampoline data page before the text page Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 28/58] arm64: entry: Allow tramp_alias to access symbols after the 4K boundary Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 29/58] arm64: entry: Dont assume tramp_vectors is the start of the vectors Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 30/58] arm64: entry: Move trampoline macros out of ifdefd section Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 31/58] arm64: entry: Make the kpti trampolines kpti sequence optional Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 32/58] arm64: entry: Allow the trampoline text to occupy multiple pages Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 33/58] arm64: entry: Add non-kpti __bp_harden_el1_vectors for mitigations Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 34/58] arm64: entry: Add vectors that have the bhb mitigation sequences Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 35/58] arm64: entry: Add macro for reading symbol addresses from the trampoline Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 36/58] arm64: Add percpu vectors for EL1 Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 37/58] arm64: proton-pack: Report Spectre-BHB vulnerabilities as part of Spectre-v2 Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 38/58] KVM: arm64: Allow indirect vectors to be used without SPECTRE_V3A Greg Kroah-Hartman
2022-03-10 23:48 ` Pavel Machek
2022-03-11 6:42 ` Greg Kroah-Hartman
2022-03-15 12:20 ` James Morse
2022-03-15 12:27 ` James Morse
2022-03-15 12:41 ` Greg Kroah-Hartman
2022-03-15 12:29 ` Greg Kroah-Hartman
2022-03-10 14:18 ` [PATCH 5.10 39/58] arm64: Mitigate spectre style branch history side channels Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 40/58] KVM: arm64: Allow SMCCC_ARCH_WORKAROUND_3 to be discovered and migrated Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 41/58] arm64: Use the clearbhb instruction in mitigations Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 42/58] arm64: proton-pack: Include unprivileged eBPF status in Spectre v2 mitigation reporting Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 43/58] ARM: fix build error when BPF_SYSCALL is disabled Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 44/58] ARM: fix co-processor register typo Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 45/58] ARM: Do not use NOCROSSREFS directive with ld.lld Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 46/58] ARM: fix build warning in proc-v7-bugs.c Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 47/58] xen/xenbus: dont let xenbus_grant_ring() remove grants in error case Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 48/58] xen/grant-table: add gnttab_try_end_foreign_access() Greg Kroah-Hartman
2022-03-10 14:19 ` Greg Kroah-Hartman [this message]
2022-03-10 14:19 ` [PATCH 5.10 50/58] xen/netfront: dont use gnttab_query_foreign_access() for mapped status Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 51/58] xen/scsifront: " Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 52/58] xen/gntalloc: dont use gnttab_query_foreign_access() Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 53/58] xen: remove gnttab_query_foreign_access() Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 54/58] xen/9p: use alloc/free_pages_exact() Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 55/58] xen/pvcalls: " Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 56/58] xen/gnttab: fix gnttab_end_foreign_access() without page specified Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 57/58] xen/netfront: react properly to failing gnttab_end_foreign_access_ref() Greg Kroah-Hartman
2022-03-10 14:19 ` [PATCH 5.10 58/58] Revert "ACPI: PM: s2idle: Cancel wakeup before dispatching EC GPE" Greg Kroah-Hartman
2022-03-10 17:59 ` [PATCH 5.10 00/58] 5.10.105-rc2 review Pavel Machek
2022-03-10 18:48 ` Jon Hunter
2022-03-10 19:33 ` Shuah Khan
2022-03-10 22:36 ` Florian Fainelli
2022-03-11 1:04 ` Guenter Roeck
2022-03-11 6:48 ` Bagas Sanjaya
2022-03-11 10:11 ` Sudip Mukherjee
2022-03-11 11:52 ` Naresh Kamboju
2022-03-12 1:22 ` Fox Chen
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=20220310140814.264466581@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=demi@invisiblethingslab.com \
--cc=jgross@suse.com \
--cc=linux-kernel@vger.kernel.org \
--cc=roger.pau@citrix.com \
--cc=stable@vger.kernel.org \
/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.