From nobody Mon Dec 1 23:33:36 2025 Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) (using TLSv1.2 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 39A9C28643A for ; Wed, 26 Nov 2025 07:46:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=159.226.251.81 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764143201; cv=none; b=ROfPFa9QIOaEuZuiffs8VEekzcsiZxTuYBchISToho72T5iC+0j3onxrEzQbBj3Obr+gp13IJQ9lYp8EDSSmRoo9mDnvXWM4rzQBJ9tHpvT/9OUyobaIxoCqrj5Teme8O6e2gfc7PAjjpqiznve/SeMlWZSMmTDBlG7f5F5wRyM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764143201; c=relaxed/simple; bh=zdL8SJNFKuUQavISJjb+oZe1CYuf1vd0rT6gxa+ewkA=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=DNmPxkjc4+cctKy5XY4Z3XqvYoQSvk5DBaWsfj3IS09uZSm3WpNtAcTmA0qzTjMfSZajVS4/m/1Tr/S5/QW2YUCGjl/pSYh19/A8vlI8ISpfTUyrpxzZuY3yBoyDOdBkdFIs2q9RB6afP7110l45pQLVIusIMDGyZjxzhElxv7I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iscas.ac.cn; spf=pass smtp.mailfrom=iscas.ac.cn; arc=none smtp.client-ip=159.226.251.81 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iscas.ac.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iscas.ac.cn Received: from DESKTOP-L0HPE2S (unknown [124.16.141.245]) by APP-03 (Coremail) with SMTP id rQCowADneNtDsCZpZR8hAg--.1890S2; Wed, 26 Nov 2025 15:46:15 +0800 (CST) From: Haotian Zhang To: Michal Simek , Daniel Lezcano , Thomas Gleixner Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Haotian Zhang Subject: [PATCH] clocksource: timer-cadence-ttc: Fix resource leaks in error paths Date: Wed, 26 Nov 2025 15:45:59 +0800 Message-ID: <20251126074559.1709-1-vulab@iscas.ac.cn> X-Mailer: git-send-email 2.50.1.windows.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: rQCowADneNtDsCZpZR8hAg--.1890S2 X-Coremail-Antispam: 1UD129KBjvJXoWxAw47JrykGF1fuFy3Jr4DCFg_yoW5GrWkp3 yxu3s8tF4UX3yj9wsFqF1DZFZ7Ka10kFyxur1ak343urs8Wry7KFWUta4UuF1UGryxAw43 X3WYyw43u34UZaUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUvl14x267AKxVWUJVW8JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26r4j6ryUM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4U JVWxJr1l84ACjcxK6I8E87Iv67AKxVWxJr0_GcWl84ACjcxK6I8E87Iv6xkF7I0E14v26r xl6s0DM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj 6xIIjxv20xvE14v26r1j6r18McIj6I8E87Iv67AKxVW8JVWxJwAm72CE4IkC6x0Yz7v_Jr 0_Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxkF7I0En4kS14v2 6r126r1DMxkIecxEwVAFwVW8CwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJV W8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF 1VAFwI0_JF0_Jw1lIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY6x IIjxv20xvEc7CjxVAFwI0_Jr0_Gr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0xvE x4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVjvj DU0xZFpf9x0JUFdgXUUUUU= X-CM-SenderInfo: pyxotu46lvutnvoduhdfq/1tbiBgsSA2kmkL1x6wAAsk Content-Type: text/plain; charset="utf-8" The ttc_setup_clocksource() and ttc_setup_clockevent() fail to unregister the clock notifier in their error paths, potentially leading to a resource leak. Additionally, ttc_setup_clocksource() leaks the prepared clock reference upon failure. Unregister the clock notifier and disable the clock in the error path of ttc_setup_clocksource(). Also, add the missing clock notifier unregistration in the error path of ttc_setup_clockevent() to ensure proper cleanup. Fixes: e932900a3279 ("arm: zynq: Use standard timer binding") Fixes: 91dc985c5e51 ("ARM: zynq: add clk binding support to the ttc") Signed-off-by: Haotian Zhang --- drivers/clocksource/timer-cadence-ttc.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/clocksource/timer-cadence-ttc.c b/drivers/clocksource/= timer-cadence-ttc.c index b8a1cf59b9d6..70384faad66d 100644 --- a/drivers/clocksource/timer-cadence-ttc.c +++ b/drivers/clocksource/timer-cadence-ttc.c @@ -333,6 +333,7 @@ static int __init ttc_setup_clocksource(struct clk *clk= , void __iomem *base, { struct ttc_timer_clocksource *ttccs; int err; + bool notifier_registered =3D false; =20 ttccs =3D kzalloc(sizeof(*ttccs), GFP_KERNEL); if (!ttccs) @@ -356,6 +357,8 @@ static int __init ttc_setup_clocksource(struct clk *clk= , void __iomem *base, &ttccs->ttc.clk_rate_change_nb); if (err) pr_warn("Unable to register clock notifier.\n"); + else + notifier_registered =3D true; =20 ttccs->ttc.base_addr =3D base; ttccs->cs.name =3D "ttc_clocksource"; @@ -377,6 +380,10 @@ static int __init ttc_setup_clocksource(struct clk *cl= k, void __iomem *base, =20 err =3D clocksource_register_hz(&ttccs->cs, ttccs->ttc.freq / PRESCALE); if (err) { + if (notifier_registered) + clk_notifier_unregister(ttccs->ttc.clk, + &ttccs->ttc.clk_rate_change_nb); + clk_disable_unprepare(ttccs->ttc.clk); kfree(ttccs); return err; } @@ -465,13 +472,16 @@ static int __init ttc_setup_clockevent(struct clk *cl= k, err =3D request_irq(irq, ttc_clock_event_interrupt, IRQF_TIMER, ttcce->ce.name, ttcce); if (err) - goto out_clk_unprepare; + goto out_clk_notifier_unregister; =20 clockevents_config_and_register(&ttcce->ce, ttcce->ttc.freq / PRESCALE, 1, 0xfffe); =20 return 0; =20 +out_clk_notifier_unregister: + clk_notifier_unregister(ttcce->ttc.clk, + &ttcce->ttc.clk_rate_change_nb); out_clk_unprepare: clk_disable_unprepare(ttcce->ttc.clk); out_kfree: --=20 2.50.1.windows.1