Commit 16c7c714 authored by Benjamin Pracht's avatar Benjamin Pracht

* Fix a double free and the size of a memory allocation

* Only call gnome_vfs_escape_path_string on the path part of the uri, since the functions in gnomevfs that are supposed to make the host/user/path separation are broken (they will escape passwords too)
* Trying to open a file with http on a system with non latin1 encoding may still fail (testing welcomed).
* Don't call gnome_vfs_make_uri_from_input_with_dirs since this will fail on a path with special caracters, but gnome_vfs_expand_initial_tilde and gnome_vfs_make_uri_from_shell_arg
parent 6064cdb5
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <stdio.h> #include <stdio.h>
#include "charset.h" #include "charset.h"
#include "network.h"
/***************************************************************************** /*****************************************************************************
* Module descriptor * Module descriptor
...@@ -87,6 +88,8 @@ static int Open( vlc_object_t *p_this ) ...@@ -87,6 +88,8 @@ static int Open( vlc_object_t *p_this )
char *psz_name = NULL; char *psz_name = NULL;
char *psz = NULL; char *psz = NULL;
char *psz_uri = NULL; char *psz_uri = NULL;
char *psz_unescaped = NULL;
char *psz_expand_tilde = NULL;
GnomeVFSURI *p_uri = NULL; GnomeVFSURI *p_uri = NULL;
GnomeVFSResult i_ret; GnomeVFSResult i_ret;
GnomeVFSHandle *p_handle = NULL; GnomeVFSHandle *p_handle = NULL;
...@@ -125,29 +128,56 @@ static int Open( vlc_object_t *p_this ) ...@@ -125,29 +128,56 @@ static int Open( vlc_object_t *p_this )
*(p_access->psz_access) != '\0') *(p_access->psz_access) != '\0')
{ {
psz_name = malloc( strlen( p_access->psz_access ) + psz_name = malloc( strlen( p_access->psz_access ) +
strlen( p_access->psz_path ) + 3 ); strlen( p_access->psz_path ) + 4 );
strcpy( psz_name, p_access->psz_access ); sprintf( psz_name, "%s://%s", p_access->psz_access,
strcat( psz_name, "://" ); p_access->psz_path );
strcat( psz_name, p_access->psz_path );
} }
else else
{ {
psz_name = strdup( p_access->psz_path ); psz_name = strdup( p_access->psz_path );
} }
psz = ToLocale( psz_name ); psz = ToLocale( psz_name );
psz_expand_tilde = gnome_vfs_expand_initial_tilde( psz );
LocaleFree( psz );
psz_unescaped = gnome_vfs_make_uri_from_shell_arg( psz_expand_tilde );
/* Use gnome_vfs_make_uri_from_input_with_dirs for local paths, as it deals /* gnome_vfs_make_uri_from_shell_arg will only escape the uri
relative directories, and gnome_vfs_make_uri_from_input_with_dirs for relative paths. So we need to use
otherwise */ gnome_vfs_escape_host_and_path_string in other cases. */
psz_uri = gnome_vfs_make_uri_from_input_with_dirs( psz,
GNOME_VFS_MAKE_URI_DIR_CURRENT); if( !strcmp( psz_unescaped, psz_expand_tilde ) )
if( *psz_uri != '/' )
{ {
g_free( psz_uri ); /* Now we are sure that we have a complete valid unescaped URI beginning
psz_uri = gnome_vfs_escape_host_and_path_string( psz ); with the protocol. We want to escape it. However, gnomevfs's escaping
function are broken and will try to escape characters un the username/
password field. So parse the URI with vlc_UrlParse ans only escape the
path */
vlc_url_t url;
char *psz_escaped_path;
char *psz_path_begin;
vlc_UrlParse( &url, psz_unescaped, 0 );
psz_escaped_path = gnome_vfs_escape_path_string( url.psz_path );
/* Now let's reconstruct a valid URI from all that stuff */
psz_path_begin = strstr( psz_unescaped, url.psz_path );
*psz_path_begin = '\0';
psz_uri = malloc( strlen( psz_unescaped ) +
strlen( psz_escaped_path ) + 1 );
sprintf( psz_uri, "%s%s",psz_unescaped, psz_escaped_path );
g_free( psz_escaped_path );
g_free( psz_unescaped );
}
else
{
psz_uri = psz_unescaped;
} }
g_free( psz_expand_tilde );
p_uri = gnome_vfs_uri_new( psz_uri ); p_uri = gnome_vfs_uri_new( psz_uri );
if( p_uri ) if( p_uri )
{ {
...@@ -157,12 +187,12 @@ static int Open( vlc_object_t *p_this ) ...@@ -157,12 +187,12 @@ static int Open( vlc_object_t *p_this )
if( i_ret ) if( i_ret )
{ {
msg_Err( p_access, "cannot get file info (%s)", msg_Err( p_access, "cannot get file info for uri %s (%s)",
gnome_vfs_result_to_string( i_ret ) ); psz_uri, gnome_vfs_result_to_string( i_ret ) );
gnome_vfs_file_info_unref( p_sys->p_file_info ); gnome_vfs_file_info_unref( p_sys->p_file_info );
gnome_vfs_uri_unref( p_uri); gnome_vfs_uri_unref( p_uri);
free( p_sys ); free( p_sys );
free( psz_uri ); g_free( psz_uri );
free( psz_name ); free( psz_name );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
...@@ -170,13 +200,11 @@ static int Open( vlc_object_t *p_this ) ...@@ -170,13 +200,11 @@ static int Open( vlc_object_t *p_this )
else else
{ {
msg_Warn( p_access, "cannot parse MRL %s or unsupported protocol", psz_name ); msg_Warn( p_access, "cannot parse MRL %s or unsupported protocol", psz_name );
LocaleFree( psz );
g_free( psz_uri ); g_free( psz_uri );
free( p_sys ); free( p_sys );
free( psz_name ); free( psz_name );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
LocaleFree( psz );
msg_Dbg( p_access, "opening file `%s'", psz_uri ); msg_Dbg( p_access, "opening file `%s'", psz_uri );
i_ret = gnome_vfs_open( &(p_sys->p_handle), psz_uri, 5 ); i_ret = gnome_vfs_open( &(p_sys->p_handle), psz_uri, 5 );
...@@ -185,11 +213,9 @@ static int Open( vlc_object_t *p_this ) ...@@ -185,11 +213,9 @@ static int Open( vlc_object_t *p_this )
msg_Warn( p_access, "cannot open file %s: %s", psz_uri, msg_Warn( p_access, "cannot open file %s: %s", psz_uri,
gnome_vfs_result_to_string( i_ret ) ); gnome_vfs_result_to_string( i_ret ) );
LocaleFree( psz );
g_free( psz_uri );
gnome_vfs_uri_unref( p_uri); gnome_vfs_uri_unref( p_uri);
g_free( psz_uri );
free( p_sys ); free( p_sys );
free( psz_uri );
free( psz_name ); free( psz_name );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
...@@ -222,8 +248,9 @@ static int Open( vlc_object_t *p_this ) ...@@ -222,8 +248,9 @@ static int Open( vlc_object_t *p_this )
/* FIXME that's bad because all others access will be probed */ /* FIXME that's bad because all others access will be probed */
msg_Err( p_access, "file %s is empty, aborting", psz_name ); msg_Err( p_access, "file %s is empty, aborting", psz_name );
gnome_vfs_file_info_unref( p_sys->p_file_info ); gnome_vfs_file_info_unref( p_sys->p_file_info );
gnome_vfs_uri_unref( p_uri);
free( p_sys ); free( p_sys );
free( psz_uri ); g_free( psz_uri );
free( psz_name ); free( psz_name );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
......
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