[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