[vlc-commits] smb: fix url encoding

Thomas Guillem git at videolan.org
Mon Jan 11 19:02:15 CET 2016


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Mon Jan 11 17:16:20 2016 +0100| [7d86c023aba99d4e0b8f1ce3e75c224c237e8171] | committer: Thomas Guillem

smb: fix url encoding

- pf_readdir will return an encoded item.
- decode the url at opening.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=7d86c023aba99d4e0b8f1ce3e75c224c237e8171
---

 modules/access/smb.c |   21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/modules/access/smb.c b/modules/access/smb.c
index 7c8ff3b..e88946c 100644
--- a/modules/access/smb.c
+++ b/modules/access/smb.c
@@ -174,7 +174,11 @@ static int Open( vlc_object_t *p_this )
 # undef open
 #endif
 
-    vlc_UrlParse( &url, p_access->psz_url );
+    char *psz_decoded_url = vlc_uri_decode_duplicate( p_access->psz_url );
+    if( psz_decoded_url == NULL )
+        return VLC_ENOMEM;
+    vlc_UrlParse( &url, psz_decoded_url );
+    free( psz_decoded_url );
     vlc_credential_init( &credential, &url );
     psz_var_domain = var_InheritString( p_access, "smb-domain" );
     credential.psz_realm = psz_var_domain;
@@ -210,6 +214,7 @@ static int Open( vlc_object_t *p_this )
     vlc_credential_store( &credential );
     vlc_credential_clean( &credential );
     free(psz_var_domain);
+    vlc_UrlClean( &url );
 
     /* Init p_access */
     access_InitFields( p_access );
@@ -218,19 +223,17 @@ static int Open( vlc_object_t *p_this )
     if( !p_sys )
     {
         free( psz_uri );
-        vlc_UrlClean( &url );
         return VLC_ENOMEM;
     }
-    p_sys->url = url;
 
     if( b_is_dir )
     {
 #ifdef _WIN32
         free( p_sys );
         free( psz_uri );
-        vlc_UrlClean( &p_sys->url );
         return VLC_EGENERIC;
 #else
+        vlc_UrlParse( &p_sys->url, p_access->psz_url );
         p_access->pf_readdir = DirRead;
         p_access->pf_control = DirControl;
         i_smb = smbc_opendir( psz_uri );
@@ -366,9 +369,17 @@ static input_item_t* DirRead (access_t *p_access )
             continue;
         }
 
+        char *psz_encoded_name = NULL;
+        if( psz_name != NULL
+         && ( psz_encoded_name = vlc_uri_encode( psz_name ) ) == NULL )
+            return NULL;
         if( smb_get_uri( p_access, &psz_uri, NULL, NULL, NULL,
-                         psz_server, psz_path, psz_name ) < 0 )
+                         psz_server, psz_path, psz_encoded_name ) < 0 )
+        {
+            free(psz_encoded_name);
             return NULL;
+        }
+        free(psz_encoded_name);
 
         p_item = input_item_NewWithTypeExt( psz_uri, p_entry->name, 0, NULL,
                                             0, -1, i_type, 1 );



More information about the vlc-commits mailing list