From patchwork Mon Dec 18 17:00:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Brunet X-Patchwork-Id: 122241 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3076878qgn; Mon, 18 Dec 2017 09:00:29 -0800 (PST) X-Google-Smtp-Source: ACJfBov7ngEJRISSbeUWpxgASNerzuXhjOuz2Uv9yrXePPH5DWk8y9IUwxjlMm/N6mAtp35j7TBc X-Received: by 10.98.246.18 with SMTP id x18mr322621pfh.219.1513616429329; Mon, 18 Dec 2017 09:00:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513616429; cv=none; d=google.com; s=arc-20160816; b=vB27ScACMNSpQILJPlzrUlbnIFD3cJ304RUFe7Cj3dWNgZPGMpWNSRkxjg2P14NMjI rn4F+fy/Opt/P1qtfW+1jWIS784dbWIVoUCgSxT0HdGSzQsU7tVgniJiie6ia3fSCAY2 7NvYEMuVwWbqfEw7BExAr/iYfXAnM0UR8AOGfSkJAxtSTezvXUWYRe/KXPQ2x8bEo0N0 LObA0jaLM1N+wi0ZyFx52LzhZVEKHT8Jqu/cGh1pdYlY2SVNxjxbDoAZ8mJBybgzl5mI uRRk9XoqxcGZ+p42320PpWu8eTK0I/hQ2BrDhn66SP8pt0BZKCgdMuz6n/MIJYv9/B6R PEYQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=GGtaewxJxG3oiYGeDxDnbx9XBYmY3/H5vGNlS0AZ1C8=; b=Kxri9zQag4V6EdxpQK5qlNLiTFGnvCvRhTxSJVOA8RMjv2EN3G9pYFGyx61bdgqJC9 tgunVpGI80qBPvE18Mh+VW2fWUN0lEcCO3ma93koyxS/e1q1byBX9XJfZuFrQ3QvRISx TfBMfalqlz6uNQRo1vhFsG0WV16dFay9pPiX3DB2Ka+/1Q5rBodOEAiH+YxY68B10sP+ rZ5E3aBCQP0a0l5v/x115+vDNj4utoafGG9GrRaPAmE56k0w6/wXbmUPqeGws9NcqXPX 1c5TKDGHhUEGhIn3g7TaSf3gBKpE+6yfLWvNXUJ8NZ/Z8fUBBNEp6Zcaeh1wWyMZQ7iz lcbA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=Qs+svck7; 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 r7si9537685ple.415.2017.12.18.09.00.29; Mon, 18 Dec 2017 09:00:29 -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; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=Qs+svck7; 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 S965346AbdLRRAY (ORCPT + 28 others); Mon, 18 Dec 2017 12:00:24 -0500 Received: from mail-wr0-f196.google.com ([209.85.128.196]:45684 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S935650AbdLRRAQ (ORCPT ); Mon, 18 Dec 2017 12:00:16 -0500 Received: by mail-wr0-f196.google.com with SMTP id h1so14818381wre.12 for ; Mon, 18 Dec 2017 09:00:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=GGtaewxJxG3oiYGeDxDnbx9XBYmY3/H5vGNlS0AZ1C8=; b=Qs+svck7FsrYny63Tc5g0HAs4+fMts+rr26VVyHN2cPNK6k1OFZgEsEtTIRhREbu+J gXGCpn6Dx7weobwNJc2Hhdu6Keek7UKG68K48IoYV7Eav3Wb6ShN3gYKA9LOsLaWHYkO HG4pLmQY5Qq2n4qiiar1ofkMVNgPDGTI3THjGVJNMbQtWgVuIwOGaNWy0qM7NuEwn40w GnONr6vs93E2SkbLw8+lqZbA/CAbSv3XamppXZFbvNf9yRuw5bRua937boIZyiHfmP2f ghS/owSyTxxJQ9ZYEgFXrMJ87mwM4rE7LVcSYtIGKMAuM2hZA94D6dC9I6/hQ+S5YAwZ pTcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=GGtaewxJxG3oiYGeDxDnbx9XBYmY3/H5vGNlS0AZ1C8=; b=rDFoHInL04UM7JN1iIERDc48RAFdLiqxfu+x9tS8PQfGdyPvq5aBEv49+OzVFirP5K Auft/IyDHzBhcMP0XMM0HLNyriegb3q2anoHsP2RQsarFMDpWCDa1RHnuWVdCVZYMkGX c9BrD4ZmzHxo7n/WR8b4JAxbA1jUD20IHjaH7K6PC1xZhpwG7GH8bfntFm7IvtFT4F0H yvTiJsmOd5AjjJK3rLiTLP2rCXzuZW+dOGxHwOfMRhhOZHHOT0knGSRSmmH7CNPDIqlH iffOtNHoZE77CxArIJH1jlAU/Dj8y1uOkvHzlvZCzaNDTZh9AAr4QdxbX8FZK49W4W8Q 3Sxg== X-Gm-Message-State: AKGB3mI1y97ndIysw0QsSkElPeHPOHrOCWas9PzwkhbZK04u9KNONRms LUav3+VeGhQ/EWEPTRcQGoaPLQ== X-Received: by 10.223.147.195 with SMTP id 61mr587910wrp.176.1513616414813; Mon, 18 Dec 2017 09:00:14 -0800 (PST) Received: from boomer.baylibre.local ([90.63.244.31]) by smtp.googlemail.com with ESMTPSA id 38sm17103031wry.34.2017.12.18.09.00.14 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 18 Dec 2017 09:00:14 -0800 (PST) From: Jerome Brunet To: Michael Turquette , Stephen Boyd Cc: Jerome Brunet , linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] clk: check ops pointer on clock register Date: Mon, 18 Dec 2017 18:00:07 +0100 Message-Id: <20171218170007.28042-1-jbrunet@baylibre.com> X-Mailer: git-send-email 2.14.3 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Nothing really prevents a provider from (trying to) register a clock without providing the clock ops structure. We do check the individual fields before using them, but not the structure pointer itself. This may have the usual nasty consequences when the pointer is dereferenced, mostly likely when checking one the field during the initialization. This is fixed by returning an error on clock register if the ops pointer is NULL Fixes: b2476490ef11 ("clk: introduce the common clock framework") Signed-off-by: Jerome Brunet --- Mike, Stephen, I'm not really sure what the Fixes tag should here. From what I could see, we never checked the ops pointer before using it since the beginning of CCF. Regards Jerome drivers/clk/clk.c | 7 +++++++ 1 file changed, 7 insertions(+) -- 2.14.3 diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 8a1860a36c77..275b45664227 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -2683,7 +2683,13 @@ struct clk *clk_register(struct device *dev, struct clk_hw *hw) ret = -ENOMEM; goto fail_name; } + + if (!hw->init->ops) { + ret = -EINVAL; + goto fail_ops; + } core->ops = hw->init->ops; + if (dev && pm_runtime_enabled(dev)) core->dev = dev; if (dev && dev->driver) @@ -2745,6 +2751,7 @@ struct clk *clk_register(struct device *dev, struct clk_hw *hw) kfree_const(core->parent_names[i]); kfree(core->parent_names); fail_parent_names: +fail_ops: kfree_const(core->name); fail_name: kfree(core);