1
mirror of https://code.videolan.org/videolan/vlc synced 2024-10-03 01:31:53 +02:00

* 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
This commit is contained in:
Benjamin Pracht 2005-09-27 16:18:11 +00:00
parent 6064cdb5e2
commit 16c7c71418

View File

@ -33,6 +33,7 @@
#include <stdio.h>
#include "charset.h"
#include "network.h"
/*****************************************************************************
* Module descriptor
@ -87,6 +88,8 @@ static int Open( vlc_object_t *p_this )
char *psz_name = NULL;
char *psz = NULL;
char *psz_uri = NULL;
char *psz_unescaped = NULL;
char *psz_expand_tilde = NULL;
GnomeVFSURI *p_uri = NULL;
GnomeVFSResult i_ret;
GnomeVFSHandle *p_handle = NULL;
@ -125,29 +128,56 @@ static int Open( vlc_object_t *p_this )
*(p_access->psz_access) != '\0')
{
psz_name = malloc( strlen( p_access->psz_access ) +
strlen( p_access->psz_path ) + 3 );
strcpy( psz_name, p_access->psz_access );
strcat( psz_name, "://" );
strcat( psz_name, p_access->psz_path );
strlen( p_access->psz_path ) + 4 );
sprintf( psz_name, "%s://%s", p_access->psz_access,
p_access->psz_path );
}
else
{
psz_name = strdup( p_access->psz_path );
}
psz = ToLocale( psz_name );
psz_expand_tilde = gnome_vfs_expand_initial_tilde( psz );
LocaleFree( psz );
/* Use gnome_vfs_make_uri_from_input_with_dirs for local paths, as it deals
relative directories, and gnome_vfs_make_uri_from_input_with_dirs
otherwise */
psz_uri = gnome_vfs_make_uri_from_input_with_dirs( psz,
GNOME_VFS_MAKE_URI_DIR_CURRENT);
if( *psz_uri != '/' )
psz_unescaped = gnome_vfs_make_uri_from_shell_arg( psz_expand_tilde );
/* gnome_vfs_make_uri_from_shell_arg will only escape the uri
for relative paths. So we need to use
gnome_vfs_escape_host_and_path_string in other cases. */
if( !strcmp( psz_unescaped, psz_expand_tilde ) )
{
g_free( psz_uri );
psz_uri = gnome_vfs_escape_host_and_path_string( psz );
/* Now we are sure that we have a complete valid unescaped URI beginning
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 );
if( p_uri )
{
@ -157,12 +187,12 @@ static int Open( vlc_object_t *p_this )
if( i_ret )
{
msg_Err( p_access, "cannot get file info (%s)",
gnome_vfs_result_to_string( i_ret ) );
msg_Err( p_access, "cannot get file info for uri %s (%s)",
psz_uri, gnome_vfs_result_to_string( i_ret ) );
gnome_vfs_file_info_unref( p_sys->p_file_info );
gnome_vfs_uri_unref( p_uri);
free( p_sys );
free( psz_uri );
g_free( psz_uri );
free( psz_name );
return VLC_EGENERIC;
}
@ -170,13 +200,11 @@ static int Open( vlc_object_t *p_this )
else
{
msg_Warn( p_access, "cannot parse MRL %s or unsupported protocol", psz_name );
LocaleFree( psz );
g_free( psz_uri );
free( p_sys );
free( psz_name );
return VLC_EGENERIC;
}
LocaleFree( psz );
msg_Dbg( p_access, "opening file `%s'", psz_uri );
i_ret = gnome_vfs_open( &(p_sys->p_handle), psz_uri, 5 );
@ -185,11 +213,9 @@ static int Open( vlc_object_t *p_this )
msg_Warn( p_access, "cannot open file %s: %s", psz_uri,
gnome_vfs_result_to_string( i_ret ) );
LocaleFree( psz );
g_free( psz_uri );
gnome_vfs_uri_unref( p_uri);
g_free( psz_uri );
free( p_sys );
free( psz_uri );
free( psz_name );
return VLC_EGENERIC;
}
@ -222,8 +248,9 @@ static int Open( vlc_object_t *p_this )
/* FIXME that's bad because all others access will be probed */
msg_Err( p_access, "file %s is empty, aborting", psz_name );
gnome_vfs_file_info_unref( p_sys->p_file_info );
gnome_vfs_uri_unref( p_uri);
free( p_sys );
free( psz_uri );
g_free( psz_uri );
free( psz_name );
return VLC_EGENERIC;
}