avio: fix handling of , in urls
[ffmpeg.git] / libavformat / avio.c
index a9f4253..67005e3 100644 (file)
@@ -145,10 +145,11 @@ static int url_alloc_for_protocol (URLContext **puc, struct URLProtocol *up,
     if (up->priv_data_size) {
         uc->priv_data = av_mallocz(up->priv_data_size);
         if (up->priv_data_class) {
+            int proto_len= strlen(up->name);
             char *start = strchr(uc->filename, ',');
             *(const AVClass**)uc->priv_data = up->priv_data_class;
             av_opt_set_defaults(uc->priv_data);
-            if(start){
+            if(!strncmp(up->name, uc->filename, proto_len) && uc->filename + proto_len == start){
                 int ret= 0;
                 char *p= start;
                 char sep= *++p;
@@ -288,17 +289,17 @@ int ffurl_alloc(URLContext **puc, const char *filename, int flags,
 {
     URLProtocol *up = NULL;
     char proto_str[128], proto_nested[128], *ptr;
-    const char *proto_end = strchr(filename, ':');
+    size_t proto_len = strspn(filename, URL_SCHEME_CHARS);
 
     if (!first_protocol) {
         av_log(NULL, AV_LOG_WARNING, "No URL Protocols are registered. "
                                      "Missing call to av_register_all()?\n");
     }
 
-    if (!proto_end || is_dos_path(filename))
+    if (filename[proto_len] != ':' &&  filename[proto_len] != ',' || is_dos_path(filename))
         strcpy(proto_str, "file");
     else
-        av_strlcpy(proto_str, filename, FFMIN(proto_end-filename+1, sizeof(proto_str)));
+        av_strlcpy(proto_str, filename, FFMIN(proto_len+1, sizeof(proto_str)));
 
     if ((ptr = strchr(proto_str, ',')))
         *ptr = '\0';