[vlc-devel] [vlc-commits] strings: use vlc_memstream in vlc_xml_encode()

Filip Roséen filip at atch.se
Fri Feb 24 21:32:55 CET 2017


Hi Rémi,

On 2017-02-24 21:01, Rémi Denis-Courmont wrote:

> vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Fri Feb 24 22:01:38 2017 +0200| [7641dfe3eabcd7c3f1c2ae56cac3ed98b099d892] | committer: Rémi Denis-Courmont
> 
> strings: use vlc_memstream in vlc_xml_encode()
> 
> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=7641dfe3eabcd7c3f1c2ae56cac3ed98b099d892
> ---
> 
>  src/text/strings.c | 45 ++++++++++++++++++++++++++-------------------
>  1 file changed, 26 insertions(+), 19 deletions(-)
> 
> diff --git a/src/text/strings.c b/src/text/strings.c
> index edc8834..45d72a1 100644
> --- a/src/text/strings.c
> +++ b/src/text/strings.c
> @@ -284,38 +284,46 @@ void vlc_xml_decode( char *psz_value )
>  
>  char *vlc_xml_encode (const char *str)
>  {
> -    assert (str != NULL);
> -
> -    const size_t len = strlen (str);
> -    char *const buf = malloc (6 * len + 1), *ptr = buf;
> -    if (unlikely(buf == NULL))
> -        return NULL;
> -
> +    struct vlc_memstream stream;
>      size_t n;
>      uint32_t cp;
>  
> +    assert(str != NULL);
> +    vlc_memstream_open(&stream);

Missing check to see if `vlc_memstream_open` actually created a valid handle.

> +
>      while ((n = vlc_towc (str, &cp)) != 0)
>      {
>          if (unlikely(n == (size_t)-1))
>          {
> -            free (buf);
> +            if (vlc_memstream_close(&stream))
> +                free(stream.ptr);

The *if-condition* should be inverted.

>              errno = EILSEQ;
>              return NULL;
>          }
>  
>          switch (cp)
>          {
> -            case '\"': strcpy (ptr, """); ptr += 6; break;
> -            case '&':  strcpy (ptr, "&");  ptr += 5; break;
> -            case '\'': strcpy (ptr, "'");  ptr += 5; break;
> -            case '<':  strcpy (ptr, "<");   ptr += 4; break;
> -            case '>':  strcpy (ptr, ">");   ptr += 4; break;
> +            case '\"':
> +                vlc_memstream_puts(&stream, """);
> +                break;
> +            case '&':
> +                vlc_memstream_puts(&stream, "&");
> +                break;
> +            case '\'':
> +                vlc_memstream_puts(&stream, "'");
> +                break;
> +            case '<':
> +                vlc_memstream_puts(&stream, "<");
> +                break;
> +            case '>':
> +                vlc_memstream_puts(&stream, ">");
> +                break;
>              default:
>                  if (cp < 32) /* C0 code not allowed (except 9, 10 and 13) */
>                      break;
>                  if (cp >= 128 && cp < 160) /* C1 code encoded (except 133) */
>                  {
> -                    ptr += sprintf (ptr, "&#%"PRIu32";", cp);
> +                    vlc_memstream_printf(&stream, "&#%"PRIu32";", cp);
>                      break;
>                  }
>                  /* fall through */
> @@ -323,16 +331,15 @@ char *vlc_xml_encode (const char *str)
>              case 10:
>              case 13:
>              case 133:
> -                memcpy (ptr, str, n);
> -                ptr += n;
> +                vlc_memstream_write(&stream, str, n);
>                  break;
>          }
>          str += n;
>      }
> -    *(ptr++) = '\0';
>  
> -    ptr = realloc (buf, ptr - buf);
> -    return likely(ptr != NULL) ? ptr : buf; /* cannot fail */
> +    if (vlc_memstream_close(&stream))
> +        return NULL;
> +    return stream.ptr;
>  }
>  
>  /* Base64 encoding */


More information about the vlc-devel mailing list