Commit 346350ee authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

M3U: fallback to local code page if UTF-8 fails (close #862)

parent 27bf7df3
...@@ -78,6 +78,29 @@ void E_(Close_M3U)( vlc_object_t *p_this ) ...@@ -78,6 +78,29 @@ void E_(Close_M3U)( vlc_object_t *p_this )
free( p_demux->p_sys ); free( p_demux->p_sys );
} }
/* Gruik! */
static inline char *MaybeFromLocaleDup (const char *str)
{
if (str == NULL)
return NULL;
return IsUTF8 (str) ? strdup (str) : FromLocaleDup (str);
}
static inline void MaybeFromLocaleRep (char **str)
{
char *const orig_str = *str;
if ((orig_str != NULL) && !IsUTF8 (orig_str))
{
*str = FromLocaleDup (orig_str);
free (orig_str);
}
}
static int Demux( demux_t *p_demux ) static int Demux( demux_t *p_demux )
{ {
char *psz_line; char *psz_line;
...@@ -86,7 +109,7 @@ static int Demux( demux_t *p_demux ) ...@@ -86,7 +109,7 @@ static int Demux( demux_t *p_demux )
int i_parsed_duration = 0; int i_parsed_duration = 0;
mtime_t i_duration = -1; mtime_t i_duration = -1;
const char**ppsz_options = NULL; const char**ppsz_options = NULL;
int i_options = 0, i; int i_options = 0;
vlc_bool_t b_cleanup = VLC_FALSE; vlc_bool_t b_cleanup = VLC_FALSE;
input_item_t *p_input; input_item_t *p_input;
...@@ -128,11 +151,11 @@ static int Demux( demux_t *p_demux ) ...@@ -128,11 +151,11 @@ static int Demux( demux_t *p_demux )
sizeof("EXTVLCOPT:") -1 ) ) sizeof("EXTVLCOPT:") -1 ) )
{ {
/* VLC Option */ /* VLC Option */
const char *psz_option; char *psz_option;
psz_parse += sizeof("EXTVLCOPT:") -1; psz_parse += sizeof("EXTVLCOPT:") -1;
if( !*psz_parse ) goto error; if( !*psz_parse ) goto error;
psz_option = strdup( psz_parse ); psz_option = MaybeFromLocaleDup( psz_parse );
if( psz_option ) if( psz_option )
INSERT_ELEM( ppsz_options, i_options, i_options, INSERT_ELEM( ppsz_options, i_options, i_options,
psz_option ); psz_option );
...@@ -148,20 +171,15 @@ static int Demux( demux_t *p_demux ) ...@@ -148,20 +171,15 @@ static int Demux( demux_t *p_demux )
if( !psz_name || !*psz_name ) if( !psz_name || !*psz_name )
{ {
/* Use filename as name for relative entries */ /* Use filename as name for relative entries */
psz_name = strdup( psz_parse ); psz_name = MaybeFromLocaleDup( psz_parse );
} }
psz_mrl = E_(ProcessMRL)( psz_parse, p_demux->p_sys->psz_prefix ); psz_mrl = E_(ProcessMRL)( psz_parse, p_demux->p_sys->psz_prefix );
MaybeFromLocaleRep( &psz_mrl );
b_cleanup = VLC_TRUE; b_cleanup = VLC_TRUE;
if( !psz_mrl ) goto error; if( !psz_mrl ) goto error;
EnsureUTF8( psz_name );
EnsureUTF8( psz_mrl );
for( i = 0; i< i_options; i++ )
EnsureUTF8( (char*)ppsz_options[i] );
p_input = input_ItemNewExt( p_playlist, psz_mrl, psz_name, p_input = input_ItemNewExt( p_playlist, psz_mrl, psz_name,
i_options, ppsz_options, i_duration ); i_options, ppsz_options, i_duration );
if ( psz_artist && *psz_artist ) if ( psz_artist && *psz_artist )
...@@ -171,6 +189,7 @@ static int Demux( demux_t *p_demux ) ...@@ -171,6 +189,7 @@ static int Demux( demux_t *p_demux )
PLAYLIST_APPEND | PLAYLIST_SPREPARSE, PLAYLIST_APPEND | PLAYLIST_SPREPARSE,
PLAYLIST_END, NULL, NULL ); PLAYLIST_END, NULL, NULL );
free( psz_mrl ); free( psz_mrl );
// XXX Not to be a scare monger, but I suspect options are leaked
} }
error: error:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment