Changeset 997


Ignore:
Timestamp:
Oct 13, 2006, 12:26:35 AM (15 years ago)
Author:
joshe
Message:

Prevent overflow when reading/converting strings from the torrent metainfo.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/metainfo.c

    r920 r997  
    3030 * Local prototypes
    3131 **********************************************************************/
    32 static void strcatUTF8( char *, char * );
     32#define strcatUTF8( dst, src) _strcatUTF8( (dst), sizeof( dst ), (src) )
     33static void _strcatUTF8( char *, int, char * );
    3334
    3435/***********************************************************************
     
    301302 * character, we assume it is ISO 8859-1 and convert it to UTF-8.
    302303 **********************************************************************/
    303 static void strcatUTF8( char * s, char * append )
     304#define WANTBYTES( want, got ) \
     305    if( (want) > (got) ) { return; } else { (got) -= (want); }
     306static void _strcatUTF8( char * s, int len, char * append )
    304307{
    305308    char * p;
     
    309312    {
    310313        s++;
     314        len--;
    311315    }
    312316
     
    317321        {
    318322            /* ASCII character */
     323            WANTBYTES( 1, len );
    319324            *(s++) = *(p++);
    320325            continue;
     
    324329        {
    325330            /* 2-bytes UTF-8 character */
     331            WANTBYTES( 2, len );
    326332            *(s++) = *(p++); *(s++) = *(p++);
    327333            continue;
     
    332338        {
    333339            /* 3-bytes UTF-8 character */
     340            WANTBYTES( 3, len );
    334341            *(s++) = *(p++); *(s++) = *(p++);
    335342            *(s++) = *(p++);
     
    341348        {
    342349            /* 4-bytes UTF-8 character */
     350            WANTBYTES( 4, len );
    343351            *(s++) = *(p++); *(s++) = *(p++);
    344352            *(s++) = *(p++); *(s++) = *(p++);
     
    347355
    348356        /* ISO 8859-1 -> UTF-8 conversion */
     357        WANTBYTES( 2, len );
    349358        *(s++) = 0xC0 | ( ( *p & 0xFF ) >> 6 );
    350359        *(s++) = 0x80 | ( *(p++) & 0x3F );
Note: See TracChangeset for help on using the changeset viewer.