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: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@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