Fix even more leaks
[pandora-libraries.git] / lib / pnd_pxml.c
index 7632c05..77fc011 100644 (file)
@@ -16,6 +16,7 @@ pnd_pxml_handle *pnd_pxml_fetch ( char *fullpath ) {
   FILE *f;
   char *b;
   unsigned int len;
+  pnd_pxml_handle *h;
 
   f = fopen ( fullpath, "r" );
 
@@ -29,7 +30,11 @@ pnd_pxml_handle *pnd_pxml_fetch ( char *fullpath ) {
 
   fseek ( f, 0, SEEK_SET );
 
-  b = (char*) malloc ( len );
+  if ( ! len ) {
+    return ( NULL );
+  }
+
+  b = (char*) malloc ( len + 1 );
 
   if ( ! b ) {
     fclose ( f );
@@ -40,7 +45,10 @@ pnd_pxml_handle *pnd_pxml_fetch ( char *fullpath ) {
 
   fclose ( f );
 
-  return ( pnd_pxml_fetch_buffer ( fullpath, b ) );
+  h = pnd_pxml_fetch_buffer ( fullpath, b );
+  free ( b );
+
+  return ( h );
 }
 
 pnd_pxml_handle *pnd_pxml_fetch_buffer ( char *filename, char *buffer ) {
@@ -77,6 +85,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 );
   }
@@ -176,6 +190,39 @@ void pnd_pxml_delete ( pnd_pxml_handle h ) {
   if ( p -> startdir ) {
     free ( p -> startdir );
   }
+  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 );
+  }
+  if ( p -> mkdir_sp ) {
+    free ( p -> mkdir_sp );
+  }
+  if ( p -> package_version_major ) {
+    free ( p -> package_version_major );
+  }
+  if ( p -> package_version_minor ) {
+    free ( p -> package_version_minor );
+  }
+  if ( p -> package_version_release ) {
+    free ( p -> package_version_release );
+  }
+  if ( p -> package_version_build ) {
+    free ( p -> package_version_build );
+  }
 
   free(p); /*very important!*/
 
@@ -183,7 +230,7 @@ void pnd_pxml_delete ( pnd_pxml_handle h ) {
 }
 
 void pnd_pxml_set_app_name ( pnd_pxml_handle h, char *v ) {
-  /* 
+  /*
    * Please do not use this function if it can be avoided; it is only here for compatibility.
    * The function might fail on low memory, and there's no way for the user to know when this happens.
    */
@@ -312,6 +359,11 @@ char *pnd_pxml_get_best_localized_string(pnd_localized_string_t strings[], int s
   return ( NULL );
 }
 
+char *pnd_pxml_get_package_id ( pnd_pxml_handle h ) {
+  pnd_pxml_t *p = (pnd_pxml_t*) h;
+  return ( p -> package_id );
+}
+
 char *pnd_pxml_get_app_name ( pnd_pxml_handle h, char *iso_lang ) {
   pnd_pxml_t *p = (pnd_pxml_t *) h;
   return pnd_pxml_get_best_localized_string(p->titles, p->titles_c, iso_lang);
@@ -332,12 +384,16 @@ char *pnd_pxml_get_app_name_it ( pnd_pxml_handle h ) {
 char *pnd_pxml_get_app_name_fr ( pnd_pxml_handle h ) {
   return pnd_pxml_get_app_name(h, "fr");
 }
-
 char *pnd_pxml_get_unique_id ( pnd_pxml_handle h ) {
   pnd_pxml_t *p = (pnd_pxml_t*) h;
   return ( p -> unique_id );
 }
 
+char *pnd_pxml_get_appdata_dirname ( pnd_pxml_handle h ) {
+  pnd_pxml_t *p = (pnd_pxml_t*) h;
+  return ( p -> appdata_dirname );
+}
+
 char *pnd_pxml_get_standalone ( pnd_pxml_handle h ) {
   pnd_pxml_t *p = (pnd_pxml_t*) h;
   return ( p -> standalone );
@@ -348,6 +404,10 @@ char *pnd_pxml_get_icon ( pnd_pxml_handle h ) {
   return ( p -> icon );
 }
 
+// this guy's func name is 'out of sync' with the family of functions below; but since it
+// exists, rather than just remove it and break someones code, will add in the appropriate
+// function wrapper; the header only specifies the other guy (always did), so the header
+// was already on the right path.
 char *pnd_pxml_get_app_description ( pnd_pxml_handle h, char *iso_lang ) {
   pnd_pxml_t *p = (pnd_pxml_t *) h;
   return pnd_pxml_get_best_localized_string(p->descriptions, p->descriptions_c, iso_lang);
@@ -369,6 +429,11 @@ char *pnd_pxml_get_description_fr ( pnd_pxml_handle h ) {
   return pnd_pxml_get_app_description(h, "fr");
 }
 
+// wrapper added so family of function names is consistent; see comment for pnd_pxml_get_app_description() above
+char *pnd_pxml_get_description ( pnd_pxml_handle h, char *iso_lang) {
+  return ( pnd_pxml_get_app_description ( h, iso_lang ) );
+}
+
 char *pnd_pxml_get_previewpic1 ( pnd_pxml_handle h ) {
   pnd_pxml_t *p = (pnd_pxml_t*) h;
   return ( p -> previewpic1 );
@@ -539,6 +604,26 @@ char *pnd_pxml_get_mkdir ( pnd_pxml_handle h ) {
   return ( p -> mkdir_sp );
 }
 
+char *pnd_pxml_get_package_version_major ( pnd_pxml_handle h ) {
+   pnd_pxml_t *p = (pnd_pxml_t*) h;
+   return ( p -> package_version_major );
+}
+
+char *pnd_pxml_get_package_version_minor ( pnd_pxml_handle h ) {
+   pnd_pxml_t *p = (pnd_pxml_t*) h;
+   return ( p -> package_version_minor );
+}
+
+char *pnd_pxml_get_package_version_release ( pnd_pxml_handle h ) {
+   pnd_pxml_t *p = (pnd_pxml_t*) h;
+   return ( p -> package_version_release );
+}
+
+char *pnd_pxml_get_package_version_build ( pnd_pxml_handle h ) {
+   pnd_pxml_t *p = (pnd_pxml_t*) h;
+   return ( p -> package_version_build );
+}
+
 unsigned char pnd_pxml_is_affirmative ( char *v ) {
 
   if ( ! v ) {