Ignore:
Timestamp:
Jan 28, 2010, 6:25:18 PM (12 years ago)
Author:
charles
Message:

(trunk libT) fix DNS timing issue reported by gn0s1s in irc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/web.c

    r10032 r10033  
    133133dns_cache_item_free( struct dns_cache_item * item )
    134134{
    135     tr_free( item->host );
    136     tr_free( item->resolved_host );
    137     memset( item, TR_MEMORY_TRASH, sizeof( struct dns_cache_item ) );
    138     tr_free( item );
     135    if( item != NULL )
     136    {
     137        tr_free( item->host );
     138        tr_free( item->resolved_host );
     139        memset( item, TR_MEMORY_TRASH, sizeof( struct dns_cache_item ) );
     140        tr_free( item );
     141    }
    139142}
    140143
     
    147150}
    148151
    149 static int
    150 dns_cache_compare_key( const void * va, const void * key )
    151 {
    152     const struct dns_cache_item * a = va;
    153     return strcmp( a->host, key );
    154 }
    155 
    156152typedef enum
    157153{
     
    162158tr_dns_result;
    163159
     160static void
     161dns_cache_clear_entry( struct tr_ptrArray * cache, const char * host )
     162{
     163    struct dns_cache_item key;
     164    key.host = (char*) host;
     165    dns_cache_item_free( tr_ptrArrayRemoveSorted( cache, &key, dns_cache_compare ) );
     166}
     167
    164168static tr_dns_result
    165169dns_cache_lookup( struct tr_web_task * task, const char * host, const char ** resolved )
     
    169173    if( task->session->web != NULL )
    170174    {
     175        struct dns_cache_item key;
     176        struct dns_cache_item * item;
    171177        tr_ptrArray * cache = &task->session->web->dns_cache;
    172178
    173         struct dns_cache_item * item = tr_ptrArrayFindSorted( cache, host,
    174                                                               dns_cache_compare_key );
     179        key.host = (char*) host;
     180        item = tr_ptrArrayFindSorted( cache, &key, dns_cache_compare );
    175181
    176182        /* has the ttl expired? */
    177183        if( ( item != NULL ) && ( item->expiration <= tr_time( ) ) )
    178184        {
    179             tr_ptrArrayRemoveSorted( cache, host, dns_cache_compare_key );
    180             dns_cache_item_free( item );
     185            dns_cache_clear_entry( cache, host );
    181186            item = NULL;
    182187        }
     
    203208    if( task->session->web != NULL )
    204209    {
    205         struct dns_cache_item * item = tr_new( struct dns_cache_item, 1 );
     210        struct dns_cache_item * item;
     211        tr_ptrArray * cache = &task->session->web->dns_cache;
     212
     213        dns_cache_clear_entry( cache, host );
     214
     215        item = tr_new( struct dns_cache_item, 1 );
    206216        item->host = tr_strdup( host );
    207217        item->resolved_host = NULL;
    208218        item->expiration = tr_time( ) + MIN_DNS_CACHE_TIME;
    209219        item->success = FALSE;
    210         tr_ptrArrayInsertSorted( &task->session->web->dns_cache, item, dns_cache_compare );
     220        tr_ptrArrayInsertSorted( cache, item, dns_cache_compare );
    211221    }
    212222}
     
    222232    if( task->session->web != NULL )
    223233    {
    224         struct dns_cache_item * item = tr_new( struct dns_cache_item, 1 );
     234        struct dns_cache_item * item;
     235        tr_ptrArray * cache = &task->session->web->dns_cache;
     236
     237        dns_cache_clear_entry( cache, host );
     238
     239        item = tr_new( struct dns_cache_item, 1 );
    225240        item->host = tr_strdup( host );
    226241        item->resolved_host = tr_strdup( resolved );
    227242        item->expiration = tr_time( ) + ttl;
    228243        item->success = TRUE;
    229         tr_ptrArrayInsertSorted( &task->session->web->dns_cache, item, dns_cache_compare );
     244        tr_ptrArrayInsertSorted( cache, item, dns_cache_compare );
    230245        ret = item->resolved_host;
    231246        dbgmsg( "adding dns cache entry for \"%s\": %s", host, resolved );
Note: See TracChangeset for help on using the changeset viewer.