Fix: Memory Leaks while XML parsing 52/281852/1 accepted/tizen/unified/20220923.125149 submit/tizen/20220922.140716
authorDewal Agarwal <d1.agarwal@samsung.com>
Thu, 22 Sep 2022 10:03:20 +0000 (15:33 +0530)
committerDewal Agarwal <d1.agarwal@samsung.com>
Thu, 22 Sep 2022 10:03:20 +0000 (15:33 +0530)
Change-Id: If51c5540788f31afa81f773498d8ffe834e23ed5
Signed-off-by: Dewal Agarwal <d1.agarwal@samsung.com>
packaging/sync-manager.spec
src/sync-service/SyncManager_RepositoryEngine.cpp

index ec3c3dd3c3d5a4f42006c979c10cd1726d7c63fb..eabb55dac389c192de0c396d35d059a5644a9cbc 100644 (file)
@@ -2,7 +2,7 @@
 %global __provides_exclude_from ^.*\\.extension-calendar
 
 Name:      sync-service
-Version:   0.3.41
+Version:   0.3.42
 Release:   1
 License:   Apache-2.0
 Summary:   Sync manager daemon
index 525556d6507fb72cb60d4c60b7f967ecf58c16c1..9b967eecd82c4d180df9d9e305450a7a09934475 100644 (file)
@@ -181,6 +181,10 @@ RepositoryEngine::CheckSyncJobsData(void) {
        } else {
                xmlChar* pTotalJobsCount = xmlGetProp(cur, XML_ATTR_JOBS_COUNT);
                int totalcount = (pTotalJobsCount == NULL) ? 0 : atoi((char*)pTotalJobsCount);
+               if (pTotalJobsCount != NULL) {
+                       xmlFree(pTotalJobsCount);
+                       pTotalJobsCount = NULL;
+               }
 
                if (totalcount == 0) {
                        LOG_LOGD("There is no remained Sync job");
@@ -190,6 +194,7 @@ RepositoryEngine::CheckSyncJobsData(void) {
                        LOG_LOGD("There are one or more registered Sync jobs");
                }
        }
+       xmlFreeDoc(doc);
 }
 /* LCOV_EXCL_STOP */
 
