All of lore.kernel.org
 help / color / mirror / Atom feed
* [pci:pci/resource 8/10] drivers/pci/of.c:332:3-8: WARNING: invalid free of devm_ allocated data
@ 2018-05-11  5:08 Julia Lawall
  2018-05-11  5:45 ` Jan Kiszka
  0 siblings, 1 reply; 5+ messages in thread
From: Julia Lawall @ 2018-05-11  5:08 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Bjorn Helgaas, linux-pci, kbuild-all

The devm_kzalloc on line 324 makes the kfrees on lines 332 and 355
incorrect.  They can just be removed.

julia

---------- Forwarded message ----------
Date: Fri, 11 May 2018 10:49:38 +0800
From: kbuild test robot <lkp@intel.com>
To: kbuild@01.org
Cc: Julia Lawall <julia.lawall@lip6.fr>
Subject: [pci:pci/resource 8/10] drivers/pci/of.c:332:3-8: WARNING: invalid free
     of devm_ allocated data

CC: kbuild-all@01.org
CC: linux-pci@vger.kernel.org
TO: Jan Kiszka <jan.kiszka@siemens.com>
CC: Bjorn Helgaas <helgaas@kernel.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git pci/resource
head:   f2837b7a1764f7b58d2febec2fe37fb0cd99de24
commit: 67ed62eb921e31fd51c1d83ca6313b9aa3cead46 [8/10] PCI: Remove unused of_pci_get_host_bridge_resources()
:::::: branch date: 4 hours ago
:::::: commit date: 4 hours ago

>> drivers/pci/of.c:332:3-8: WARNING: invalid free of devm_ allocated data
   drivers/pci/of.c:355:1-6: WARNING: invalid free of devm_ allocated data

# https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git/commit/?id=67ed62eb921e31fd51c1d83ca6313b9aa3cead46
git remote add pci https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git
git remote update pci
git checkout 67ed62eb921e31fd51c1d83ca6313b9aa3cead46
vim +332 drivers/pci/of.c

4670d610d Rob Herring 2018-01-17  244
4670d610d Rob Herring 2018-01-17  245  #if defined(CONFIG_OF_ADDRESS)
67ed62eb9 Jan Kiszka  2018-05-09  246  /**
67ed62eb9 Jan Kiszka  2018-05-09  247   * devm_of_pci_get_host_bridge_resources() - Resource-managed parsing of PCI
67ed62eb9 Jan Kiszka  2018-05-09  248   *                                           host bridge resources from DT
67ed62eb9 Jan Kiszka  2018-05-09  249   * @dev: host bridge device
67ed62eb9 Jan Kiszka  2018-05-09  250   * @busno: bus number associated with the bridge root bus
67ed62eb9 Jan Kiszka  2018-05-09  251   * @bus_max: maximum number of buses for this bridge
67ed62eb9 Jan Kiszka  2018-05-09  252   * @resources: list where the range of resources will be added after DT parsing
67ed62eb9 Jan Kiszka  2018-05-09  253   * @io_base: pointer to a variable that will contain on return the physical
67ed62eb9 Jan Kiszka  2018-05-09  254   * address for the start of the I/O range. Can be NULL if the caller doesn't
67ed62eb9 Jan Kiszka  2018-05-09  255   * expect I/O ranges to be present in the device tree.
67ed62eb9 Jan Kiszka  2018-05-09  256   *
67ed62eb9 Jan Kiszka  2018-05-09  257   * This function will parse the "ranges" property of a PCI host bridge device
67ed62eb9 Jan Kiszka  2018-05-09  258   * node and setup the resource mapping based on its content. It is expected
67ed62eb9 Jan Kiszka  2018-05-09  259   * that the property conforms with the Power ePAPR document.
67ed62eb9 Jan Kiszka  2018-05-09  260   *
67ed62eb9 Jan Kiszka  2018-05-09  261   * It returns zero if the range parsing has been successful or a standard error
67ed62eb9 Jan Kiszka  2018-05-09  262   * value if it failed.
67ed62eb9 Jan Kiszka  2018-05-09  263   */
67ed62eb9 Jan Kiszka  2018-05-09  264  int devm_of_pci_get_host_bridge_resources(struct device *dev,
4670d610d Rob Herring 2018-01-17  265  			unsigned char busno, unsigned char bus_max,
4670d610d Rob Herring 2018-01-17  266  			struct list_head *resources, resource_size_t *io_base)
4670d610d Rob Herring 2018-01-17  267  {
67ed62eb9 Jan Kiszka  2018-05-09  268  	struct device_node *dev_node = dev->of_node;
4670d610d Rob Herring 2018-01-17  269  	struct resource_entry *window;
4670d610d Rob Herring 2018-01-17  270  	struct resource *res;
4670d610d Rob Herring 2018-01-17  271  	struct resource *bus_range;
4670d610d Rob Herring 2018-01-17  272  	struct of_pci_range range;
4670d610d Rob Herring 2018-01-17  273  	struct of_pci_range_parser parser;
4670d610d Rob Herring 2018-01-17  274  	char range_type[4];
4670d610d Rob Herring 2018-01-17  275  	int err;
4670d610d Rob Herring 2018-01-17  276
4670d610d Rob Herring 2018-01-17  277  	if (io_base)
4670d610d Rob Herring 2018-01-17  278  		*io_base = (resource_size_t)OF_BAD_ADDR;
4670d610d Rob Herring 2018-01-17  279
07adab611 Jan Kiszka  2018-04-30  280  	bus_range = devm_kzalloc(dev,sizeof(*bus_range), GFP_KERNEL);
4670d610d Rob Herring 2018-01-17  281  	if (!bus_range)
4670d610d Rob Herring 2018-01-17  282  		return -ENOMEM;
4670d610d Rob Herring 2018-01-17  283
877a66649 Jan Kiszka  2018-04-30  284  	dev_info(dev, "host bridge %pOF ranges:\n", dev_node);
4670d610d Rob Herring 2018-01-17  285
08c1b3b10 Jan Kiszka  2018-04-30  286  	err = of_pci_parse_bus_range(dev_node, bus_range);
4670d610d Rob Herring 2018-01-17  287  	if (err) {
4670d610d Rob Herring 2018-01-17  288  		bus_range->start = busno;
4670d610d Rob Herring 2018-01-17  289  		bus_range->end = bus_max;
4670d610d Rob Herring 2018-01-17  290  		bus_range->flags = IORESOURCE_BUS;
877a66649 Jan Kiszka  2018-04-30  291  		dev_info(dev, "  No bus range found for %pOF, using %pR\n",
08c1b3b10 Jan Kiszka  2018-04-30  292  			 dev_node, bus_range);
4670d610d Rob Herring 2018-01-17  293  	} else {
4670d610d Rob Herring 2018-01-17  294  		if (bus_range->end > bus_range->start + bus_max)
4670d610d Rob Herring 2018-01-17  295  			bus_range->end = bus_range->start + bus_max;
4670d610d Rob Herring 2018-01-17  296  	}
4670d610d Rob Herring 2018-01-17  297  	pci_add_resource(resources, bus_range);
4670d610d Rob Herring 2018-01-17  298
4670d610d Rob Herring 2018-01-17  299  	/* Check for ranges property */
08c1b3b10 Jan Kiszka  2018-04-30  300  	err = of_pci_range_parser_init(&parser, dev_node);
4670d610d Rob Herring 2018-01-17  301  	if (err)
4670d610d Rob Herring 2018-01-17  302  		goto parse_failed;
4670d610d Rob Herring 2018-01-17  303
877a66649 Jan Kiszka  2018-04-30  304  	dev_dbg(dev, "Parsing ranges property...\n");
4670d610d Rob Herring 2018-01-17  305  	for_each_of_pci_range(&parser, &range) {
4670d610d Rob Herring 2018-01-17  306  		/* Read next ranges element */
4670d610d Rob Herring 2018-01-17  307  		if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_IO)
4670d610d Rob Herring 2018-01-17  308  			snprintf(range_type, 4, " IO");
4670d610d Rob Herring 2018-01-17  309  		else if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_MEM)
4670d610d Rob Herring 2018-01-17  310  			snprintf(range_type, 4, "MEM");
4670d610d Rob Herring 2018-01-17  311  		else
4670d610d Rob Herring 2018-01-17  312  			snprintf(range_type, 4, "err");
877a66649 Jan Kiszka  2018-04-30  313  		dev_info(dev, "  %s %#010llx..%#010llx -> %#010llx\n",
877a66649 Jan Kiszka  2018-04-30  314  			 range_type, range.cpu_addr,
877a66649 Jan Kiszka  2018-04-30  315  			 range.cpu_addr + range.size - 1, range.pci_addr);
4670d610d Rob Herring 2018-01-17  316
4670d610d Rob Herring 2018-01-17  317  		/*
4670d610d Rob Herring 2018-01-17  318  		 * If we failed translation or got a zero-sized region
4670d610d Rob Herring 2018-01-17  319  		 * then skip this range
4670d610d Rob Herring 2018-01-17  320  		 */
4670d610d Rob Herring 2018-01-17  321  		if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
4670d610d Rob Herring 2018-01-17  322  			continue;
4670d610d Rob Herring 2018-01-17  323
67ed62eb9 Jan Kiszka  2018-05-09  324  		res = devm_kzalloc(dev, sizeof(struct resource), GFP_KERNEL);
4670d610d Rob Herring 2018-01-17  325  		if (!res) {
4670d610d Rob Herring 2018-01-17  326  			err = -ENOMEM;
4670d610d Rob Herring 2018-01-17  327  			goto parse_failed;
4670d610d Rob Herring 2018-01-17  328  		}
4670d610d Rob Herring 2018-01-17  329
08c1b3b10 Jan Kiszka  2018-04-30  330  		err = of_pci_range_to_resource(&range, dev_node, res);
4670d610d Rob Herring 2018-01-17  331  		if (err) {
4670d610d Rob Herring 2018-01-17 @332  			kfree(res);
4670d610d Rob Herring 2018-01-17  333  			continue;
4670d610d Rob Herring 2018-01-17  334  		}
4670d610d Rob Herring 2018-01-17  335
4670d610d Rob Herring 2018-01-17  336  		if (resource_type(res) == IORESOURCE_IO) {
4670d610d Rob Herring 2018-01-17  337  			if (!io_base) {
877a66649 Jan Kiszka  2018-04-30  338  				dev_err(dev, "I/O range found for %pOF. Please provide an io_base pointer to save CPU base address\n",
08c1b3b10 Jan Kiszka  2018-04-30  339  					dev_node);
4670d610d Rob Herring 2018-01-17  340  				err = -EINVAL;
4670d610d Rob Herring 2018-01-17  341  				goto conversion_failed;
4670d610d Rob Herring 2018-01-17  342  			}
4670d610d Rob Herring 2018-01-17  343  			if (*io_base != (resource_size_t)OF_BAD_ADDR)
877a66649 Jan Kiszka  2018-04-30  344  				dev_warn(dev, "More than one I/O resource converted for %pOF. CPU base address for old range lost!\n",
08c1b3b10 Jan Kiszka  2018-04-30  345  					 dev_node);
4670d610d Rob Herring 2018-01-17  346  			*io_base = range.cpu_addr;
4670d610d Rob Herring 2018-01-17  347  		}
4670d610d Rob Herring 2018-01-17  348
4670d610d Rob Herring 2018-01-17  349  		pci_add_resource_offset(resources, res,	res->start - range.pci_addr);
4670d610d Rob Herring 2018-01-17  350  	}
4670d610d Rob Herring 2018-01-17  351
4670d610d Rob Herring 2018-01-17  352  	return 0;
4670d610d Rob Herring 2018-01-17  353
4670d610d Rob Herring 2018-01-17  354  conversion_failed:
4670d610d Rob Herring 2018-01-17  355  	kfree(res);
4670d610d Rob Herring 2018-01-17  356  parse_failed:
4670d610d Rob Herring 2018-01-17  357  	resource_list_for_each_entry(window, resources)
4670d610d Rob Herring 2018-01-17  358  		kfree(window->res);
4670d610d Rob Herring 2018-01-17  359  	pci_free_resource_list(resources);
4670d610d Rob Herring 2018-01-17  360  	return err;
4670d610d Rob Herring 2018-01-17  361  }
83d525c0f Jan Kiszka  2018-04-30  362  EXPORT_SYMBOL_GPL(devm_of_pci_get_host_bridge_resources);
4670d610d Rob Herring 2018-01-17  363  #endif /* CONFIG_OF_ADDRESS */
4670d610d Rob Herring 2018-01-17  364

:::::: The code at line 332 was first introduced by commit
:::::: 4670d610d59233b017a6ea1fa25bbf06dabbff42 PCI: Move OF-related PCI functions into PCI core

:::::: TO: Rob Herring <robh@kernel.org>
:::::: CC: Bjorn Helgaas <bhelgaas@google.com>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [pci:pci/resource 8/10] drivers/pci/of.c:332:3-8: WARNING: invalid free of devm_ allocated data
  2018-05-11  5:08 [pci:pci/resource 8/10] drivers/pci/of.c:332:3-8: WARNING: invalid free of devm_ allocated data Julia Lawall
@ 2018-05-11  5:45 ` Jan Kiszka
  2018-05-11  5:53   ` Jan Kiszka
  0 siblings, 1 reply; 5+ messages in thread
From: Jan Kiszka @ 2018-05-11  5:45 UTC (permalink / raw)
  To: Julia Lawall, Bjorn Helgaas; +Cc: linux-pci, kbuild-all

On 2018-05-11 07:08, Julia Lawall wrote:
> The devm_kzalloc on line 324 makes the kfrees on lines 332 and 355
> incorrect.  They can just be removed.

True. In fact, 358 and 359 should go as well - making them obsolete is
the whole point of this conversion.

The issue comes already with patch "Add dev parameter to
__of_pci_get_host_bridge_resources()" when dev != NULL. Bjorn, should I
resend the series with that patch fixed and the rest rebased? Or do you
prefer when I update only this patch, fixing the issue here?

Jan

> 
> julia
> 
> ---------- Forwarded message ----------
> Date: Fri, 11 May 2018 10:49:38 +0800
> From: kbuild test robot <lkp@intel.com>
> To: kbuild@01.org
> Cc: Julia Lawall <julia.lawall@lip6.fr>
> Subject: [pci:pci/resource 8/10] drivers/pci/of.c:332:3-8: WARNING: invalid free
>      of devm_ allocated data
> 
> CC: kbuild-all@01.org
> CC: linux-pci@vger.kernel.org
> TO: Jan Kiszka <jan.kiszka@siemens.com>
> CC: Bjorn Helgaas <helgaas@kernel.org>
> 
> tree:   https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git pci/resource
> head:   f2837b7a1764f7b58d2febec2fe37fb0cd99de24
> commit: 67ed62eb921e31fd51c1d83ca6313b9aa3cead46 [8/10] PCI: Remove unused of_pci_get_host_bridge_resources()
> :::::: branch date: 4 hours ago
> :::::: commit date: 4 hours ago
> 
>>> drivers/pci/of.c:332:3-8: WARNING: invalid free of devm_ allocated data
>    drivers/pci/of.c:355:1-6: WARNING: invalid free of devm_ allocated data
> 
> # https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git/commit/?id=67ed62eb921e31fd51c1d83ca6313b9aa3cead46
> git remote add pci https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git
> git remote update pci
> git checkout 67ed62eb921e31fd51c1d83ca6313b9aa3cead46
> vim +332 drivers/pci/of.c
> 
> 4670d610d Rob Herring 2018-01-17  244
> 4670d610d Rob Herring 2018-01-17  245  #if defined(CONFIG_OF_ADDRESS)
> 67ed62eb9 Jan Kiszka  2018-05-09  246  /**
> 67ed62eb9 Jan Kiszka  2018-05-09  247   * devm_of_pci_get_host_bridge_resources() - Resource-managed parsing of PCI
> 67ed62eb9 Jan Kiszka  2018-05-09  248   *                                           host bridge resources from DT
> 67ed62eb9 Jan Kiszka  2018-05-09  249   * @dev: host bridge device
> 67ed62eb9 Jan Kiszka  2018-05-09  250   * @busno: bus number associated with the bridge root bus
> 67ed62eb9 Jan Kiszka  2018-05-09  251   * @bus_max: maximum number of buses for this bridge
> 67ed62eb9 Jan Kiszka  2018-05-09  252   * @resources: list where the range of resources will be added after DT parsing
> 67ed62eb9 Jan Kiszka  2018-05-09  253   * @io_base: pointer to a variable that will contain on return the physical
> 67ed62eb9 Jan Kiszka  2018-05-09  254   * address for the start of the I/O range. Can be NULL if the caller doesn't
> 67ed62eb9 Jan Kiszka  2018-05-09  255   * expect I/O ranges to be present in the device tree.
> 67ed62eb9 Jan Kiszka  2018-05-09  256   *
> 67ed62eb9 Jan Kiszka  2018-05-09  257   * This function will parse the "ranges" property of a PCI host bridge device
> 67ed62eb9 Jan Kiszka  2018-05-09  258   * node and setup the resource mapping based on its content. It is expected
> 67ed62eb9 Jan Kiszka  2018-05-09  259   * that the property conforms with the Power ePAPR document.
> 67ed62eb9 Jan Kiszka  2018-05-09  260   *
> 67ed62eb9 Jan Kiszka  2018-05-09  261   * It returns zero if the range parsing has been successful or a standard error
> 67ed62eb9 Jan Kiszka  2018-05-09  262   * value if it failed.
> 67ed62eb9 Jan Kiszka  2018-05-09  263   */
> 67ed62eb9 Jan Kiszka  2018-05-09  264  int devm_of_pci_get_host_bridge_resources(struct device *dev,
> 4670d610d Rob Herring 2018-01-17  265  			unsigned char busno, unsigned char bus_max,
> 4670d610d Rob Herring 2018-01-17  266  			struct list_head *resources, resource_size_t *io_base)
> 4670d610d Rob Herring 2018-01-17  267  {
> 67ed62eb9 Jan Kiszka  2018-05-09  268  	struct device_node *dev_node = dev->of_node;
> 4670d610d Rob Herring 2018-01-17  269  	struct resource_entry *window;
> 4670d610d Rob Herring 2018-01-17  270  	struct resource *res;
> 4670d610d Rob Herring 2018-01-17  271  	struct resource *bus_range;
> 4670d610d Rob Herring 2018-01-17  272  	struct of_pci_range range;
> 4670d610d Rob Herring 2018-01-17  273  	struct of_pci_range_parser parser;
> 4670d610d Rob Herring 2018-01-17  274  	char range_type[4];
> 4670d610d Rob Herring 2018-01-17  275  	int err;
> 4670d610d Rob Herring 2018-01-17  276
> 4670d610d Rob Herring 2018-01-17  277  	if (io_base)
> 4670d610d Rob Herring 2018-01-17  278  		*io_base = (resource_size_t)OF_BAD_ADDR;
> 4670d610d Rob Herring 2018-01-17  279
> 07adab611 Jan Kiszka  2018-04-30  280  	bus_range = devm_kzalloc(dev,sizeof(*bus_range), GFP_KERNEL);
> 4670d610d Rob Herring 2018-01-17  281  	if (!bus_range)
> 4670d610d Rob Herring 2018-01-17  282  		return -ENOMEM;
> 4670d610d Rob Herring 2018-01-17  283
> 877a66649 Jan Kiszka  2018-04-30  284  	dev_info(dev, "host bridge %pOF ranges:\n", dev_node);
> 4670d610d Rob Herring 2018-01-17  285
> 08c1b3b10 Jan Kiszka  2018-04-30  286  	err = of_pci_parse_bus_range(dev_node, bus_range);
> 4670d610d Rob Herring 2018-01-17  287  	if (err) {
> 4670d610d Rob Herring 2018-01-17  288  		bus_range->start = busno;
> 4670d610d Rob Herring 2018-01-17  289  		bus_range->end = bus_max;
> 4670d610d Rob Herring 2018-01-17  290  		bus_range->flags = IORESOURCE_BUS;
> 877a66649 Jan Kiszka  2018-04-30  291  		dev_info(dev, "  No bus range found for %pOF, using %pR\n",
> 08c1b3b10 Jan Kiszka  2018-04-30  292  			 dev_node, bus_range);
> 4670d610d Rob Herring 2018-01-17  293  	} else {
> 4670d610d Rob Herring 2018-01-17  294  		if (bus_range->end > bus_range->start + bus_max)
> 4670d610d Rob Herring 2018-01-17  295  			bus_range->end = bus_range->start + bus_max;
> 4670d610d Rob Herring 2018-01-17  296  	}
> 4670d610d Rob Herring 2018-01-17  297  	pci_add_resource(resources, bus_range);
> 4670d610d Rob Herring 2018-01-17  298
> 4670d610d Rob Herring 2018-01-17  299  	/* Check for ranges property */
> 08c1b3b10 Jan Kiszka  2018-04-30  300  	err = of_pci_range_parser_init(&parser, dev_node);
> 4670d610d Rob Herring 2018-01-17  301  	if (err)
> 4670d610d Rob Herring 2018-01-17  302  		goto parse_failed;
> 4670d610d Rob Herring 2018-01-17  303
> 877a66649 Jan Kiszka  2018-04-30  304  	dev_dbg(dev, "Parsing ranges property...\n");
> 4670d610d Rob Herring 2018-01-17  305  	for_each_of_pci_range(&parser, &range) {
> 4670d610d Rob Herring 2018-01-17  306  		/* Read next ranges element */
> 4670d610d Rob Herring 2018-01-17  307  		if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_IO)
> 4670d610d Rob Herring 2018-01-17  308  			snprintf(range_type, 4, " IO");
> 4670d610d Rob Herring 2018-01-17  309  		else if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_MEM)
> 4670d610d Rob Herring 2018-01-17  310  			snprintf(range_type, 4, "MEM");
> 4670d610d Rob Herring 2018-01-17  311  		else
> 4670d610d Rob Herring 2018-01-17  312  			snprintf(range_type, 4, "err");
> 877a66649 Jan Kiszka  2018-04-30  313  		dev_info(dev, "  %s %#010llx..%#010llx -> %#010llx\n",
> 877a66649 Jan Kiszka  2018-04-30  314  			 range_type, range.cpu_addr,
> 877a66649 Jan Kiszka  2018-04-30  315  			 range.cpu_addr + range.size - 1, range.pci_addr);
> 4670d610d Rob Herring 2018-01-17  316
> 4670d610d Rob Herring 2018-01-17  317  		/*
> 4670d610d Rob Herring 2018-01-17  318  		 * If we failed translation or got a zero-sized region
> 4670d610d Rob Herring 2018-01-17  319  		 * then skip this range
> 4670d610d Rob Herring 2018-01-17  320  		 */
> 4670d610d Rob Herring 2018-01-17  321  		if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
> 4670d610d Rob Herring 2018-01-17  322  			continue;
> 4670d610d Rob Herring 2018-01-17  323
> 67ed62eb9 Jan Kiszka  2018-05-09  324  		res = devm_kzalloc(dev, sizeof(struct resource), GFP_KERNEL);
> 4670d610d Rob Herring 2018-01-17  325  		if (!res) {
> 4670d610d Rob Herring 2018-01-17  326  			err = -ENOMEM;
> 4670d610d Rob Herring 2018-01-17  327  			goto parse_failed;
> 4670d610d Rob Herring 2018-01-17  328  		}
> 4670d610d Rob Herring 2018-01-17  329
> 08c1b3b10 Jan Kiszka  2018-04-30  330  		err = of_pci_range_to_resource(&range, dev_node, res);
> 4670d610d Rob Herring 2018-01-17  331  		if (err) {
> 4670d610d Rob Herring 2018-01-17 @332  			kfree(res);
> 4670d610d Rob Herring 2018-01-17  333  			continue;
> 4670d610d Rob Herring 2018-01-17  334  		}
> 4670d610d Rob Herring 2018-01-17  335
> 4670d610d Rob Herring 2018-01-17  336  		if (resource_type(res) == IORESOURCE_IO) {
> 4670d610d Rob Herring 2018-01-17  337  			if (!io_base) {
> 877a66649 Jan Kiszka  2018-04-30  338  				dev_err(dev, "I/O range found for %pOF. Please provide an io_base pointer to save CPU base address\n",
> 08c1b3b10 Jan Kiszka  2018-04-30  339  					dev_node);
> 4670d610d Rob Herring 2018-01-17  340  				err = -EINVAL;
> 4670d610d Rob Herring 2018-01-17  341  				goto conversion_failed;
> 4670d610d Rob Herring 2018-01-17  342  			}
> 4670d610d Rob Herring 2018-01-17  343  			if (*io_base != (resource_size_t)OF_BAD_ADDR)
> 877a66649 Jan Kiszka  2018-04-30  344  				dev_warn(dev, "More than one I/O resource converted for %pOF. CPU base address for old range lost!\n",
> 08c1b3b10 Jan Kiszka  2018-04-30  345  					 dev_node);
> 4670d610d Rob Herring 2018-01-17  346  			*io_base = range.cpu_addr;
> 4670d610d Rob Herring 2018-01-17  347  		}
> 4670d610d Rob Herring 2018-01-17  348
> 4670d610d Rob Herring 2018-01-17  349  		pci_add_resource_offset(resources, res,	res->start - range.pci_addr);
> 4670d610d Rob Herring 2018-01-17  350  	}
> 4670d610d Rob Herring 2018-01-17  351
> 4670d610d Rob Herring 2018-01-17  352  	return 0;
> 4670d610d Rob Herring 2018-01-17  353
> 4670d610d Rob Herring 2018-01-17  354  conversion_failed:
> 4670d610d Rob Herring 2018-01-17  355  	kfree(res);
> 4670d610d Rob Herring 2018-01-17  356  parse_failed:
> 4670d610d Rob Herring 2018-01-17  357  	resource_list_for_each_entry(window, resources)
> 4670d610d Rob Herring 2018-01-17  358  		kfree(window->res);
> 4670d610d Rob Herring 2018-01-17  359  	pci_free_resource_list(resources);
> 4670d610d Rob Herring 2018-01-17  360  	return err;
> 4670d610d Rob Herring 2018-01-17  361  }
> 83d525c0f Jan Kiszka  2018-04-30  362  EXPORT_SYMBOL_GPL(devm_of_pci_get_host_bridge_resources);
> 4670d610d Rob Herring 2018-01-17  363  #endif /* CONFIG_OF_ADDRESS */
> 4670d610d Rob Herring 2018-01-17  364
> 
> :::::: The code at line 332 was first introduced by commit
> :::::: 4670d610d59233b017a6ea1fa25bbf06dabbff42 PCI: Move OF-related PCI functions into PCI core
> 
> :::::: TO: Rob Herring <robh@kernel.org>
> :::::: CC: Bjorn Helgaas <bhelgaas@google.com>
> 
> ---
> 0-DAY kernel test infrastructure                Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
> 

-- 
Siemens AG, Corporate Technology, CT RDA IOT SES-DE
Corporate Competence Center Embedded Linux

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [pci:pci/resource 8/10] drivers/pci/of.c:332:3-8: WARNING: invalid free of devm_ allocated data
  2018-05-11  5:45 ` Jan Kiszka
