Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp5468440pxu; Tue, 22 Dec 2020 19:04:45 -0800 (PST) X-Google-Smtp-Source: ABdhPJyr/crx+iD4EMwaDlET1Yug9sWhxiTp2sibEJDYCWxqvs7hVJtAqUJxFcx5WzTOq6XndHN6 X-Received: by 2002:a05:6402:b57:: with SMTP id bx23mr22589294edb.191.1608692684938; Tue, 22 Dec 2020 19:04:44 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1608692684; cv=none; d=google.com; s=arc-20160816; b=gycWzKEtUFK0KY+rlHr/0Psj2NRcLpef1Zxp2uqfpkQ5NI/bLfwNGwe+NfbzZTXHlH IN4WiSr7aLhoo04pGWsKjvZltkOMw7K58bSBkNu+mre7V48YcTHPBNgiKDmvjCmeQuRb eECQ6A/ZaTO+wYbPEzHNSfJJlIBc8TTfsZRf/0zJ3v7EPjEVZg2XcgHUUK/FLCwqFYTL 80iFsmEpUn5NPHH4MtijFRTGcHYgj4BkjvqLqQifvl9TgL8gofNuogspPFgo7WKnHhZ4 3UkXo4rH5DbDt2PANxVO+5WSLJVdeU+cbJDyZ3PGWg5cEpFM4kW65pyt9SdNisSrlDce yWwg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=yweE3X/O4cGlLWyRfD8J2ZLRB4x7ANZlH6SdIxUfiGs=; b=yxJ0/j5SbrU0U6DV/xxEK5UNvwKx4c+6RwV/25mFClLMKGj95zYAT4MhmDsY4Ha9T4 6BqkKasrhzzu4SCS1SM8CEcCpDsPK891mvhz8/woIQZWdjoefpNArh0UCtGwlZ4Nva0V luLytWxlbz2VCNSqNiI5F43m++9VbJSLejRYM0L0oMrUgUoBjX13sdleNpWmCowLOyC7 R4VobsElR9eEI7quOr5PYBnYr5fWADtuFqG9q0QlGeWDDVdYCJk/z7NmDze2swoGtKa8 WR7VewWgQBVnJBZ5o6l5ixfHmozo0Sm2okJF+qkVU2rclmK0/lIUvF183cAEz98X+vva caUQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="k/UwJOPg"; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n22si12889491edb.427.2020.12.22.19.04.22; Tue, 22 Dec 2020 19:04:44 -0800 (PST) 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=k20201202 header.b="k/UwJOPg"; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731676AbgLWDCU (ORCPT + 99 others); Tue, 22 Dec 2020 22:02:20 -0500 Received: from mail.kernel.org ([198.145.29.99]:46404 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728716AbgLWCTj (ORCPT ); Tue, 22 Dec 2020 21:19:39 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 785AF225AB; Wed, 23 Dec 2020 02:19:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1608689948; bh=PtJXlG+7otVt3v+1uuqmlPy/lhsqk23d0pMQ5jDpIjI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=k/UwJOPgC+gHV3LGv3b2Yy8iyDKyeSVOkUsoMp1xf8r8ffAw+wJvfwiDMNgQpCf0+ e4I9ojo5trxEUMZFCkB4l3T95ucVXLj5zMB0TY670Z/Tj6tbNUjhtGN3Ut7rIthCud i2aq+mAIYAXYECaPepM28+QYgFJpNltYpLyCVmrMikVqsR6lmhFE02TTLDw9mOUZoh oLyQqg2jiX5pH5VIWb4c9VWYRZXmFgpInweycYM1AC8lVAOKzV/iPD/RmHPbAn4vEl CdA27Zt50LueR4q4zAjy1qpAVmXBTcmUeU0v0vQnlKpiicdzI17YluYgoWpHbBzV9b KxNTD46MOaPDg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Mansur Alisha Shaik , Stanimir Varbanov , Mauro Carvalho Chehab , Sasha Levin , linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org Subject: [PATCH AUTOSEL 5.4 042/130] media: venus: handle use after free for iommu_map/iommu_unmap Date: Tue, 22 Dec 2020 21:16:45 -0500 Message-Id: <20201223021813.2791612-42-sashal@kernel.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20201223021813.2791612-1-sashal@kernel.org> References: <20201223021813.2791612-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Mansur Alisha Shaik [ Upstream commit de15e6231e6a3ca58d58d7e2c614a76c940dbb38 ] In concurrency usecase and reboot scenario we are seeing muliple crashes related to iommu_map/iommu_unamp of core->fw.iommu_domain. In one case we are seeing "Unable to handle kernel NULL pointer dereference at virtual address 0000000000000008" crash, this is because of core->fw.iommu_domain in venus_firmware_deinit() and trying to map in venus_boot() during venus_sys_error_handler() Call trace: __iommu_map+0x4c/0x348 iommu_map+0x5c/0x70 venus_boot+0x184/0x230 [venus_core] venus_sys_error_handler+0xa0/0x14c [venus_core] process_one_work+0x210/0x3d0 worker_thread+0x248/0x3f4 kthread+0x11c/0x12c ret_from_fork+0x10/0x18 In second case we are seeing "Unable to handle kernel paging request at virtual address 006b6b6b6b6b6b9b" crash, this is because of unmapping iommu domain which is already unmapped. Call trace: venus_remove+0xf8/0x108 [venus_core] venus_core_shutdown+0x1c/0x34 [venus_core] platform_drv_shutdown+0x28/0x34 device_shutdown+0x154/0x1fc kernel_restart_prepare+0x40/0x4c kernel_restart+0x1c/0x64 __arm64_sys_reboot+0x190/0x238 el0_svc_common+0xa4/0x154 el0_svc_compat_handler+0x2c/0x38 el0_svc_compat+0x8/0x10 Signed-off-by: Mansur Alisha Shaik Signed-off-by: Stanimir Varbanov Signed-off-by: Mauro Carvalho Chehab Signed-off-by: Sasha Levin --- drivers/media/platform/qcom/venus/firmware.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c index 33f70e1def943..9a9c0979e7bbb 100644 --- a/drivers/media/platform/qcom/venus/firmware.c +++ b/drivers/media/platform/qcom/venus/firmware.c @@ -172,9 +172,14 @@ static int venus_shutdown_no_tz(struct venus_core *core) iommu = core->fw.iommu_domain; - unmapped = iommu_unmap(iommu, VENUS_FW_START_ADDR, mapped); - if (unmapped != mapped) - dev_err(dev, "failed to unmap firmware\n"); + if (core->fw.mapped_mem_size && iommu) { + unmapped = iommu_unmap(iommu, VENUS_FW_START_ADDR, mapped); + + if (unmapped != mapped) + dev_err(dev, "failed to unmap firmware\n"); + else + core->fw.mapped_mem_size = 0; + } return 0; } @@ -289,7 +294,11 @@ void venus_firmware_deinit(struct venus_core *core) iommu = core->fw.iommu_domain; iommu_detach_device(iommu, core->fw.dev); - iommu_domain_free(iommu); + + if (core->fw.iommu_domain) { + iommu_domain_free(iommu); + core->fw.iommu_domain = NULL; + } platform_device_unregister(to_platform_device(core->fw.dev)); } -- 2.27.0