[SCM] libav/experimental: Allow all valid (and only valid) characters in URL scheme for url_open()

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 17:11:39 UTC 2013


The following commit has been merged in the experimental branch:
commit 2bab5d3e730a184468f38fca4aaf93e29a691018
Author: Måns Rullgård <mans at mansr.com>
Date:   Sun Jul 18 18:38:23 2010 +0000

    Allow all valid (and only valid) characters in URL scheme for url_open()
    
    The URL specification allows letters, numbers, plus, hyphen, and period
    in the scheme part.  The isalpha() test would allow additional characters
    depending on locale settings while rejecting numbers and punctuation.
    
    Originally committed as revision 24306 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavformat/avio.c b/libavformat/avio.c
index 19f0183..0e9e887 100644
--- a/libavformat/avio.c
+++ b/libavformat/avio.c
@@ -167,29 +167,21 @@ int url_open_protocol (URLContext **puc, struct URLProtocol *up,
     return ret;
 }
 
+#define URL_SCHEME_CHARS                        \
+    "abcdefghijklmnopqrstuvwxyz"                \
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"                \
+    "0123456789+-."
+
 int url_alloc(URLContext **puc, const char *filename, int flags)
 {
     URLProtocol *up;
-    const char *p;
-    char proto_str[128], *q;
-
-    p = filename;
-    q = proto_str;
-    while (*p != '\0' && *p != ':') {
-        /* protocols can only contain alphabetic chars */
-        if (!isalpha(*p))
-            goto file_proto;
-        if ((q - proto_str) < sizeof(proto_str) - 1)
-            *q++ = *p;
-        p++;
-    }
-    /* if the protocol has length 1, we consider it is a dos drive */
-    if (*p == '\0' || is_dos_path(filename)) {
-    file_proto:
+    char proto_str[128];
+    size_t proto_len = strspn(filename, URL_SCHEME_CHARS);
+
+    if (filename[proto_len] != ':' || is_dos_path(filename))
         strcpy(proto_str, "file");
-    } else {
-        *q = '\0';
-    }
+    else
+        av_strlcpy(proto_str, filename, FFMIN(proto_len+1, sizeof(proto_str)));
 
     up = first_protocol;
     while (up != NULL) {

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list