Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp7580347imu; Tue, 22 Jan 2019 08:12:08 -0800 (PST) X-Google-Smtp-Source: ALg8bN7RA5yGMBsRz5ueob7vQI3EVMTVEP4OH9mClWqqdDz05gLCPrJ20nWazrNuUN5jFC0hBU6N X-Received: by 2002:a17:902:708b:: with SMTP id z11mr34958217plk.203.1548173528113; Tue, 22 Jan 2019 08:12:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548173528; cv=none; d=google.com; s=arc-20160816; b=PiqmNXgD17cknTf71GXdikzJjf4FT2kjwO5q4uT8b8ZL7A+HjDgpcd2Crk+gu8nDoX sgs82zxzv569hJs/3hbLJ22WTEygqgr+jILhuExfPei3VTZjMw0Yw2CazUGMRGQCfrbj QZKtbLY7+WS6QLkbtqEBrgF1iUYfWadWXfZX0nmDhXoOySKqIprQVs9OB8K3TuYjhcau iCgC3d3tlwzm1qIK8FlX+9CFBGri/vTtwCZOk8Fesq/Q5idg3A97Uk6Sm5pCuryKJx+Y C1lJDzuBzgfLHFKPwZBzOAnKNgTtxrD2ngsmWaRW8+u/l47CyxtCD8GEyWploMeD97R9 vYLQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=aYDCw4YBzzKuoZyVPlvVrlB02fmlXvQ/12zu3mVUh20=; b=kFB32KkOuTZBPp+0EIhVkYBGPcIgcRjZ6zErQhkZ/5c6uyuLMdOAAPoZ08ZQeJsL/r BoI/vuladDAMvf2G2cGaKLh665o6w3/l9xCvZHepKrsb0sMO0PBUEKB86JxE5LDuZOqn uOkQniWEOFt393WQJkC1Zqul4vt14sgu87gKyORoxTvuf4/11wQiXBPXbNWexJEZWMfL OlDSRS4gKZEmqZAxsjToDq0Yx2leCsaTMLvcIIrQ8ismRBC+mrZaoGwtEBDkV4Hmm81r jq5qCMrY7qKPtAWWf8y1sVIYep2E4EjC3NFTknJTthE8jNhxTmzFqQUwbpIegzQIxRLm Tm9g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c4si14933157pfi.110.2019.01.22.08.11.52; Tue, 22 Jan 2019 08:12:08 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729434AbfAVQJp (ORCPT + 99 others); Tue, 22 Jan 2019 11:09:45 -0500 Received: from smtp03.citrix.com ([162.221.156.55]:62991 "EHLO SMTP03.CITRIX.COM" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728669AbfAVQJh (ORCPT ); Tue, 22 Jan 2019 11:09:37 -0500 X-IronPort-AV: E=Sophos;i="5.56,507,1539648000"; d="scan'208";a="76149992" From: Ross Lagerwall To: CC: , , "Rafael J. Wysocki" , Len Brown , Tony Luck , Borislav Petkov , Huang Ying , Ross Lagerwall Subject: [PATCH 2/2] efi/cper: Avoid possible OOB when checking generic data block Date: Tue, 22 Jan 2019 16:09:12 +0000 Message-ID: <20190122160912.27312-3-ross.lagerwall@citrix.com> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190122160912.27312-1-ross.lagerwall@citrix.com> References: <20190122160912.27312-1-ross.lagerwall@citrix.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 OOB 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 --- drivers/firmware/efi/cper.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c index a7902fccdcfa..7cc18874b9d0 100644 --- a/drivers/firmware/efi/cper.c +++ b/drivers/firmware/efi/cper.c @@ -546,7 +546,7 @@ 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_len; int rc; rc = cper_estatus_check_header(estatus); @@ -555,10 +555,12 @@ int cper_estatus_check(const struct acpi_hest_generic_status *estatus) 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; - data_len -= acpi_hest_get_record_size(gdata); + record_len = acpi_hest_get_record_size(gdata); + if (record_len > data_len) + return -EINVAL; + data_len -= record_len; } if (data_len) return -EINVAL; -- 2.17.2