From: Ross Lagerwall <ross.lagerwall@citrix.com>
To: linux-kernel@vger.kernel.org
Cc: linux-acpi@vger.kernel.org, linux-efi@vger.kernel.org,
"Rafael J . Wysocki" <rjw@rjwysocki.net>,
Len Brown <lenb@kernel.org>, Tony Luck <tony.luck@intel.com>,
Borislav Petkov <bp@alien8.de>, Huang Ying <ying.huang@intel.com>,
Ross Lagerwall <ross.lagerwall@citrix.com>
Subject: [PATCH v2 2/2] efi/cper: Fix possible out-of-bounds access
Date: Mon, 28 Jan 2019 10:04:24 +0000 [thread overview]
Message-ID: <20190128100424.30278-3-ross.lagerwall@citrix.com> (raw)
In-Reply-To: <20190128100424.30278-1-ross.lagerwall@citrix.com>
When checking a generic status block, we iterate over all the generic
data blocks. The loop condition only checks that the start of the
generic data block is valid (within estatus->data_length) but not the
whole block. Because the size of data blocks (excluding error data) may
vary depending on the revision and the revision is contained within the
data block, ensure that enough of the current data block is valid before
dereferencing any members otherwise an out-of-bounds access may occur if
estatus->data_length is invalid. This relies on the fact that struct
acpi_hest_generic_data_v300 is a superset of the earlier version. Also
rework the other checks to avoid potential underflow.
Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
---
drivers/firmware/efi/cper.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c
index a7902fccdcfa..6090d25dce85 100644
--- a/drivers/firmware/efi/cper.c
+++ b/drivers/firmware/efi/cper.c
@@ -546,19 +546,24 @@ EXPORT_SYMBOL_GPL(cper_estatus_check_header);
int cper_estatus_check(const struct acpi_hest_generic_status *estatus)
{
struct acpi_hest_generic_data *gdata;
- unsigned int data_len, gedata_len;
+ unsigned int data_len, record_size;
int rc;
rc = cper_estatus_check_header(estatus);
if (rc)
return rc;
+
data_len = estatus->data_length;
apei_estatus_for_each_section(estatus, gdata) {
- gedata_len = acpi_hest_get_error_length(gdata);
- if (gedata_len > data_len - acpi_hest_get_size(gdata))
+ if (sizeof(struct acpi_hest_generic_data) > data_len)
+ return -EINVAL;
+
+ record_size = acpi_hest_get_record_size(gdata);
+ if (record_size > data_len)
return -EINVAL;
- data_len -= acpi_hest_get_record_size(gdata);
+
+ data_len -= record_size;
}
if (data_len)
return -EINVAL;
--
2.17.2
next prev parent reply other threads:[~2019-01-28 10:04 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-28 10:04 [PATCH v2 0/2] Fix crash in cper_estatus_check() Ross Lagerwall
2019-01-28 10:04 ` [PATCH v2 1/2] acpi/apei: Fix possible out-of-bounds access to BERT region Ross Lagerwall
2019-01-28 10:04 ` Ross Lagerwall [this message]
2019-01-30 16:03 ` [PATCH v2 0/2] Fix crash in cper_estatus_check() Tyler Baicar
2019-02-19 10:00 ` Rafael J. Wysocki
2019-02-19 13:50 ` Borislav Petkov
2019-02-20 9:34 ` Rafael J. Wysocki
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=20190128100424.30278-3-ross.lagerwall@citrix.com \
--to=ross.lagerwall@citrix.com \
--cc=bp@alien8.de \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-efi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rjw@rjwysocki.net \
--cc=tony.luck@intel.com \
--cc=ying.huang@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox