811-v6.1-0001-nvmem-core-Fix-memleak-in-nvmem_register.patch 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. From bd1244561fa2a4531ded40dbf09c9599084f8b29 Mon Sep 17 00:00:00 2001
  2. From: Gaosheng Cui <[email protected]>
  3. Date: Fri, 16 Sep 2022 13:04:02 +0100
  4. Subject: [PATCH] nvmem: core: Fix memleak in nvmem_register()
  5. dev_set_name will alloc memory for nvmem->dev.kobj.name in
  6. nvmem_register, when nvmem_validate_keepouts failed, nvmem's
  7. memory will be freed and return, but nobody will free memory
  8. for nvmem->dev.kobj.name, there will be memleak, so moving
  9. nvmem_validate_keepouts() after device_register() and let
  10. the device core deal with cleaning name in error cases.
  11. Fixes: de0534df9347 ("nvmem: core: fix error handling while validating keepout regions")
  12. Cc: [email protected]
  13. Signed-off-by: Gaosheng Cui <[email protected]>
  14. Signed-off-by: Srinivas Kandagatla <[email protected]>
  15. Link: https://lore.kernel.org/r/[email protected]
  16. Signed-off-by: Greg Kroah-Hartman <[email protected]>
  17. ---
  18. drivers/nvmem/core.c | 15 ++++++---------
  19. 1 file changed, 6 insertions(+), 9 deletions(-)
  20. --- a/drivers/nvmem/core.c
  21. +++ b/drivers/nvmem/core.c
  22. @@ -830,21 +830,18 @@ struct nvmem_device *nvmem_register(cons
  23. nvmem->dev.groups = nvmem_dev_groups;
  24. #endif
  25. - if (nvmem->nkeepout) {
  26. - rval = nvmem_validate_keepouts(nvmem);
  27. - if (rval) {
  28. - ida_free(&nvmem_ida, nvmem->id);
  29. - kfree(nvmem);
  30. - return ERR_PTR(rval);
  31. - }
  32. - }
  33. -
  34. dev_dbg(&nvmem->dev, "Registering nvmem device %s\n", config->name);
  35. rval = device_register(&nvmem->dev);
  36. if (rval)
  37. goto err_put_device;
  38. + if (nvmem->nkeepout) {
  39. + rval = nvmem_validate_keepouts(nvmem);
  40. + if (rval)
  41. + goto err_device_del;
  42. + }
  43. +
  44. if (config->compat) {
  45. rval = nvmem_sysfs_setup_compat(nvmem, config);
  46. if (rval)