@ 2018-05-11  5:53   ` Jan Kiszka
  2018-05-11 22:27     ` Bjorn Helgaas
  0 siblings, 1 reply; 5+ messages in thread
From: Jan Kiszka @ 2018-05-11  5:53 UTC (permalink / raw)
  To: Julia Lawall, Bjorn Helgaas; +Cc: linux-pci, kbuild-all

On 2018-05-11 07:45, Jan Kiszka wrote:
> On 2018-05-11 07:08, Julia Lawall wrote:
>> The devm_kzalloc on line 324 makes the kfrees on lines 332 and 355
>> incorrect.  They can just be removed.
> 
> True. In fact, 358 and 359 should go as well - making them obsolete is
> the whole point of this conversion.

More precisely, 332 needs to become devm_kfree because we skip over one
resource without failing.

> 
> The issue comes already with patch "Add dev parameter to
> __of_pci_get_host_bridge_resources()" when dev != NULL. Bjorn, should I
> resend the series with that patch fixed and the rest rebased? Or do you
> prefer when I update only this patch, fixing the issue here?

...or is a fixup patch on top preferred?

Jan

> 
> Jan
> 
>>
>> julia
>>
>> ---------- Forwarded message ----------
>> Date: Fri, 11 May 2018 10:49:38 +0800
>> From: kbuild test robot <lkp@intel.com>
>> To: kbuild@01.org
>> Cc: Julia Lawall <julia.lawall@lip6.fr>
>> Subject: [pci:pci/resource 8/10] drivers/pci/of.c:332:3-8: WARNING: invalid free
>>      of devm_ allocated data
>>
>> CC: kbuild-all@01.org
>> CC: linux-pci@vger.kernel.org
>> TO: Jan Kiszka <jan.kiszka@siemens.com>
>> CC: Bjorn Helgaas <helgaas@kernel.org>
>>
>> tree:   https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git pci/resource
>> head:   f2837b7a1764f7b58d2febec2fe37fb0cd99de24
>> commit: 67ed62eb921e31fd51c1d83ca6313b9aa3cead46 [8/10] PCI: Remove unused of_pci_get_host_bridge_resources()
>> :::::: branch date: 4 hours ago
>> :::::: commit date: 4 hours ago
>>
>>>> drivers/pci/of.c:332:3-8: WARNING: invalid free of devm_ allocated data
>>    drivers/pci/of.c:355:1-6: WARNING: invalid free of devm_ allocated data
>>
>> # https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git/commit/?id=67ed62eb921e31fd51c1d83ca6313b9aa3cead46
>> git remote add pci https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git
>> git remote update pci
>> git checkout 67ed62eb921e31fd51c1d83ca6313b9aa3cead46
>> vim +332 drivers/pci/of.c
>>
>> 4670d610d Rob Herring 2018-01-17  244
>> 4670d610d Rob Herring 2018-01-17  245  #if defined(CONFIG_OF_ADDRESS)
>> 67ed62eb9 Jan Kiszka  2018-05-09  246  /**
>> 67ed62eb9 Jan Kiszka  2018-05-09  247   * devm_of_pci_get_host_bridge_resources() - Resource-managed parsing of PCI
>> 67ed62eb9 Jan Kiszka  2018-05-09  248   *                                           host bridge resources from DT
>> 67ed62eb9 Jan Kiszka  2018-05-09  249   * @dev: host bridge device
>> 67ed62eb9 Jan Kiszka  2018-05-09  250   * @busno: bus number associated with the bridge root bus
>> 67ed62eb9 Jan Kiszka  2018-05-09  251   * @bus_max: maximum number of buses for this bridge
>> 67ed62eb9 Jan Kiszka  2018-05-09  252   * @resources: list where the range of resources will be added after DT parsing
>> 67ed62eb9 Jan Kiszka  2018-05-09  253   * @io_base: pointer to a variable that will contain on return the physical
>> 67ed62eb9 Jan Kiszka  2018-05-09  254   * address for the start of the I/O range. Can be NULL if the caller doesn't
>> 67ed62eb9 Jan Kiszka  2018-05-09  255   * expect I/O ranges to be present in the device tree.
>> 67ed62eb9 Jan Kiszka  2018-05-09  256   *
>> 67ed62eb9 Jan Kiszka  2018-05-09  257   * This function will parse the "ranges" property of a PCI host bridge device
>> 67ed62eb9 Jan Kiszka  2018-05-09  258   * node and setup the resource mapping based on its content. It is expected
>> 67ed62eb9 Jan Kiszka  2018-05-09  259   * that the property conforms with the Power ePAPR document.
>> 67ed62eb9 Jan Kiszka  2018-05-09  260   *
>> 67ed62eb9 Jan Kiszka  2018-05-09  261   * It returns zero if the range parsing has been successful or a standard error
>> 67ed62eb9 Jan Kiszka  2018-05-09  262   * value if it failed.
>> 67ed62eb9 Jan Kiszka  2018-05-09  263   */
>> 67ed62eb9 Jan Kiszka  2018-05-09  264  int devm_of_pci_get_host_bridge_resources(struct device *dev,
>> 4670d610d Rob Herring 2018-01-17  265  			unsigned char busno, unsigned char bus_max,
>> 4670d610d Rob Herring 2018-01-17  266  			struct list_head *resources, resource_size_t *io_base)
>> 4670d610d Rob Herring 2018-01-17  267  {
>> 67ed62eb9 Jan Kiszka  2018-05-09  268  	struct device_node *dev_node = dev->of_node;
>> 4670d610d Rob Herring 2018-01-17  269  	struct resource_entry *window;
>> 4670d610d Rob Herring 2018-01-17  270  	struct resource *res;
>> 4670d610d Rob Herring 2018-01-17  271  	struct resource *bus_range;
>> 4670d610d Rob Herring 2018-01-17  272  	struct of_pci_range range;
>> 4670d610d Rob Herring 2018-01-17  273  	struct of_pci_range_parser parser;
>> 4670d610d Rob Herring 2018-01-17  274  	char range_type[4];
>> 4670d610d Rob Herring 2018-01-17  275  	int err;
>> 4670d610d Rob Herring 2018-01-17  276
>> 4670d610d Rob Herring 2018-01-17  277  	if (io_base)
>> 4670d610d Rob Herring 2018-01-17  278  		*io_base = (resource_size_t)OF_BAD_ADDR;
>> 4670d610d Rob Herring 2018-01-17  279
>> 07adab611 Jan Kiszka  2018-04-30  280  	bus_range = devm_kzalloc(dev,sizeof(*bus_range), GFP_KERNEL);
>> 4670d610d Rob Herring 2018-01-17  281  	if (!bus_range)
>> 4670d610d Rob Herring 2018-01-17  282  		return -ENOMEM;
>> 4670d610d Rob Herring 2018-01-17  283
>> 877a66649 Jan Kiszka  2018-04-30  284  	dev_info(dev, "host bridge %pOF ranges:\n", dev_node);
>> 4670d610d Rob Herring 2018-01-17  285
>> 08c1b3b10 Jan Kiszka  2018-04-30  286  	err = of_pci_parse_bus_range(dev_node, bus_range);
>> 4670d610d Rob Herring 2018-01-17  287  	if (err) {
>> 4670d610d Rob Herring 2018-01-17  288  		bus_range->start = busno;
>> 4670d610d Rob Herring 2018-01-17  289  		bus_range->end = bus_max;
>> 4670d610d Rob Herring 2018-01-17  290  		bus_range->flags = IORESOURCE_BUS;
>> 877a66649 Jan Kiszka  2018-04-30  291  		dev_info(dev, "  No bus range found for %pOF, using %pR\n",
>> 08c1b3b10 Jan Kiszka  2018-04-30  292  			 dev_node, bus_range);
>> 4670d610d Rob Herring 2018-01-17  293  	} else {
>> 4670d610d Rob Herring 2018-01-17  294  		if (bus_range->end > bus_range->start + bus_max)
>> 4670d610d Rob Herring 2018-01-17  295  			bus_range->end = bus_range->start + bus_max;
>> 4670d610d Rob Herring 2018-01-17  296  	}
>> 4670d610d Rob Herring 2018-01-17  297  	pci_add_resource(resources, bus_range);
>> 4670d610d Rob Herring 2018-01-17  298
>> 4670d610d Rob Herring 2018-01-17  299  	/* Check for ranges property */
>> 08c1b3b10 Jan Kiszka  2018-04-30  300  	err = of_pci_range_parser_init(&parser, dev_node);
>> 4670d610d Rob Herring 2018-01-17  301  	if (err)
>> 4670d610d Rob Herring 2018-01-17  302  		goto parse_failed;
>> 4670d610d Rob Herring 2018-01-17  303
>> 877a66649 Jan Kiszka  2018-04-30  304  	dev_dbg(dev, "Parsing ranges property...\n");
>> 4670d610d Rob Herring 2018-01-17  305  	for_each_of_pci_range(&parser, &range) {
>> 4670d610d Rob Herring 2018-01-17  306  		/* Read next ranges element */
>> 4670d610d Rob Herring 2018-01-17  307  		if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_IO)
>> 4670d610d Rob Herring 2018-01-17  308  			snprintf(range_type, 4, " IO");
>> 4670d610d Rob Herring 2018-01-17  309  		else if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_MEM)
>> 4670d610d Rob Herring 2018-01-17  310  			snprintf(range_type, 4, "MEM");
>> 4670d610d Rob Herring 2018-01-17  311  		else
>> 4670d610d Rob Herring 2018-01-17  312  			snprintf(range_type, 4, "err");
>> 877a66649 Jan Kiszka  2018-04-30  313  		dev_info(dev, "  %s %#010llx..%#010llx -> %#010llx\n",
>> 877a66649 Jan Kiszka  2018-04-30  314  			 range_type, range.cpu_addr,
>> 877a66649 Jan Kiszka  2018-04-30  315  			 range.cpu_addr + range.size - 1, range.pci_addr);
>> 4670d610d Rob Herring 2018-01-17  316
>> 4670d610d Rob Herring 2018-01-17  317  		/*
>> 4670d610d Rob Herring 2018-01-17  318  		 * If we failed translation or got a zero-sized region
>> 4670d610d Rob Herring 2018-01-17  319  		 * then skip this range
>> 4670d610d Rob Herring 2018-01-17  320  		 */
>> 4670d610d Rob Herring 2018-01-17  321  		if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
>> 4670d610d Rob Herring 2018-01-17  322  			continue;
>> 4670d610d Rob Herring 2018-01-17  323
>> 67ed62eb9 Jan Kiszka  2018-05-09  324  		res = devm_kzalloc(dev, sizeof(struct resource), GFP_KERNEL);
>> 4670d610d Rob Herring 2018-01-17  325  		if (!res) {
>> 4670d610d Rob Herring 2018-01-17  326  			err = -ENOMEM;
>> 4670d610d Rob Herring 2018-01-17  327  			goto parse_failed;
>> 4670d610d Rob Herring 2018-01-17  328  		}
>> 4670d610d Rob Herring 2018-01-17  329
>> 08c1b3b10 Jan Kiszka  2018-04-30  330  		err = of_pci_range_to_resource(&range, dev_node, res);
>> 4670d610d Rob Herring 2018-01-17  331  		if (err) {
>> 4670d610d Rob Herring 2018-01-17 @332  			kfree(res);
>> 4670d610d Rob Herring 2018-01-17  333  			continue;
>> 4670d610d Rob Herring 2018-01-17  334  		}
>> 4670d610d Rob Herring 2018-01-17  335
>> 4670d610d Rob Herring 2018-01-17  336  		if (resource_type(res) == IORESOURCE_IO) {
>> 4670d610d Rob Herring 2018-01-17  337  			if (!io_base) {
>> 877a66649 Jan Kiszka  2018-04-30  338  				dev_err(dev, "I/O range found for %pOF. Please provide an io_base pointer to save CPU base address\n",
>> 08c1b3b10 Jan Kiszka  2018-04-30  339  					dev_node);
>> 4670d610d Rob Herring 2018-01-17  340  				err = -EINVAL;
>> 4670d610d Rob Herring 2018-01-17  341  				goto conversion_failed;
>> 4670d610d Rob Herring 2018-01-17  342  			}
>> 4670d610d Rob Herring 2018-01-17  343  			if (*io_base != (resource_size_t)OF_BAD_ADDR)
>> 877a66649 Jan Kiszka  2018-04-30  344  				dev_warn(dev, "More than one I/O resource converted for %pOF. CPU base address for old range lost!\n",
>> 08c1b3b10 Jan Kiszka  2018-04-30  345  					 dev_node);
>> 4670d610d Rob Herring 2018-01-17  346  			*io_base = range.cpu_addr;
>> 4670d610d Rob Herring 2018-01-17  347  		}
>> 4670d610d Rob Herring 2018-01-17  348
>> 4670d610d Rob Herring 2018-01-17  349  		pci_add_resource_offset(resources, res,	res->start - range.pci_addr);
>> 4670d610d Rob Herring 2018-01-17  350  	}
>> 4670d610d Rob Herring 2018-01-17  351
>> 4670d610d Rob Herring 2018-01-17  352  	return 0;
>> 4670d610d Rob Herring 2018-01-17  353
>> 4670d610d Rob Herring 2018-01-17  354  conversion_failed:
>> 4670d610d Rob Herring 2018-01-17  355  	kfree(res);
>> 4670d610d Rob Herring 2018-01-17  356  parse_failed:
>> 4670d610d Rob Herring 2018-01-17  357  	resource_list_for_each_entry(window, resources)
>> 4670d610d Rob Herring 2018-01-17  358  		kfree(window->res);
>> 4670d610d Rob Herring 2018-01-17  359  	pci_free_resource_list(resources);
>> 4670d610d Rob Herring 2018-01-17  360  	return err;
>> 4670d610d Rob Herring 2018-01-17  361  }
>> 83d525c0f Jan Kiszka  2018-04-30  362  EXPORT_SYMBOL_GPL(devm_of_pci_get_host_bridge_resources);
>> 4670d610d Rob Herring 2018-01-17  363  #endif /* CONFIG_OF_ADDRESS */
>> 4670d610d Rob Herring 2018-01-17  364
>>
>> :::::: The code at line 332 was first introduced by commit
>> :::::: 4670d610d59233b017a6ea1fa25bbf06dabbff42 PCI: Move OF-related PCI functions into PCI core
>>
>> :::::: TO: Rob Herring <robh@kernel.org>
>> :::::: CC: Bjorn Helgaas <bhelgaas@google.com>
>>
>> ---
>> 0-DAY kernel test infrastructure                Open Source Technology Center
>> https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
>>
> 


-- 
Siemens AG, Corporate Technology, CT RDA IOT SES-DE
Corporate Competence Center Embedded Linux

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [pci:pci/resource 8/10] drivers/pci/of.c:332:3-8: WARNING: invalid free of devm_ allocated data
  2018-05-11  5:53   ` Jan Kiszka
@ 2018-05-11 22:27     ` Bjorn Helgaas
  2018-05-13 18:22       ` [PATCH] PCI: Fix error cleanup paths in devm_of_pci_get_host_bridge_resources() Jan Kiszka
  0 siblings, 1 reply; 5+ messages in thread
From: Bjorn Helgaas @ 2018-05-11 22:27 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Julia Lawall, linux-pci, kbuild-all

On Fri, May 11, 2018 at 07:53:21AM +0200, Jan Kiszka wrote:
> On 2018-05-11 07:45, Jan Kiszka wrote:
> > On 2018-05-11 07:08, Julia Lawall wrote:
> >> The devm_kzalloc on line 324 makes the kfrees on lines 332 and 355
> >> incorrect.  They can just be removed.
> > 
> > True. In fact, 358 and 359 should go as well - making them obsolete is
> > the whole point of this conversion.
> 
> More precisely, 332 needs to become devm_kfree because we skip over one
> resource without failing.
> 
> > 
> > The issue comes already with patch "Add dev parameter to
> > __of_pci_get_host_bridge_resources()" when dev != NULL. Bjorn, should I
> > resend the series with that patch fixed and the rest rebased? Or do you
> > prefer when I update only this patch, fixing the issue here?
> 
> ...or is a fixup patch on top preferred?

Sorry, I missed this until now.  If you send me a fixup patch on top of my
pci/resource branch, I'll just fold it in.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH] PCI: Fix error cleanup paths in devm_of_pci_get_host_bridge_resources()
  2018-05-11 22:27     ` Bjorn Helgaas
