[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