[vlc-devel] [PATCH] demux/playlist: ensure that a playlist is a file
Thomas Guillem
thomas at gllm.fr
Thu May 7 16:57:08 CEST 2015
A lot of playlist probe only check the file extension that returns true for a
directory too.
---
modules/demux/playlist/asx.c | 1 +
modules/demux/playlist/b4s.c | 1 +
modules/demux/playlist/dvb.c | 5 +++--
modules/demux/playlist/gvp.c | 1 +
modules/demux/playlist/ifo.c | 1 +
modules/demux/playlist/m3u.c | 1 +
modules/demux/playlist/playlist.h | 10 ++++++++++
modules/demux/playlist/pls.c | 1 +
modules/demux/playlist/podcast.c | 1 +
modules/demux/playlist/qtl.c | 1 +
modules/demux/playlist/ram.c | 1 +
modules/demux/playlist/sgimb.c | 1 +
modules/demux/playlist/shoutcast.c | 1 +
modules/demux/playlist/wpl.c | 2 ++
14 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/modules/demux/playlist/asx.c b/modules/demux/playlist/asx.c
index 6f6e666..cd93692 100644
--- a/modules/demux/playlist/asx.c
+++ b/modules/demux/playlist/asx.c
@@ -145,6 +145,7 @@ int Import_ASX( vlc_object_t *p_this )
{
demux_t *p_demux = (demux_t *)p_this;
+ CHECK_FILE();
if( demux_IsPathExtension( p_demux, ".asx" ) ||
demux_IsPathExtension( p_demux, ".wax" ) ||
demux_IsPathExtension( p_demux, ".wvx" ) ||
diff --git a/modules/demux/playlist/b4s.c b/modules/demux/playlist/b4s.c
index d9c0465..cea6d85 100644
--- a/modules/demux/playlist/b4s.c
+++ b/modules/demux/playlist/b4s.c
@@ -49,6 +49,7 @@ int Import_B4S( vlc_object_t *p_this )
{
demux_t *demux = (demux_t *)p_this;
+ CHECK_FILE();
if( !demux_IsPathExtension( demux, ".b4s" )
&& !demux_IsForced( demux, "b4s-open" ) )
return VLC_EGENERIC;
diff --git a/modules/demux/playlist/dvb.c b/modules/demux/playlist/dvb.c
index 0b5e796..94289a4 100644
--- a/modules/demux/playlist/dvb.c
+++ b/modules/demux/playlist/dvb.c
@@ -42,10 +42,11 @@ static int Demux(demux_t *);
static input_item_t *ParseLine(char *line);
/** Detect dvb-utils zap channels.conf format */
-int Import_DVB(vlc_object_t *obj)
+int Import_DVB(vlc_object_t *p_this)
{
- demux_t *demux = (demux_t *)obj;
+ demux_t *demux = (demux_t *)p_this;
+ CHECK_FILE();
if (!demux_IsPathExtension(demux, ".conf" ) && !demux->b_force )
return VLC_EGENERIC;
diff --git a/modules/demux/playlist/gvp.c b/modules/demux/playlist/gvp.c
index e28e09b..2eca158 100644
--- a/modules/demux/playlist/gvp.c
+++ b/modules/demux/playlist/gvp.c
@@ -73,6 +73,7 @@ int Import_GVP( vlc_object_t *p_this )
int i_peek, i, b_found = false;
const uint8_t *p_peek;
+ CHECK_FILE();
i_peek = stream_Peek( p_demux->s, &p_peek, MAX_LINE );
for( i = 0; i < i_peek - (int)sizeof("gvp_version:"); i++ )
diff --git a/modules/demux/playlist/ifo.c b/modules/demux/playlist/ifo.c
index e031f8b..7d3bf4f 100644
--- a/modules/demux/playlist/ifo.c
+++ b/modules/demux/playlist/ifo.c
@@ -47,6 +47,7 @@ int Import_IFO( vlc_object_t *p_this )
{
demux_t *p_demux = (demux_t *)p_this;
+ CHECK_FILE();
if( !p_demux->psz_file )
return VLC_EGENERIC;
diff --git a/modules/demux/playlist/m3u.c b/modules/demux/playlist/m3u.c
index 02a9598..a0572ff 100644
--- a/modules/demux/playlist/m3u.c
+++ b/modules/demux/playlist/m3u.c
@@ -69,6 +69,7 @@ int Import_M3U( vlc_object_t *p_this )
char *(*pf_dup) (const char *) = GuessEncoding;
int offset = 0;
+ CHECK_FILE();
if( stream_Peek( p_demux->s, &p_peek, 3 ) == 3
&& !memcmp( p_peek, "\xef\xbb\xbf", 3) )
{
diff --git a/modules/demux/playlist/playlist.h b/modules/demux/playlist/playlist.h
index 64245f2..568c06b 100644
--- a/modules/demux/playlist/playlist.h
+++ b/modules/demux/playlist/playlist.h
@@ -88,18 +88,21 @@ bool CheckContentType( stream_t * p_stream, const char * psz_ctype );
#define DEMUX_BY_EXTENSION_MSG( ext, msg ) \
demux_t *p_demux = (demux_t *)p_this; \
+ CHECK_FILE(); \
if( !demux_IsPathExtension( p_demux, ext ) ) \
return VLC_EGENERIC; \
STANDARD_DEMUX_INIT_MSG( msg );
#define DEMUX_BY_EXTENSION_OR_FORCED_MSG( ext, module, msg ) \
demux_t *p_demux = (demux_t *)p_this; \
+ CHECK_FILE(); \
if( !demux_IsPathExtension( p_demux, ext ) && !demux_IsForced( p_demux, module ) ) \
return VLC_EGENERIC; \
STANDARD_DEMUX_INIT_MSG( msg );
#define DEMUX_BY_EXTENSION_OR_MIMETYPE( ext, mime, msg ) \
demux_t *p_demux = (demux_t *)p_this; \
+ CHECK_FILE(); \
char* demux_mimetype = stream_ContentType( p_demux->s ); \
if(!( demux_IsPathExtension( p_demux, ext ) || (demux_mimetype && !strcasecmp( mime, demux_mimetype )) )) { \
free( demux_mimetype ); \
@@ -112,5 +115,12 @@ bool CheckContentType( stream_t * p_stream, const char * psz_ctype );
if( stream_Peek( p_demux->s , &zepeek, size ) < size ){ \
msg_Dbg( p_demux, "not enough data" ); return VLC_EGENERIC; } } while(0)
+#define CHECK_FILE() do { \
+ bool b_is_dir = false; \
+ stream_Control( ((demux_t *)p_this)->s, STREAM_IS_DIRECTORY, &b_is_dir ); \
+ if( b_is_dir ) \
+ return VLC_EGENERIC; \
+} while(0)
+
#define POKE( peek, stuff, size ) (strncasecmp( (const char *)peek, stuff, size )==0)
diff --git a/modules/demux/playlist/pls.c b/modules/demux/playlist/pls.c
index 6c30831..7646aae 100644
--- a/modules/demux/playlist/pls.c
+++ b/modules/demux/playlist/pls.c
@@ -51,6 +51,7 @@ int Import_PLS( vlc_object_t *p_this )
{
demux_t *p_demux = (demux_t *)p_this;
const uint8_t *p_peek;
+ CHECK_FILE();
CHECK_PEEK( p_peek, 10 );
if( POKE( p_peek, "[playlist]", 10 ) || POKE( p_peek, "[Reference]", 10 ) ||
diff --git a/modules/demux/playlist/podcast.c b/modules/demux/playlist/podcast.c
index 3c52803..079d99b 100644
--- a/modules/demux/playlist/podcast.c
+++ b/modules/demux/playlist/podcast.c
@@ -48,6 +48,7 @@ int Import_podcast( vlc_object_t *p_this )
{
demux_t *p_demux = (demux_t *)p_this;
+ CHECK_FILE();
if( !demux_IsForced( p_demux, "podcast" ) )
return VLC_EGENERIC;
diff --git a/modules/demux/playlist/qtl.c b/modules/demux/playlist/qtl.c
index 958b29e..968e5f8 100644
--- a/modules/demux/playlist/qtl.c
+++ b/modules/demux/playlist/qtl.c
@@ -82,6 +82,7 @@ int Import_QTL( vlc_object_t *p_this )
{
demux_t *p_demux = (demux_t *)p_this;
+ CHECK_FILE();
if( !demux_IsPathExtension( p_demux, ".qtl" ) )
return VLC_EGENERIC;
diff --git a/modules/demux/playlist/ram.c b/modules/demux/playlist/ram.c
index 697199b..c217a3d 100644
--- a/modules/demux/playlist/ram.c
+++ b/modules/demux/playlist/ram.c
@@ -79,6 +79,7 @@ int Import_RAM( vlc_object_t *p_this )
demux_t *p_demux = (demux_t *)p_this;
const uint8_t *p_peek;
+ CHECK_FILE();
if(! demux_IsPathExtension( p_demux, ".ram" ) ||
demux_IsPathExtension( p_demux, ".rm" ) )
return VLC_EGENERIC;
diff --git a/modules/demux/playlist/sgimb.c b/modules/demux/playlist/sgimb.c
index fd2e064..7aa4d0c 100644
--- a/modules/demux/playlist/sgimb.c
+++ b/modules/demux/playlist/sgimb.c
@@ -140,6 +140,7 @@ int Import_SGIMB( vlc_object_t * p_this )
const uint8_t *p_peek;
int i_size;
+ CHECK_FILE();
/* Lets check the content to see if this is a sgi mediabase file */
i_size = stream_Peek( p_demux->s, &p_peek, MAX_LINE );
i_size -= sizeof("sgiNameServerHost=") - 1;
diff --git a/modules/demux/playlist/shoutcast.c b/modules/demux/playlist/shoutcast.c
index 499ba3d..4d10307 100644
--- a/modules/demux/playlist/shoutcast.c
+++ b/modules/demux/playlist/shoutcast.c
@@ -59,6 +59,7 @@ int Import_Shoutcast( vlc_object_t *p_this )
{
demux_t *p_demux = (demux_t *)p_this;
+ CHECK_FILE();
if( !demux_IsForced( p_demux, "shout-winamp" ) )
return VLC_EGENERIC;
diff --git a/modules/demux/playlist/wpl.c b/modules/demux/playlist/wpl.c
index ec28420..707edd9 100644
--- a/modules/demux/playlist/wpl.c
+++ b/modules/demux/playlist/wpl.c
@@ -172,6 +172,8 @@ void Close_WPL( vlc_object_t* p_this )
int Import_WPL( vlc_object_t* p_this )
{
demux_t* p_demux = (demux_t*)p_this;
+
+ CHECK_FILE();
if( !demux_IsPathExtension( p_demux, ".wpl" ) &&
!demux_IsPathExtension( p_demux, ".zpl" ) )
return VLC_EGENERIC;
--
2.1.4
More information about the vlc-devel
mailing list