Re: [pci:pci/resource 8/10] drivers/pci/of.c:332:3-8: WARNING: invalid free of devm_ allocated data

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxx>
> To: kbuild@xxxxxx
> Cc: Julia Lawall <julia.lawall@xxxxxxx>
> Subject: [pci:pci/resource 8/10] drivers/pci/of.c:332:3-8: WARNING: invalid free
>      of devm_ allocated data
> 
> CC: kbuild-all@xxxxxx
> CC: linux-pci@xxxxxxxxxxxxxxx
> TO: Jan Kiszka <jan.kiszka@xxxxxxxxxxx>
> CC: Bjorn Helgaas <helgaas@xxxxxxxxxx>
> 
> 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@xxxxxxxxxx>
> :::::: CC: Bjorn Helgaas <bhelgaas@xxxxxxxxxx>
> 
> ---
> 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



[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux