Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spi: gpio: Make sure spi_master_put() is called in every error path

There's a number of failure paths in spi_gpio_probe() that do not call
spi_master_put() potentially leaking memory. Fix this problem by
registering a cleanup funciont via devm_add_action_or_reset() right
after SPI controller is allocated.

Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Cc: Mark Brown <broonie@kernel.org>
Cc: Chris Healy <cphealy@gmail.com>
Cc: linux-spi@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Andrey Smirnov and committed by
Mark Brown
8b797490 8b57b11b

+10 -7
+10 -7
drivers/spi/spi-gpio.c
··· 362 362 return 0; 363 363 } 364 364 365 + static void spi_gpio_put(void *data) 366 + { 367 + spi_master_put(data); 368 + } 369 + 365 370 static int spi_gpio_probe(struct platform_device *pdev) 366 371 { 367 372 int status; ··· 381 376 master = spi_alloc_master(dev, sizeof(*spi_gpio)); 382 377 if (!master) 383 378 return -ENOMEM; 379 + 380 + status = devm_add_action_or_reset(&pdev->dev, spi_gpio_put, master); 381 + if (status) 382 + return status; 384 383 385 384 if (of_id) 386 385 status = spi_gpio_probe_dt(pdev, master); ··· 437 428 } 438 429 bb->setup_transfer = spi_bitbang_setup_transfer; 439 430 440 - status = spi_bitbang_start(&spi_gpio->bitbang); 441 - if (status) 442 - spi_master_put(master); 443 - 444 - return status; 431 + return spi_bitbang_start(&spi_gpio->bitbang); 445 432 } 446 433 447 434 static int spi_gpio_remove(struct platform_device *pdev) ··· 448 443 449 444 /* stop() unregisters child devices too */ 450 445 spi_bitbang_stop(&spi_gpio->bitbang); 451 - 452 - spi_master_put(spi_gpio->bitbang.master); 453 446 454 447 return 0; 455 448 }