[vlc-commits] addons: fsstorage: indirectly write catalog

Francois Cartegnie git at videolan.org
Thu Feb 13 17:44:34 CET 2014


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Feb 13 17:42:32 2014 +0100| [dcb11e032e9c1ff68c37856f45fea009f6410c8c] | committer: Francois Cartegnie

addons: fsstorage: indirectly write catalog

Avoids corruption if anything goes bad

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=dcb11e032e9c1ff68c37856f45fea009f6410c8c
---

 modules/misc/addons/fsstorage.c |   22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/modules/misc/addons/fsstorage.c b/modules/misc/addons/fsstorage.c
index c58be03..9834380 100644
--- a/modules/misc/addons/fsstorage.c
+++ b/modules/misc/addons/fsstorage.c
@@ -526,6 +526,7 @@ static int WriteCatalog( addons_storage_t *p_storage,
 {
     addon_entry_t *p_entry;
     char *psz_file;
+    char *psz_file_tmp;
     char *psz_tempstring;
     char *psz_userdir = config_GetUserDir( VLC_DATA_DIR );
     if ( !psz_userdir ) return VLC_ENOMEM;
@@ -537,10 +538,17 @@ static int WriteCatalog( addons_storage_t *p_storage,
     }
     free( psz_userdir );
 
+    if ( asprintf( &psz_file_tmp, "%s.tmp", psz_file ) < 1 )
+    {
+        free( psz_file );
+        return VLC_ENOMEM;
+    }
+
     char *psz_path = strdup( psz_file );
     if ( !psz_path )
     {
         free( psz_file );
+        free( psz_file_tmp );
         return VLC_ENOMEM;
     }
 
@@ -550,14 +558,16 @@ static int WriteCatalog( addons_storage_t *p_storage,
         *++psz_buf = '\0';
         /* ensure directory exists */
         if( !EMPTY_STR( psz_path ) ) recursive_mkdir( VLC_OBJECT(p_storage), psz_path );
-        free( psz_path );
     }
+    free( psz_path );
 
-    FILE *p_catalog = vlc_fopen( psz_file, "wt" );
-    free( psz_file );
-
+    FILE *p_catalog = vlc_fopen( psz_file_tmp, "wt" );
     if ( !p_catalog )
+    {
+        free( psz_file );
+        free( psz_file_tmp );
         return VLC_EGENERIC;
+    }
 
     /* write XML header */
     fprintf( p_catalog, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" );
@@ -625,6 +635,10 @@ static int WriteCatalog( addons_storage_t *p_storage,
         vlc_mutex_unlock( &p_entry->lock );
     }
 
+    vlc_rename( psz_file_tmp, psz_file );
+    free( psz_file );
+    free( psz_file_tmp );
+
     fprintf( p_catalog, "\t</addons>\n" );
     fprintf( p_catalog, "</videolan>\n" );
     fclose( p_catalog );



More information about the vlc-commits mailing list