[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