From 1017d246c12d22caccaf01117ad8e187f14720cf Mon Sep 17 00:00:00 2001 From: Christophe Massiot Date: Thu, 6 Apr 2006 17:12:32 +0000 Subject: [PATCH] * include/vlc_url.h: Fixed vlc_UrlEncode to return correct values and avoid crashing with strings as simple as "/toto", but all in all the entire function seems very wrong to me, see the next mail. --- include/vlc_url.h | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/include/vlc_url.h b/include/vlc_url.h index 280864dc10..32d92eb755 100644 --- a/include/vlc_url.h +++ b/include/vlc_url.h @@ -198,37 +198,42 @@ static inline char url_hexchar( int c ) static inline char *vlc_UrlEncode( const char *psz_url ) { char psz_enc[3 * strlen( psz_url ) + 1], *out = psz_enc; - const unsigned char *in; + const uint8_t *in; - for( in = (const unsigned char *)psz_url; *in; in++ ) + for( in = (const uint8_t *)psz_url; *in; in++ ) { - unsigned char c = *in; + uint8_t c = *in; if( isurlsafe( c ) ) + { *out++ = (char)c; + } else { uint16_t cp; *out++ = '%'; /* UTF-8 to UCS-2 conversion */ - if( ( c & 0x7f ) == 0 ) + if( ( c & 0x80 ) == 0 ) + { cp = c; - else - if( ( c & 0xe0 ) == 0xc0 ) + } + else if( ( c & 0xe0 ) == 0xc0 ) { - cp = ((c & 0x1f) << 6) | (in[1] & 0x3f); + cp = (((uint16_t)c & 0x1f) << 6) | (in[1] & 0x3f); in++; } - else - if( ( c & 0xf0 ) == 0xe0 ) + else if( ( c & 0xf0 ) == 0xe0 ) { - cp = ((c & 0xf) << 12) | ((in[1] & 0x3f) << 6) | (in[2] & 0x3f); + cp = (((uint16_t)c & 0xf) << 12) | (((uint16_t)(in[1]) & 0x3f) << 6) | (in[2] & 0x3f); in += 2; } else + { /* cannot URL-encode code points outside the BMP */ - return NULL; + /* better a wrong conversion than a crash */ + cp = '?'; + } if( cp < 0xff ) { -- 2.39.5