From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S946156AbdDTNpF (ORCPT ); Thu, 20 Apr 2017 09:45:05 -0400 Received: from Galois.linutronix.de ([146.0.238.70]:34913 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S946129AbdDTNpC (ORCPT ); Thu, 20 Apr 2017 09:45:02 -0400 Date: Thu, 20 Apr 2017 15:44:56 +0200 (CEST) From: Thomas Gleixner To: Vikas Shivappa cc: vikas.shivappa@intel.com, x86@kernel.org, linux-kernel@vger.kernel.org, sai.praneeth.prakhya@intel.com, hpa@zytor.com, mingo@kernel.org, ravi.v.shankar@intel.com, tony.luck@intel.com, fenghua.yu@intel.com Subject: Re: [PATCH 3/3] x86/intel_rdt: Return error for incorrect resource names in schemata In-Reply-To: <1492645804-17465-4-git-send-email-vikas.shivappa@linux.intel.com> Message-ID: References: <1492645804-17465-1-git-send-email-vikas.shivappa@linux.intel.com> <1492645804-17465-4-git-send-email-vikas.shivappa@linux.intel.com> User-Agent: Alpine 2.20 (DEB 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 19 Apr 2017, Vikas Shivappa wrote: > When schemata parses the resource names, currently it may not return > error for incorrect resource names and fail quietly without updating the > control values. > > This is because for_each_enabled_rdt_resource(r) leaves "r" pointing > beyond the end of the rdt_resources_all[] array, and we check for > !r->name which results in an out of bounds access and also may not be > NULL, hence we may not detect that we did not find the name user > supplied. > > Update this to check (r == (rdt_resources_all + RDT_NUM_RESOURCES)) > instead. > > Reported-by: Prakhya, Sai Praneeth > Signed-off-by: Vikas Shivappa > Tested-by: Prakhya, Sai Praneeth > --- > arch/x86/kernel/cpu/intel_rdt_schemata.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/arch/x86/kernel/cpu/intel_rdt_schemata.c b/arch/x86/kernel/cpu/intel_rdt_schemata.c > index 3cfa1ca..bb99bd8 100644 > --- a/arch/x86/kernel/cpu/intel_rdt_schemata.c > +++ b/arch/x86/kernel/cpu/intel_rdt_schemata.c > @@ -228,7 +228,7 @@ ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of, > break; > } > } > - if (!r->name) { > + if (r == (rdt_resources_all + RDT_NUM_RESOURCES)) { > ret = -EINVAL; > goto out; > } The resulting loop is just horrible to read. We can do better than that. Patch below. Thanks, tglx 8<------------- --- a/arch/x86/kernel/cpu/intel_rdt_schemata.c +++ b/arch/x86/kernel/cpu/intel_rdt_schemata.c @@ -187,6 +187,17 @@ static int update_domains(struct rdt_res return 0; } +static int rdtgroup_parse_resource(char *resname, char *tok, int closid) +{ + struct rdt_resource *r; + + for_each_enabled_rdt_resource(r) { + if (!strcmp(resname, r->name) && closid < r->num_closid) + return parse_line(tok, r); + } + return -EINVAL; +} + ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of, char *buf, size_t nbytes, loff_t off) { @@ -209,9 +220,10 @@ ssize_t rdtgroup_schemata_write(struct k closid = rdtgrp->closid; - for_each_enabled_rdt_resource(r) + for_each_enabled_rdt_resource(r) { list_for_each_entry(dom, &r->domains, list) dom->have_new_ctrl = false; + } while ((tok = strsep(&buf, "\n")) != NULL) { resname = strsep(&tok, ":"); @@ -219,19 +231,9 @@ ssize_t rdtgroup_schemata_write(struct k ret = -EINVAL; goto out; } - for_each_enabled_rdt_resource(r) { - if (!strcmp(strim(resname), r->name) && - closid < r->num_closid) { - ret = parse_line(tok, r); - if (ret) - goto out; - break; - } - } - if (!r->name) { - ret = -EINVAL; + ret = rdtgroup_parse_resource(strim(resname), tok, closid); + if (ret) goto out; - } } for_each_enabled_rdt_resource(r) {