Ignore:
Timestamp:
Aug 11, 2008, 5:00:22 PM (13 years ago)
Author:
charles
Message:

(libT 1.3x) #1176: memory leaks in libtransmission

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/1.3x/libtransmission/bencode.c

    r6469 r6483  
    201201 * attack via maliciously-crafted bencoded data. (#667)
    202202 */
    203 int
    204 tr_bencParse( const void     * buf_in,
    205               const void     * bufend_in,
    206               tr_benc        * top,
    207               const uint8_t ** setme_end )
     203static int
     204tr_bencParseImpl( const void     * buf_in,
     205                  const void     * bufend_in,
     206                  tr_benc        * top,
     207                  tr_ptrArray    * parentStack,
     208                  const uint8_t ** setme_end )
    208209{
    209210    int err;
    210211    const uint8_t * buf = buf_in;
    211212    const uint8_t * bufend = bufend_in;
    212     tr_ptrArray * parentStack = tr_ptrArrayNew( );
    213213
    214214    tr_bencInit( top, 0 );
     
    265265
    266266            node = tr_ptrArrayBack( parentStack );
    267             if( tr_bencIsDict( node ) && ( node->val.l.count % 2 ) )
    268                 return TR_ERROR; /* odd # of children in dict */
     267            if( tr_bencIsDict( node ) && ( node->val.l.count % 2 ) ) {
     268                /* odd # of children in dict */
     269                tr_bencFree( &node->val.l.vals [ --node->val.l.count ] );
     270                return TR_ERROR;
     271            }
    269272
    270273            tr_ptrArrayPop( parentStack );
     
    284287
    285288            node = getNode( top, parentStack, TYPE_STR );
    286             if( !node )
     289            if( !node ) {
     290                tr_free( str );
    287291                return TR_ERROR;
     292            }
    288293
    289294            tr_bencInitStr( node, str, str_len, 0 );
     
    304309        *setme_end = buf;
    305310
     311    return err;
     312}
     313
     314int
     315tr_bencParse( const void     * buf,
     316              const void     * end,
     317              tr_benc        * top,
     318              const uint8_t ** setme_end )
     319{
     320    tr_ptrArray * parentStack = tr_ptrArrayNew( );
     321    top->type = 0; /* not initialized yet */
     322    const int err = tr_bencParseImpl( buf, end, top, parentStack, setme_end );
     323    if( err )
     324        tr_bencFree( top );
    306325    tr_ptrArrayFree( parentStack, NULL );
    307326    return err;
Note: See TracChangeset for help on using the changeset viewer.