@@ -292,6 +297,10 @@ RepositoryEngine::ReadSyncJobsData(void) {
                xmlChar* pTotalJobsCount = xmlGetProp(cur, XML_ATTR_JOBS_COUNT);
                int totalcount = (pTotalJobsCount == NULL) ? 0 : atoi((char*)pTotalJobsCount);
                LOG_LOGD("Total Sync jobs [%d]", totalcount);
+               if (pTotalJobsCount != NULL) {
+                       xmlFree(pTotalJobsCount);
+                       pTotalJobsCount = NULL;
+               }
 
                if (totalcount == 0) {
                        ManageIdleState* pManageIdleState = SyncManager::GetInstance()->GetManageIdleState();
@@ -301,14 +310,16 @@ RepositoryEngine::ReadSyncJobsData(void) {
                cur = cur->xmlChildrenNode;
                while (cur != NULL) {
                        if (!xmlStrcmp(cur->name, XML_NODE_PACKAGE)) {
-                               xmlChar* pPackageId;
-                               xmlChar* pJobsCount;
+                               xmlChar* pPackageId = NULL;
+                               xmlChar* pJobsCount = NULL;
 
                                pPackageId = xmlGetProp(cur, XML_ATTR_PACKAGE_ID);
                                pJobsCount = xmlGetProp(cur, XML_ATTR_JOBS_COUNT);
 
                                int count = (pJobsCount == NULL) ? 0 : atoi((char*)pJobsCount);
                                LOG_LOGD("Sync jobs for package [%s] [%d]", pPackageId, count);
+                               if (pJobsCount != NULL)
+                                       xmlFree(pJobsCount);
 
                                xmlNodePtr curJob = cur->xmlChildrenNode;
                                while (curJob != NULL) {
@@ -320,6 +331,8 @@ RepositoryEngine::ReadSyncJobsData(void) {
 
                                        curJob = curJob->next;
                                }
+                               if (pPackageId != NULL)
+                                       xmlFree(pPackageId);
                        }
                        cur = cur->next;
                }
@@ -383,11 +396,14 @@ RepositoryEngine::ReadSyncAdapters(void) {
                xmlFreeDoc(doc);
                return;
        } else {
-               xmlChar* pSACount;
+               xmlChar* pSACount = NULL;
                pSACount = xmlGetProp(cur, XML_ATTR_COUNT);
                int count = (pSACount == NULL) ? 0 : atoi((char*)pSACount);
                LOG_LOGD("sync adapter count [%d]", count);
-
+               if (pSACount != NULL) {
+                       xmlFree(pSACount);
+                       pSACount = NULL;
+               }
                SyncAdapterAggregator* pAggregator = SyncManager::GetInstance()->GetSyncAdapterAggregator();
 
                cur = cur->xmlChildrenNode;
@@ -437,7 +453,10 @@ RepositoryEngine::ReadSyncAdapters(void) {
 
        /* process for removing previous data */
        xmlNodePtr rootNode;
-
+       if (doc != NULL) {
+               xmlFreeDoc(doc);
+               doc = NULL;
+       }
        doc = xmlNewDoc(_VERSION);
 
        rootNode = xmlNewNode(NULL, XML_NODE_SYNCADAPTERS);
@@ -628,10 +647,14 @@ RepositoryEngine::WriteSyncAdapters(void) {
 void
 RepositoryEngine::ParseExtras(xmlNodePtr cur, bundle* pExtra) {
        xmlChar* pKey = xmlGetProp(cur, XML_ATTR_SYNC_EXTRA_KEY);
-       xmlChar* pVal = xmlGetProp(cur, XML_ATTR_SYNC_EXTRA_VALUE);
+       if (!pKey)
+               return;
 
-       if (!pKey || !pVal)
+       xmlChar* pVal = xmlGetProp(cur, XML_ATTR_SYNC_EXTRA_VALUE);
+       if (!pVal) {
+               xmlFree(pKey);
                return;
+       }
 
        bundle_add_str(pExtra, (const char*)pKey, (const char*)pVal);
 }
@@ -650,11 +673,21 @@ RepositoryEngine::ParseSyncJobsN(xmlNodePtr cur, xmlChar* pPackage) {
        xmlChar* pJobType = xmlGetProp(cur, XML_ATTR_JOB_TYPE);
        xmlChar* pPeriod = xmlGetProp(cur, XML_ATTR_PERIODIC_SYNC_PERIOD);
        long period = (pPeriod == NULL)? 1800 : ((atoi((char*)pPeriod) > 1440)? 1440 * 60 : atoi((char*)pPeriod) * 60);
+       if (pPeriod != NULL)
+               xmlFree(pPeriod);
 
        SyncType type = (pJobType == NULL) ? SYNC_TYPE_UNKNOWN : (SyncType)atoi((char*)pJobType);
        bool noretry = (pJobNoRetry == NULL) ? false : atoi((char*)pJobNoRetry);
+       if (pJobNoRetry != NULL)
+               xmlFree(pJobNoRetry);
        bool expedit = (pJobExpedit == NULL) ? false : atoi((char*)pJobExpedit);
+       if (pJobExpedit != NULL)
+               xmlFree(pJobExpedit);
        int accountId = (pAccId == NULL) ? -1 : atoi((char*)pAccId);
+
+       if (pAccId != NULL)
+               xmlFree(pAccId);
+
        int syncJobId = -1;
        int syncOption = (noretry) ? 0x02 : 0x00;
        syncOption |= (expedit) ? 0x01 : 0x00;
@@ -691,6 +724,15 @@ RepositoryEngine::ParseSyncJobsN(xmlNodePtr cur, xmlChar* pPackage) {
                }
        }
        bundle_free(pExtra);
+
+       if (pJobType != NULL) {
+               xmlFree(pJobType);
+               pJobType = NULL;
+       }
+       if (pAppId != NULL) {
+               xmlFree(pAppId);
+               pAppId = NULL;
+       }
 }
 /* LCOV_EXCL_STOP */