From patchwork Thu Apr 20 15:06:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sudeep Holla X-Patchwork-Id: 13218902 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A05EAC77B72 for ; Thu, 20 Apr 2023 15:07:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References:Message-Id :MIME-Version:Subject:Date:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=OOaUBnfM8NYkVjzxYJYSoqWh7fNQSmIdEv57A4KPm4g=; b=OpqoEllEWzPt1K OUs+fhAqowB8qxOM/cswZ3XSwKJ3XtfIkKD7FbFSdZ8C7PdN451aOiysY1OvFblKkltAomXkBQeSM yzZaHdd75LyTXO6tjD4di9IjKY3Dd+MyPnCY5GASLOq130VqlyCFBu5EufhfEniCVbN/gs8qH4+mz 74hQUDQMbDI/ZDQvSvg8lqhVr+hOY24I8ga+bDSWMKef1tgLHYN8mwdOfUDavRMjnbP8Jas3vfKbq l1jz68BA50oQeJzRkMlp8hb363EaxHvt1AlWtnhvhGxRkchOrz5udsx+Ksmgc4yPmnk/j/5RqAN+x UL+dti7/MWrM+8+z8R8A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1ppVru-008NAC-2s; Thu, 20 Apr 2023 15:06:42 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1ppVrf-008N7e-2c for linux-arm-kernel@lists.infradead.org; Thu, 20 Apr 2023 15:06:30 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 8E99C152B; Thu, 20 Apr 2023 08:07:08 -0700 (PDT) Received: from e103737-lin.cambridge.arm.com (e103737-lin.cambridge.arm.com [10.1.197.49]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 1C88E3F6C4; Thu, 20 Apr 2023 08:06:24 -0700 (PDT) From: Sudeep Holla Date: Thu, 20 Apr 2023 16:06:01 +0100 Subject: [PATCH v2 1/3] firmware: arm_ffa: Check if ffa_driver remove is present before executing MIME-Version: 1.0 Message-Id: <20230419-ffa_fixes_6-4-v2-1-d9108e43a176@arm.com> References: <20230419-ffa_fixes_6-4-v2-0-d9108e43a176@arm.com> In-Reply-To: <20230419-ffa_fixes_6-4-v2-0-d9108e43a176@arm.com> To: linux-arm-kernel@lists.infradead.org Cc: Sudeep Holla , Marc Bonnici , Jens Wiklander , Lucian Paul-Trifu X-Mailer: b4 0.12.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=2280; i=sudeep.holla@arm.com; h=from:subject:message-id; bh=qYbYM/pIaMZFKMylpLoSG/+dQuTtfE41funwQ886cMU=; b=owEBbQKS/ZANAwAIAQBBurwxfuKYAcsmYgBkQVTuWDfmhXAEPEgZ7xS0zZEZKoIashOLgdbxl BWV7d7a3DGJAjMEAAEIAB0WIQS6ceUSBvMeskPdk+EAQbq8MX7imAUCZEFU7gAKCRAAQbq8MX7i mPRYEADWL/qDt0uI6fF2L3EqnIoaVX7uRNETXjPa0viYR3eCZfGEdRnM6Fl7cKY7EKzG3KySaCs sQKPsHcAhx+T4Nxe96CNMASWTeOvzbMGM65U19xDKD2mZzJrlBZiDSnFoyrjiTlzyp/kkhqu7z3 yIe1tMztupfafZ0MdY51fRj1JQcxLQmtfs5ttU2YBGyw0xKCDQvdwKjNF6aI2ap0J3NYqUwIvKs tErhaZnJBMXD1ID6BkHaGT3nqaigwrbcVeALbu3vtgZ4+qA11tlbC9RUembUWAUCEqcNoUVzSj+ bYCww3Lrnv3tYx15ARgIn6eOYgvdSkfcFVu6ZmNdnoFvlM6svEi24tStODJwO4ar1ccT9G98EiZ 5bNJbSpRowsoRGrgeZdBFk4tqG3As1UnLUIwdrDGJW2OOZzdQhhAoM1biRvOB13NBSLVhbLj3JB MHIOM/12AvmwD+QTJhfdu6P85B9/ZlbfQIKonl/Cxaz4b1QbW5O2oQTKHuPnhbvkTf8FtJozk+v NBE0ZRJ14FjjY9Fhlm6C6kpIIhKEggyIblWt7jtIJgtpdSD0vOX2kDOTRK8SjoY9cNDJgm+okpZ aht4jX+Jpzqo7500qc9pEBjN9riTHYVl32pFAsL5WACRXqt/8Bfrj12TuNc76/zMi3TIza38VPN D0Fax9c7Ig3qHqA== X-Developer-Key: i=sudeep.holla@arm.com; a=openpgp; fpr=7360A21742ADF5A11767C1C139CFD4755FE2D5B4 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230420_080627_962887_534CE085 X-CRM114-Status: GOOD ( 11.48 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Currently ffa_drv->remove() is called unconditionally from ffa_device_remove(). Since the driver registration doesn't check for it and allows it to be registered without .remove callback, we need to check for the presence of it before executing it from ffa_device_remove() to above a NULL pointer dereference like the one below: | Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 | Mem abort info: | ESR = 0x0000000086000004 | EC = 0x21: IABT (current EL), IL = 32 bits | SET = 0, FnV = 0 | EA = 0, S1PTW = 0 | FSC = 0x04: level 0 translation fault | user pgtable: 4k pages, 48-bit VAs, pgdp=0000000881cc8000 | [0000000000000000] pgd=0000000000000000, p4d=0000000000000000 | Internal error: Oops: 0000000086000004 [#1] PREEMPT SMP | CPU: 3 PID: 130 Comm: rmmod Not tainted 6.3.0-rc7 #6 | Hardware name: FVP Base RevC (DT) | pstate: 63402809 (nZCv daif +PAN -UAO +TCO +DIT -SSBS BTYPE=-c) | pc : 0x0 | lr : ffa_device_remove+0x20/0x2c | Call trace: | 0x0 | device_release_driver_internal+0x16c/0x260 | driver_detach+0x90/0xd0 | bus_remove_driver+0xdc/0x11c | driver_unregister+0x30/0x54 | ffa_driver_unregister+0x14/0x20 | cleanup_module+0x18/0xeec | __arm64_sys_delete_module+0x234/0x378 | invoke_syscall+0x40/0x108 | el0_svc_common+0xb4/0xf0 | do_el0_svc+0x30/0xa4 | el0_svc+0x2c/0x7c | el0t_64_sync_handler+0x84/0xf0 | el0t_64_sync+0x190/0x194 Fixes: 244f5d597e1e ("firmware: arm_ffa: Add missing remove callback to ffa_bus_type") Signed-off-by: Sudeep Holla --- drivers/firmware/arm_ffa/bus.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/firmware/arm_ffa/bus.c b/drivers/firmware/arm_ffa/bus.c index f29d77ecf72d..36bd5423c2f0 100644 --- a/drivers/firmware/arm_ffa/bus.c +++ b/drivers/firmware/arm_ffa/bus.c @@ -53,7 +53,8 @@ static void ffa_device_remove(struct device *dev) { struct ffa_driver *ffa_drv = to_ffa_driver(dev->driver); - ffa_drv->remove(to_ffa_dev(dev)); + if (ffa_drv->remove) + ffa_drv->remove(to_ffa_dev(dev)); } static int ffa_device_uevent(const struct device *dev, struct kobj_uevent_env *env)