From 834f86891a623462c3091c7d725e4b0054ef4bbf Mon Sep 17 00:00:00 2001 From: Cloudef Date: Mon, 8 Aug 2011 01:53:15 +0300 Subject: [PATCH] Fix leaks on libpnd --- lib/pnd_discovery.c | 16 +++++++++++----- lib/pnd_pxml.c | 21 +++++++++++++++++++++ lib/pnd_tinyxml.cpp | 17 +++++++++++------ 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/lib/pnd_discovery.c b/lib/pnd_discovery.c index 7d89475..b6627d2 100644 --- a/lib/pnd_discovery.c +++ b/lib/pnd_discovery.c @@ -30,6 +30,7 @@ static char *disco_overrides = NULL; void pnd_disco_destroy ( pnd_disco_t *p ) { if ( p -> package_id ) { free ( p -> package_id); } if ( p -> title_en ) { free ( p -> title_en ); } + if ( p -> desc_en ) { free ( p -> desc_en ); } if ( p -> unique_id ) { free ( p -> unique_id ); } if ( p -> appdata_dirname ) { free ( p -> appdata_dirname ); } if ( p -> icon ) { free ( p -> icon ); } @@ -44,11 +45,14 @@ void pnd_disco_destroy ( pnd_disco_t *p ) { if ( p -> alt_category ) { free ( p -> alt_category ); } if ( p -> alt_category1 ) { free ( p -> alt_category1 ); } if ( p -> alt_category2 ) { free ( p -> alt_category2 ); } + if ( p -> object_filename ) { free ( p -> object_filename ); } + if ( p -> object_path ) { free ( p -> object_path ); } if ( p -> mkdir_sp ) { free ( p -> mkdir_sp ); } if ( p -> info_name ) { free ( p -> info_name ); } if ( p -> info_type ) { free ( p -> info_type ); } if ( p -> info_filename ) { free ( p -> info_filename ); } - + if ( p -> preview_pic1 ) { free ( p -> preview_pic1 ); } + if ( p -> preview_pic2 ) { free ( p -> preview_pic2 ); } return; } @@ -227,11 +231,13 @@ static int pnd_disco_callback ( const char *fpath, const struct stat *sb, if ( pnd_pxml_get_package_id ( pxmlh ) ) { p -> package_id = strdup ( pnd_pxml_get_package_id ( pxmlh ) ); } - if ( pnd_pxml_get_app_name_en ( pxmlh ) ) { - p -> title_en = strdup ( pnd_pxml_get_app_name_en ( pxmlh ) ); + char *name_en = pnd_pxml_get_app_name_en ( pxmlh ); + if (name_en) { + p -> title_en = name_en; /* already strdupped */ } - if ( pnd_pxml_get_description_en ( pxmlh ) ) { - p -> desc_en = strdup ( pnd_pxml_get_description_en ( pxmlh ) ); + char *desc_en = pnd_pxml_get_description_en ( pxmlh ); + if ( desc_en ) { + p -> desc_en = desc_en; /* already strdupped */ } if ( pnd_pxml_get_icon ( pxmlh ) ) { p -> icon = strdup ( pnd_pxml_get_icon ( pxmlh ) ); diff --git a/lib/pnd_pxml.c b/lib/pnd_pxml.c index 934c75c..f2cc4f6 100644 --- a/lib/pnd_pxml.c +++ b/lib/pnd_pxml.c @@ -81,6 +81,12 @@ void pnd_pxml_delete ( pnd_pxml_handle h ) { free(p->descriptions); } + if ( p -> unique_id ) { + free ( p -> unique_id ); + } + if ( p -> package_id ) { + free ( p -> package_id ); + } if ( p -> standalone ) { free ( p -> standalone ); } @@ -183,6 +189,21 @@ void pnd_pxml_delete ( pnd_pxml_handle h ) { if ( p -> appdata_dirname ) { free ( p -> appdata_dirname ); } + if ( p -> info_name ) { + free ( p -> info_name ); + } + if ( p -> info_filename ) { + free ( p -> info_filename ); + } + if ( p -> info_type ) { + free ( p -> info_type ); + } + if ( p -> exec_no_x11 ) { + free ( p -> exec_no_x11 ); + } + if ( p -> execargs ) { + free ( p -> execargs ); + } free(p); /*very important!*/ diff --git a/lib/pnd_tinyxml.cpp b/lib/pnd_tinyxml.cpp index 1d64af2..5867135 100644 --- a/lib/pnd_tinyxml.cpp +++ b/lib/pnd_tinyxml.cpp @@ -136,6 +136,7 @@ unsigned char pnd_pxml_parse_descriptions(const TiXmlHandle hRoot, pnd_pxml_t *a } if ( ! ( lang = pnd_pxml_get_attribute ( pElem, PND_PXML_ATTRNAME_DESCRLANG ) ) ) { + if(text) free(text); text = NULL; continue; } @@ -144,7 +145,7 @@ unsigned char pnd_pxml_parse_descriptions(const TiXmlHandle hRoot, pnd_pxml_t *a { app->descriptions_alloc_c <<= 1; app->descriptions = (pnd_localized_string_t*)realloc((void*)app->descriptions, app->descriptions_alloc_c * sizeof(pnd_localized_string_t) ); - if (!app->descriptions) return (0); //errno = ENOMEM + if (!app->descriptions) { if(text) free(text); if(lang) free(lang); return (0); } //errno = ENOMEM } pnd_localized_string_t *description = &app->descriptions[app->descriptions_c - 1]; @@ -159,7 +160,7 @@ unsigned char pnd_pxml_parse_descriptions(const TiXmlHandle hRoot, pnd_pxml_t *a } else { // fallback to older approach - for (pElem = hRoot.FirstChild(PND_PXML_ENAME_DESCRIPTION).Element(); pElem; + for (pElem = hRoot.FirstChild(PND_PXML_ENAME_DESCRIPTION).Element(); pElem; pElem = pElem->NextSiblingElement(PND_PXML_ENAME_DESCRIPTION)) { @@ -171,14 +172,14 @@ unsigned char pnd_pxml_parse_descriptions(const TiXmlHandle hRoot, pnd_pxml_t *a if (!text) continue; char *lang = pnd_pxml_get_attribute(pElem, PND_PXML_ATTRNAME_DESCRLANG); - if (!lang) continue; + if (!lang) { if(text) free(text); text = NULL; continue; } app->descriptions_c++; if (app->descriptions_c > app->descriptions_alloc_c) //we don't have enough strings allocated { app->descriptions_alloc_c <<= 1; app->descriptions = (pnd_localized_string_t*)realloc((void*)app->descriptions, app->descriptions_alloc_c * sizeof(pnd_localized_string_t) ); - if (!app->descriptions) return (0); //errno = ENOMEM + if (!app->descriptions) { if(text) free(text); if(lang) free(lang); return (0); } //errno = ENOMEM } pnd_localized_string_t *description = &app->descriptions[app->descriptions_c - 1]; @@ -252,9 +253,10 @@ unsigned char pnd_pxml_parse ( const char *pFilename, char *buffer, unsigned int } else { app -> subapp_number = 0; } - + // give application the package id, if there is one - app -> package_id = package_id; + if( package_id ) + app -> package_id = strdup(package_id); //Get unique ID first. if ( appwrappermode ) { @@ -504,6 +506,9 @@ unsigned char pnd_pxml_parse ( const char *pFilename, char *buffer, unsigned int } // while finding apps + if( package_id ) + free(package_id); + return (1); } -- 2.39.2