[vlc-commits] vlc_uri_fixup: use vlc_memstream (fixes #17347)

Rémi Denis-Courmont git at videolan.org
Wed Sep 7 13:04:17 CEST 2016


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Wed Sep  7 14:03:53 2016 +0300| [7888a18c93e15253fa70566ed825c0785f06ab5b] | committer: Rémi Denis-Courmont

vlc_uri_fixup: use vlc_memstream (fixes #17347)

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

 src/text/url.c | 49 ++++++++++++++++++++++---------------------------
 1 file changed, 22 insertions(+), 27 deletions(-)

diff --git a/src/text/url.c b/src/text/url.c
index b500475..909d1a7 100644
--- a/src/text/url.c
+++ b/src/text/url.c
@@ -31,9 +31,6 @@
 #ifdef _WIN32
 # include <io.h>
 #endif
-#ifndef HAVE_OPEN_MEMSTREAM
-# define open_memstream(b,l) (*(b) = NULL, *(l) = 0, NULL)
-#endif
 
 #include <vlc_common.h>
 #include <vlc_memstream.h>
@@ -612,17 +609,17 @@ static char *vlc_uri_remove_dot_segments(char *str)
 
 char *vlc_uri_compose(const vlc_url_t *uri)
 {
-    struct vlc_memstream stream[1];
+    struct vlc_memstream stream;
     char *enc;
 
-    vlc_memstream_open(stream);
+    vlc_memstream_open(&stream);
 
     if (uri->psz_protocol != NULL)
-        vlc_memstream_printf(stream, "%s:", uri->psz_protocol);
+        vlc_memstream_printf(&stream, "%s:", uri->psz_protocol);
 
     if (uri->psz_host != NULL)
     {
-        vlc_memstream_write(stream, "//", 2);
+        vlc_memstream_write(&stream, "//", 2);
 
         if (uri->psz_username != NULL)
         {
@@ -630,7 +627,7 @@ char *vlc_uri_compose(const vlc_url_t *uri)
             if (enc == NULL)
                 goto error;
 
-            vlc_memstream_puts(stream, enc);
+            vlc_memstream_puts(&stream, enc);
             free(enc);
 
             if (uri->psz_password != NULL)
@@ -639,10 +636,10 @@ char *vlc_uri_compose(const vlc_url_t *uri)
                 if (unlikely(enc == NULL))
                     goto error;
 
-                vlc_memstream_printf(stream, ":%s", enc);
+                vlc_memstream_printf(&stream, ":%s", enc);
                 free(enc);
             }
-            vlc_memstream_putc(stream, '@');
+            vlc_memstream_putc(&stream, '@');
         }
 
         const char *fmt;
@@ -652,22 +649,22 @@ char *vlc_uri_compose(const vlc_url_t *uri)
         else
             fmt = (uri->i_port != 0) ? "%s:%d" : "%s";
         /* No IDNA decoding here. Seems unnecessary, dangerous even. */
-        vlc_memstream_printf(stream, fmt, uri->psz_host, uri->i_port);
+        vlc_memstream_printf(&stream, fmt, uri->psz_host, uri->i_port);
     }
 
     if (uri->psz_path != NULL)
-        vlc_memstream_puts(stream, uri->psz_path);
+        vlc_memstream_puts(&stream, uri->psz_path);
     if (uri->psz_option != NULL)
-        vlc_memstream_printf(stream, "?%s", uri->psz_option);
+        vlc_memstream_printf(&stream, "?%s", uri->psz_option);
     /* NOTE: fragment not handled currently */
 
-    if (vlc_memstream_close(stream))
+    if (vlc_memstream_close(&stream))
         return NULL;
-    return stream->ptr;
+    return stream.ptr;
 
 error:
-    if (vlc_memstream_close(stream) == 0)
-        free(stream->ptr);
+    if (vlc_memstream_close(&stream) == 0)
+        free(stream.ptr);
     return NULL;
 }
 
@@ -745,11 +742,9 @@ char *vlc_uri_fixup(const char *str)
             break;
         }
 
-    char *buf;
-    size_t len;
-    FILE *stream = open_memstream(&buf, &len);
-    if (stream == NULL)
-        return NULL;
+    struct vlc_memstream stream;
+
+    vlc_memstream_open(&stream);
 
     for (size_t i = 0; str[i] != '\0'; i++)
     {
@@ -757,14 +752,14 @@ char *vlc_uri_fixup(const char *str)
 
         if (isurisafe(c) || isurisubdelim(c) || (strchr(":/?#[]@", c) != NULL)
          || (c == '%' && !encode_percent))
-            fputc(c, stream);
+            vlc_memstream_putc(&stream, c);
         else
-            fprintf(stream, "%%%02hhX", c);
+            vlc_memstream_printf(&stream, "%%%02hhX", c);
     }
 
-    if (fclose(stream))
-        buf = NULL;
-    return buf;
+    if (vlc_memstream_close(&stream))
+        return NULL;
+    return stream.ptr;
 }
 
 #if defined (HAVE_IDN)



More information about the vlc-commits mailing list