On 2015/10/10 23:00, Dan Carpenter wrote: > On Sat, Oct 10, 2015 at 02:48:22PM +0800, Chen Feng wrote: >> +static int hi6220_ion_probe(struct platform_device *pdev) >> +{ >> + int i; >> + int err = 0; >> + static struct ion_platform_heap *p_heap; >> + >> + idev = ion_device_create(NULL); >> + hi6220_set_platform_data(pdev); >> + heaps = devm_kzalloc(&pdev->dev, >> + sizeof(struct ion_heap *) * num_heaps, >> + GFP_KERNEL); >> + if (!heaps) >> + return -ENOMEM; >> + >> + /* >> + * create the heaps as specified in the dts file >> + */ >> + for (i = 0; i < num_heaps; i++) { >> + p_heap = heaps_data[i]; >> + heaps[i] = ion_heap_create(p_heap); >> + if (IS_ERR_OR_NULL(heaps[i])) { >> + err = PTR_ERR(heaps[i]); >> + goto err_free_heaps; >> + } >> + >> + ion_device_add_heap(idev, heaps[i]); >> + >> + pr_info("%s: adding heap %s of type %d with %lx@%lx\n", >> + __func__, p_heap->name, p_heap->type, >> + p_heap->base, (unsigned long)p_heap->size); >> + } >> + return err; >> + >> +err_free_heaps: >> + ion_device_destroy(idev); >> + for (i = 0; i < num_heaps; ++i) { >> + ion_heap_destroy(heaps[i]); >> + heaps[i] = NULL; >> + } >> + >> + return err; >> +} > > Thanks this is better but still not quite right. You have to unwind in > the reverse order from how you allocated things. > > err_free_heaps: > for (i = 0; i < num_heaps; ++i) { > ion_heap_destroy(heaps[i]); > heaps[i] = NULL; > } > err_destroy_idev: > ion_device_destroy(idev); > > return err; > > And earlier it should be: > > idev = ion_device_create(NULL); > hi6220_set_platform_data(pdev); > heaps = devm_kzalloc(&pdev->dev, > sizeof(struct ion_heap *) * num_heaps, > GFP_KERNEL); > - if (!heaps) > - return -ENOMEM; > + if (!heaps) { > + err = -ENOMEM; > + goto err_destroy_idev; > + } > > Otherwise we leak some resources if we can't allocate "heaps". > Yeah,it's right. I will fix this. > regards, > dan carpenter > > > . > _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel