Commit 1017d246 authored by Christophe Massiot's avatar Christophe Massiot

* 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.
parent d0100c33
...@@ -198,37 +198,42 @@ static inline char url_hexchar( int c ) ...@@ -198,37 +198,42 @@ static inline char url_hexchar( int c )
static inline char *vlc_UrlEncode( const char *psz_url ) static inline char *vlc_UrlEncode( const char *psz_url )
{ {
char psz_enc[3 * strlen( psz_url ) + 1], *out = psz_enc; 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 ) ) if( isurlsafe( c ) )
{
*out++ = (char)c; *out++ = (char)c;
}
else else
{ {
uint16_t cp; uint16_t cp;
*out++ = '%'; *out++ = '%';
/* UTF-8 to UCS-2 conversion */ /* UTF-8 to UCS-2 conversion */
if( ( c & 0x7f ) == 0 ) if( ( c & 0x80 ) == 0 )
{
cp = c; 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++; in++;
} }
else else if( ( c & 0xf0 ) == 0xe0 )
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; in += 2;
} }
else else
{
/* cannot URL-encode code points outside the BMP */ /* cannot URL-encode code points outside the BMP */
return NULL; /* better a wrong conversion than a crash */
cp = '?';
}
if( cp < 0xff ) if( cp < 0xff )
{ {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment