Received: by 2002:a25:ef43:0:0:0:0:0 with SMTP id w3csp125633ybm; Tue, 26 May 2020 12:24:47 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwNNSz1c/esDbCf13DccYglhGYwS8rXZjLpyUsFWo5Cm2HJUAwOw5KgCcghiwtlmcOExeZy X-Received: by 2002:a17:907:2701:: with SMTP id w1mr2396042ejk.317.1590521087168; Tue, 26 May 2020 12:24:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1590521087; cv=none; d=google.com; s=arc-20160816; b=RFbgFyQ68mYEmjaSsjjfmDE39/knmoTvSL4LDslCXlcRloT1Hb07S2s7HhzB5A1b6Z Foviy9fu35HwyLYo4WV3JeAwKitQ6KZL4zbld1HmZXsGFNjx5pujIjPXsZkLJg0qxYlh 3EwbJ45hTC6kvoBY6CXRo+OHhUk/1DrJZlzXt3T3qukY3FdAp77JGhOmPCF0DkKH8s25 xtMP9zIuJ/Se4SitL+BnrOPonsiLqlb6d+lmRbQWHcIJHcfB9gx7BAZDPUuyGWfJaUB9 4YJXwblIrYlmfBHiAnbc/DpeEcfTAZGpxEvwVD5XmPjI0BitGdSVxsdmUF21Mex1c2rw BUxw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=3sDAg1cgjnvH9e8kLwlKnxnJgtDJ0ZdUNx+OribRrdg=; b=D3+BmcpiAp0cfLz2uN/X79839VJ7UpAUBvJ51FY4LXdG9qga5eXOjHW9rYFG3SIM/M rqoUhjSWKKG0aBeaF8n5YKrTfpo5UB9AMCjpXYf7V/8nxquX/N+yuP9SPmXe3AH9cWzu zUiQtvNlXNZa3gcVWPe138vSPQdLtsvDudPW8dwDLeZln3+8qS44nzaGkmhoD2Ft5B63 oFJyU9574bcNPAoGTWEnCJEXVQuTSgeTjK76D+NkeA33Bc9bwJoRU8NWOVMoz085ZR3m E8dUISxqImalBZ6aulMN5xo6LoTINjJIghJthUtixQ6JDHsIolCHr0GYAOre1CU/KXXO 7y8A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=2TZAVr4e; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id g8si448493ejb.85.2020.05.26.12.24.24; Tue, 26 May 2020 12:24:47 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=2TZAVr4e; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2404263AbgEZTVv (ORCPT + 99 others); Tue, 26 May 2020 15:21:51 -0400 Received: from mail.kernel.org ([198.145.29.99]:40484 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2391427AbgEZTLL (ORCPT ); Tue, 26 May 2020 15:11:11 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id E1FF520888; Tue, 26 May 2020 19:11:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1590520270; bh=ECHHm1tjjPiVV5BIUfnlAx1LvvWnDMygf0UXIqwcJhQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=2TZAVr4eSX95Ris7Vtv2FHOyiZz97dYZgt2LUinVpkQL9WL8FUhq37xy/JPeYkX4T Yt7pItYTB826CIqj7yYOvXlWSqBRzEnAZ0CwVXDWLmz9jaS0du3SnBYN8b+Z/okP+W n5fNgcruqVT7AB353aTAZP0KJL3XyCCb7XdapseY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Alexander Monakov , Joerg Roedel , iommu@lists.linux-foundation.org, Joerg Roedel , Sasha Levin Subject: [PATCH 5.6 014/126] iommu/amd: Fix over-read of ACPI UID from IVRS table Date: Tue, 26 May 2020 20:52:31 +0200 Message-Id: <20200526183938.780946925@linuxfoundation.org> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200526183937.471379031@linuxfoundation.org> References: <20200526183937.471379031@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alexander Monakov [ Upstream commit e461b8c991b9202b007ea2059d953e264240b0c9 ] IVRS parsing code always tries to read 255 bytes from memory when retrieving ACPI device path, and makes an assumption that firmware provides a zero-terminated string. Both of those are bugs: the entry is likely to be shorter than 255 bytes, and zero-termination is not guaranteed. With Acer SF314-42 firmware these issues manifest visibly in dmesg: AMD-Vi: ivrs, add hid:AMDI0020, uid:\_SB.FUR0\xf0\xa5, rdevid:160 AMD-Vi: ivrs, add hid:AMDI0020, uid:\_SB.FUR1\xf0\xa5, rdevid:160 AMD-Vi: ivrs, add hid:AMDI0020, uid:\_SB.FUR2\xf0\xa5, rdevid:160 AMD-Vi: ivrs, add hid:AMDI0020, uid:\_SB.FUR3>\x83e\x8d\x9a\xd1... The first three lines show how the code over-reads adjacent table entries into the UID, and in the last line it even reads garbage data beyond the end of the IVRS table itself. Since each entry has the length of the UID (uidl member of ivhd_entry struct), use that for memcpy, and manually add a zero terminator. Avoid zero-filling hid and uid arrays up front, and instead ensure the uid array is always zero-terminated. No change needed for the hid array, as it was already properly zero-terminated. Fixes: 2a0cb4e2d423c ("iommu/amd: Add new map for storing IVHD dev entry type HID") Signed-off-by: Alexander Monakov Cc: Joerg Roedel Cc: iommu@lists.linux-foundation.org Link: https://lore.kernel.org/r/20200511102352.1831-1-amonakov@ispras.ru Signed-off-by: Joerg Roedel Signed-off-by: Sasha Levin --- drivers/iommu/amd_iommu_init.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index 2b9a67ecc6ac..5b81fd16f5fa 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c @@ -1329,8 +1329,8 @@ static int __init init_iommu_from_acpi(struct amd_iommu *iommu, } case IVHD_DEV_ACPI_HID: { u16 devid; - u8 hid[ACPIHID_HID_LEN] = {0}; - u8 uid[ACPIHID_UID_LEN] = {0}; + u8 hid[ACPIHID_HID_LEN]; + u8 uid[ACPIHID_UID_LEN]; int ret; if (h->type != 0x40) { @@ -1347,6 +1347,7 @@ static int __init init_iommu_from_acpi(struct amd_iommu *iommu, break; } + uid[0] = '\0'; switch (e->uidf) { case UID_NOT_PRESENT: @@ -1361,8 +1362,8 @@ static int __init init_iommu_from_acpi(struct amd_iommu *iommu, break; case UID_IS_CHARACTER: - memcpy(uid, (u8 *)(&e->uid), ACPIHID_UID_LEN - 1); - uid[ACPIHID_UID_LEN - 1] = '\0'; + memcpy(uid, &e->uid, e->uidl); + uid[e->uidl] = '\0'; break; default: -- 2.25.1