[vlc-commits] ftp: check if server supports UTF-8 (fixes #2746)

Rémi Denis-Courmont git at videolan.org
Tue Aug 21 22:05:27 CEST 2012


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Tue Aug 21 23:03:15 2012 +0300| [a62b01ec24f1897970b7327bbfca56734b9d208e] | committer: Rémi Denis-Courmont

ftp: check if server supports UTF-8 (fixes #2746)

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

 modules/access/ftp.c |   54 +++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 40 insertions(+), 14 deletions(-)

diff --git a/modules/access/ftp.c b/modules/access/ftp.c
index 106cc89..08de3b6 100644
--- a/modules/access/ftp.c
+++ b/modules/access/ftp.c
@@ -342,6 +342,23 @@ static int Login( vlc_object_t *p_access, access_sys_t *p_sys )
     return 0;
 }
 
+static void FeaturesCheck( void *opaque, const char *feature )
+{
+    bool *unicode = opaque;
+
+    if( strcasestr( feature, "UTF8" ) != NULL )
+        *unicode = true;
+}
+
+static const char *IsASCII( const char *str )
+{
+    int8_t c;
+    for( const char *p = str; (c = *p) != '\0'; p++ )
+        if( c < 0 )
+            return NULL;
+    return str;
+}
+
 static int Connect( vlc_object_t *p_access, access_sys_t *p_sys )
 {
     if( Login( p_access, p_sys ) < 0 )
@@ -351,17 +368,13 @@ static int Connect( vlc_object_t *p_access, access_sys_t *p_sys )
     if( ftp_SendCommand( p_access, p_sys, "EPSV ALL" ) < 0 )
     {
         msg_Err( p_access, "cannot request extended passive mode" );
-        net_Close( p_sys->fd_cmd );
-        return -1;
+        goto error;
     }
 
     if( ftp_RecvCommand( p_access, p_sys, NULL, NULL ) == 2 )
     {
         if( net_GetPeerAddress( p_sys->fd_cmd, p_sys->sz_epsv_ip, NULL ) )
-        {
-            net_Close( p_sys->fd_cmd );
-            return -1;
-        }
+            goto error;
     }
     else
     {
@@ -374,10 +387,23 @@ static int Connect( vlc_object_t *p_access, access_sys_t *p_sys )
         net_Close( p_sys->fd_cmd );
 
         if( Login( p_access, p_sys ) )
-        {
-            net_Close( p_sys->fd_cmd );
-            return -1;
-        }
+            goto error;
+    }
+
+    /* features check */
+    bool unicode = false;
+    if( ftp_SendCommand( p_access, p_sys, "FEAT" ) < 0
+     || ftp_RecvAnswer( p_access, p_sys, NULL, NULL,
+                        FeaturesCheck, &unicode ) < 0 )
+    {
+         msg_Err( p_access, "cannot get server features" );
+         goto error;
+    }
+
+    if( (unicode ? IsUTF8 : IsASCII)(p_sys->url.psz_path) == NULL )
+    {
+        msg_Err( p_access, "unsupported path: \"%s\"", p_sys->url.psz_path );
+        goto error;
     }
 
     /* check binary mode support */
@@ -385,11 +411,13 @@ static int Connect( vlc_object_t *p_access, access_sys_t *p_sys )
         ftp_RecvCommand( p_access, p_sys, NULL, NULL ) != 2 )
     {
         msg_Err( p_access, "cannot set binary transfer mode" );
-        net_Close( p_sys->fd_cmd );
-        return -1;
+        goto error;
     }
 
     return 0;
+error:
+    net_Close( p_sys->fd_cmd );
+    return -1;
 }
 
 
@@ -429,8 +457,6 @@ static int parseURL( vlc_url_t *url, const char *path )
             return VLC_EGENERIC; /* ASCII and directory not supported */
     }
     decode_URI( url->psz_path );
-    /* FIXME: check for UTF-8 support, otherwise only ASCII is allowed */
-    EnsureUTF8( url->psz_path );
     return VLC_SUCCESS;
 }
 



More information about the vlc-commits mailing list