Changeset 7908


Ignore:
Timestamp:
Feb 18, 2009, 4:47:28 PM (13 years ago)
Author:
charles
Message:

(1.5x libT) #1845: if settings.json is empty, T crashes with "Assertion: tr_bencIsDict( source ) failed"

Location:
branches/1.5x/libtransmission
Files:
3 edited

Legend:

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

    r7664 r7908  
    3030#include "ptrarray.h"
    3131#include "utils.h" /* tr_new(), tr_free() */
     32
     33#ifndef ENODATA
     34 #define ENODATA EIO
     35#endif
    3236
    3337/**
     
    14661470
    14671471int
    1468 tr_bencLoadFile( const char * filename,
    1469                  tr_benc *    b )
     1472tr_bencLoadFile( const char * filename, tr_benc * b )
    14701473{
    14711474    int       err;
     
    14741477
    14751478    content = tr_loadFile( filename, &contentLen );
    1476     if( !content )
     1479    if( !content && errno )
    14771480        err = errno;
     1481    else if( !content )
     1482        err = ENODATA;
    14781483    else
    14791484        err = tr_bencLoad( content, contentLen, b, NULL );
     
    14841489
    14851490int
    1486 tr_bencLoadJSONFile( const char * filename,
    1487                      tr_benc *    b )
     1491tr_bencLoadJSONFile( const char * filename, tr_benc * b )
    14881492{
    14891493    int        err;
     
    14921496
    14931497    content = tr_loadFile( filename, &contentLen );
    1494     if( !content )
     1498    if( !content && errno )
    14951499        err = errno;
     1500    else if( !content )
     1501        err = ENODATA;
    14961502    else
    14971503        err = tr_jsonParse( content, contentLen, b, NULL );
     
    15001506    return err;
    15011507}
    1502 
  • branches/1.5x/libtransmission/json-test.c

    r7813 r7908  
    140140}
    141141
     142static int
     143test2( void )
     144{
     145    tr_benc top;
     146    const char * in = " ";
     147    const int err = tr_jsonParse( in, strlen( in ), &top, NULL );
     148
     149    check( err );
     150    check( !tr_bencIsDict( &top ) );
     151
     152    return 0;
     153}
     154
    142155int
    143156main( void )
     
    151164        return i;
    152165
     166    if( ( i = test2( ) ) )
     167        return i;
     168
    153169    return 0;
    154170}
  • branches/1.5x/libtransmission/json.c

    r7664 r7908  
    2929struct json_benc_data
    3030{
    31     tr_benc *      top;
     31    tr_bool        hasContent;
     32    tr_benc      * top;
    3233    tr_ptrArray    stack;
    33     char *        key;
     34    char         * key;
    3435};
    3536
     
    7071    {
    7172        case JSON_T_ARRAY_BEGIN:
     73            data->hasContent = TRUE;
    7274            node = getNode( data );
    7375            tr_bencInitList( node, 0 );
     
    8082
    8183        case JSON_T_OBJECT_BEGIN:
     84            data->hasContent = TRUE;
    8285            node = getNode( data );
    8386            tr_bencInitDict( node, 0 );
     
    9598                         (double)value->vu.float_value );
    9699            tr_bencInitStr( getNode( data ), buf, -1 );
     100            data->hasContent = TRUE;
    97101            break;
    98102        }
    99103
    100104        case JSON_T_NULL:
     105            data->hasContent = TRUE;
    101106            tr_bencInitStr( getNode( data ), "", 0 );
    102107            break;
    103108
    104109        case JSON_T_INTEGER:
     110            data->hasContent = TRUE;
    105111            tr_bencInitInt( getNode( data ), value->vu.integer_value );
    106112            break;
    107113
    108114        case JSON_T_TRUE:
     115            data->hasContent = TRUE;
    109116            tr_bencInitInt( getNode( data ), 1 );
    110117            break;
    111118
    112119        case JSON_T_FALSE:
     120            data->hasContent = TRUE;
    113121            tr_bencInitInt( getNode( data ), 0 );
    114122            break;
    115123
    116124        case JSON_T_STRING:
     125            data->hasContent = TRUE;
    117126            tr_bencInitStr( getNode( data ),
    118127                            value->vu.str.value,
     
    121130
    122131        case JSON_T_KEY:
     132            data->hasContent = TRUE;
    123133            assert( !data->key );
    124134            data->key = tr_strdup( value->vu.str.value );
     
    130140
    131141int
    132 tr_jsonParse( const void *    vbuf,
     142tr_jsonParse( const void     * vbuf,
    133143              size_t           len,
    134               tr_benc *        setme_benc,
     144              tr_benc        * setme_benc,
    135145              const uint8_t ** setme_end )
    136146{
    137147    int                         err = 0;
    138     const unsigned char *      buf = vbuf;
    139     const void *                bufend = buf + len;
     148    const unsigned char       * buf = vbuf;
     149    const void                * bufend = buf + len;
    140150    struct JSON_config_struct   config;
    141151    struct JSON_parser_struct * checker;
     
    147157    config.depth = -1;
    148158
     159    data.hasContent = FALSE;
    149160    data.key = NULL;
    150161    data.top = setme_benc;
     
    158169        err = EILSEQ;
    159170
     171    if( !data.hasContent )
     172        err = EINVAL;
     173
    160174    if( setme_end )
    161175        *setme_end = (const uint8_t*) buf;
Note: See TracChangeset for help on using the changeset viewer.