Fix memory leak 67/258367/2
authorJunghyun Yeon <jungh.yeon@samsung.com>
Fri, 14 May 2021 06:26:33 +0000 (15:26 +0900)
committerJunghyun Yeon <jungh.yeon@samsung.com>
Fri, 28 May 2021 06:23:01 +0000 (06:23 +0000)
Filter handle should be freed before exit function unexpectdly.

Change-Id: If5a5b07cbbe4bfd93b9a3eb924dc8e89b8658a5d
Signed-off-by: Junghyun Yeon <jungh.yeon@samsung.com>
src/pkg_upgrade/src/pkg_finder.cc

index 2370742..60cf2c0 100644 (file)
@@ -134,8 +134,8 @@ int PkgFinder::PkgidListCb(const pkgmgrinfo_pkginfo_h handle, void* user_data) {
 }
 
 int PkgFinder::FindPreloadPkgidFromDb(bool read_only) {
-  int ret = 0;
-  pkgmgrinfo_pkginfo_filter_h handle = nullptr;
+  int ret;
+  pkgmgrinfo_pkginfo_filter_h handle;
 
   ret = pkgmgrinfo_pkginfo_filter_create(&handle);
   if (ret != PMINFO_R_OK) {
@@ -143,14 +143,18 @@ int PkgFinder::FindPreloadPkgidFromDb(bool read_only) {
     return -1;
   }
 
-  ret = pkgmgrinfo_pkginfo_filter_add_bool(handle,
+  std::unique_ptr<std::remove_pointer<pkgmgrinfo_pkginfo_filter_h>::type,
+      decltype(pkgmgrinfo_pkginfo_filter_destroy)*> handle_auto(
+          handle, pkgmgrinfo_pkginfo_filter_destroy);
+
+  ret = pkgmgrinfo_pkginfo_filter_add_bool(handle_auto.get(),
     PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD, 1);
   if (ret != PMINFO_R_OK) {
     LOG(ERROR) << "pkgmgrinfo_pkginfo_filter_add_bool failed " << ret;
     return -1;
   }
 
-  ret = pkgmgrinfo_pkginfo_filter_add_bool(handle,
+  ret = pkgmgrinfo_pkginfo_filter_add_bool(handle_auto.get(),
     PMINFO_PKGINFO_PROP_PACKAGE_READONLY, read_only ? 1 : 0);
   if (ret != PMINFO_R_OK) {
     LOG(ERROR) << "pkgmgrinfo_pkginfo_filter_add_bool failed " << ret;
@@ -158,19 +162,13 @@ int PkgFinder::FindPreloadPkgidFromDb(bool read_only) {
   }
 
   read_only_ = read_only;
-  ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(handle,
+  ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(handle_auto.get(),
     PkgidListCb, this);
   if (ret != PMINFO_R_OK) {
     LOG(ERROR) << "pkgmgrinfo_pkginfo_filter_foreach_pkginfo failed " << ret;
     return -1;
   }
 
-  ret = pkgmgrinfo_pkginfo_filter_destroy(handle);
-  if (ret != PMINFO_R_OK) {
-    LOG(ERROR) << "pkgmgrinfo_pkginfo_filter_destroy failed " << ret;
-    return -1;
-  }
-
   return 0;
 }