@ 2018-05-13 18:22       ` Jan Kiszka
  0 siblings, 0 replies; 5+ messages in thread
From: Jan Kiszka @ 2018-05-13 18:22 UTC (permalink / raw)
  To: Bjorn Helgaas; +Cc: Julia Lawall, linux-pci, kbuild-all

Fallouts from the conversion to devm_kzalloc: In case the function
fails, we no longer need to clean up managed allocations. In fact, we
must not. Only one case requires explicit freeing, and that is when
of_pci_range_to_resource() fails and we simply skip over the related
resource entry.

Reported-by: Julia Lawall <julia.lawall@lip6.fr>
Fixes: 07adab611304 ("PCI: Add dev parameter to __of_pci_get_host_bridge_resources()")
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 drivers/pci/of.c | 22 +++++-----------------
 1 file changed, 5 insertions(+), 17 deletions(-)

diff --git a/drivers/pci/of.c b/drivers/pci/of.c
index 38469ffd1d7e..ad8cc1d677f3 100644
--- a/drivers/pci/of.c
+++ b/drivers/pci/of.c
@@ -266,7 +266,6 @@ int devm_of_pci_get_host_bridge_resources(struct device *dev,
 			struct list_head *resources, resource_size_t *io_base)
 {
 	struct device_node *dev_node = dev->of_node;
-	struct resource_entry *window;
 	struct resource *res;
 	struct resource *bus_range;
 	struct of_pci_range range;
@@ -299,7 +298,7 @@ int devm_of_pci_get_host_bridge_resources(struct device *dev,
 	/* Check for ranges property */
 	err = of_pci_range_parser_init(&parser, dev_node);
 	if (err)
-		goto parse_failed;
+		return err;
 
 	dev_dbg(dev, "Parsing ranges property...\n");
 	for_each_of_pci_range(&parser, &range) {
@@ -322,14 +321,12 @@ int devm_of_pci_get_host_bridge_resources(struct device *dev,
 			continue;
 
 		res = devm_kzalloc(dev, sizeof(struct resource), GFP_KERNEL);
-		if (!res) {
-			err = -ENOMEM;
-			goto parse_failed;
-		}
+		if (!res)
+			return -ENOMEM;
 
 		err = of_pci_range_to_resource(&range, dev_node, res);
 		if (err) {
-			kfree(res);
+			devm_kfree(dev, res);
 			continue;
 		}
 
@@ -338,8 +335,7 @@ int devm_of_pci_get_host_bridge_resources(struct device *dev,
 				dev_err(dev,
 					"I/O range found for %pOF. Please provide an io_base pointer to save CPU base address\n",
 					dev_node);
-				err = -EINVAL;
-				goto conversion_failed;
+				return -EINVAL;
 			}
 			if (*io_base != (resource_size_t)OF_BAD_ADDR)
 				dev_warn(dev,
@@ -352,14 +348,6 @@ int devm_of_pci_get_host_bridge_resources(struct device *dev,
 	}
 
 	return 0;
-
-conversion_failed:
-	kfree(res);
-parse_failed:
-	resource_list_for_each_entry(window, resources)
-		kfree(window->res);
-	pci_free_resource_list(resources);
-	return err;
 }
 EXPORT_SYMBOL_GPL(devm_of_pci_get_host_bridge_resources);
 #endif /* CONFIG_OF_ADDRESS */
-- 
2.13.6

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-05-13 18:22 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-11  5:08 [pci:pci/resource 8/10] drivers/pci/of.c:332:3-8: WARNING: invalid free of devm_ allocated data Julia Lawall
2018-05-11  5:45 ` Jan Kiszka
2018-05-11  5:53   ` Jan Kiszka
2018-05-11 22:27     ` Bjorn Helgaas
2018-05-13 18:22       ` [PATCH] PCI: Fix error cleanup paths in devm_of_pci_get_host_bridge_resources() Jan Kiszka

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.