[vlc-commits] vlm: simplify and fix abnormal cases
Rémi Denis-Courmont
git at videolan.org
Mon Aug 31 18:59:50 CEST 2015
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Mon Aug 31 19:50:12 2015 +0300| [d3b3ce68d25db6b6c4df7d3745b159b66387c1af] | committer: Rémi Denis-Courmont
vlm: simplify and fix abnormal cases
Correctly reject non-regular files: previously, the code would get
stuck on FIFOs, and ignore other types silently.
Check that reading the file actually succeeds.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d3b3ce68d25db6b6c4df7d3745b159b66387c1af
---
src/input/vlmshell.c | 41 +++++++++++++++--------------------------
1 file changed, 15 insertions(+), 26 deletions(-)
diff --git a/src/input/vlmshell.c b/src/input/vlmshell.c
index a6a75e5..d698639 100644
--- a/src/input/vlmshell.c
+++ b/src/input/vlmshell.c
@@ -41,6 +41,9 @@
#ifdef ENABLE_VLM
#include <time.h> /* ctime() */
+#include <limits.h>
+#include <fcntl.h>
+#include <sys/stat.h>
#include <vlc_input.h>
#include "input_internal.h"
@@ -49,7 +52,6 @@
#include <vlc_charset.h>
#include <vlc_fs.h>
#include <vlc_sout.h>
-#include <vlc_url.h>
#include "../stream_output/stream_output.h"
#include "../libvlc.h"
@@ -525,44 +527,31 @@ error:
static int ExecuteLoad( vlm_t *p_vlm, const char *psz_path, vlm_message_t **pp_status )
{
- char *psz_url = vlc_path2uri( psz_path, NULL );
- stream_t *p_stream = stream_UrlNew( p_vlm, psz_url );
- free( psz_url );
- uint64_t i_size;
- char *psz_buffer;
-
- if( !p_stream )
+ int fd = vlc_open( psz_path, O_RDONLY|O_NONBLOCK );
+ if( fd == -1 )
{
*pp_status = vlm_MessageNew( "load", "Unable to load from file" );
return VLC_EGENERIC;
}
- /* FIXME needed ? */
- if( stream_Seek( p_stream, 0 ) != 0 )
- {
- stream_Delete( p_stream );
-
- *pp_status = vlm_MessageNew( "load", "Read file error" );
- return VLC_EGENERIC;
- }
-
- i_size = stream_Size( p_stream );
- if( i_size > SIZE_MAX - 1 )
- i_size = SIZE_MAX - 1;
+ struct stat st;
+ char *psz_buffer = NULL;
- psz_buffer = malloc( i_size + 1 );
- if( !psz_buffer )
+ if( fstat( fd, &st ) || !S_ISREG( st.st_mode )
+ || st.st_size >= SSIZE_MAX
+ || ((psz_buffer = malloc( st.st_size + 1 )) == NULL)
+ || read( fd, psz_buffer, st.st_size ) < (ssize_t)st.st_size )
{
- stream_Delete( p_stream );
+ free( psz_buffer );
+ close( fd );
*pp_status = vlm_MessageNew( "load", "Read file error" );
return VLC_EGENERIC;
}
- stream_Read( p_stream, psz_buffer, i_size );
- psz_buffer[i_size] = '\0';
+ close( fd );
- stream_Delete( p_stream );
+ psz_buffer[st.st_size] = '\0';
if( Load( p_vlm, psz_buffer ) )
{
More information about the vlc-commits
mailing list