(trunk libT) #1845: if settings.json is empty, T crashes with "Assertion: tr_bencIsDict( source ) failed"
This commit is contained in:
parent
491a6ac63d
commit
b5a6f8a013
|
@ -30,6 +30,10 @@
|
|||
#include "ptrarray.h"
|
||||
#include "utils.h" /* tr_new(), tr_free() */
|
||||
|
||||
#ifndef ENODATA
|
||||
#define ENODATA EIO
|
||||
#endif
|
||||
|
||||
/**
|
||||
***
|
||||
**/
|
||||
|
@ -1465,16 +1469,17 @@ tr_bencSaveJSONFile( const char * filename,
|
|||
***/
|
||||
|
||||
int
|
||||
tr_bencLoadFile( const char * filename,
|
||||
tr_benc * b )
|
||||
tr_bencLoadFile( const char * filename, tr_benc * b )
|
||||
{
|
||||
int err;
|
||||
size_t contentLen;
|
||||
uint8_t * content;
|
||||
|
||||
content = tr_loadFile( filename, &contentLen );
|
||||
if( !content )
|
||||
if( !content && errno )
|
||||
err = errno;
|
||||
else if( !content )
|
||||
err = ENODATA;
|
||||
else
|
||||
err = tr_bencLoad( content, contentLen, b, NULL );
|
||||
|
||||
|
@ -1483,20 +1488,20 @@ tr_bencLoadFile( const char * filename,
|
|||
}
|
||||
|
||||
int
|
||||
tr_bencLoadJSONFile( const char * filename,
|
||||
tr_benc * b )
|
||||
tr_bencLoadJSONFile( const char * filename, tr_benc * b )
|
||||
{
|
||||
int err;
|
||||
size_t contentLen;
|
||||
uint8_t * content;
|
||||
|
||||
content = tr_loadFile( filename, &contentLen );
|
||||
if( !content )
|
||||
if( !content && errno )
|
||||
err = errno;
|
||||
else if( !content )
|
||||
err = ENODATA;
|
||||
else
|
||||
err = tr_jsonParse( content, contentLen, b, NULL );
|
||||
|
||||
tr_free( content );
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -139,6 +139,19 @@ test1( void )
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
test2( void )
|
||||
{
|
||||
tr_benc top;
|
||||
const char * in = " ";
|
||||
const int err = tr_jsonParse( in, strlen( in ), &top, NULL );
|
||||
|
||||
check( err );
|
||||
check( !tr_bencIsDict( &top ) );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
main( void )
|
||||
{
|
||||
|
@ -150,6 +163,9 @@ main( void )
|
|||
if( ( i = test1( ) ) )
|
||||
return i;
|
||||
|
||||
if( ( i = test2( ) ) )
|
||||
return i;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -28,9 +28,10 @@
|
|||
|
||||
struct json_benc_data
|
||||
{
|
||||
tr_benc * top;
|
||||
tr_bool hasContent;
|
||||
tr_benc * top;
|
||||
tr_ptrArray stack;
|
||||
char * key;
|
||||
char * key;
|
||||
};
|
||||
|
||||
static tr_benc*
|
||||
|
@ -69,6 +70,7 @@ callback( void * vdata,
|
|||
switch( type )
|
||||
{
|
||||
case JSON_T_ARRAY_BEGIN:
|
||||
data->hasContent = TRUE;
|
||||
node = getNode( data );
|
||||
tr_bencInitList( node, 0 );
|
||||
tr_ptrArrayAppend( &data->stack, node );
|
||||
|
@ -79,6 +81,7 @@ callback( void * vdata,
|
|||
break;
|
||||
|
||||
case JSON_T_OBJECT_BEGIN:
|
||||
data->hasContent = TRUE;
|
||||
node = getNode( data );
|
||||
tr_bencInitDict( node, 0 );
|
||||
tr_ptrArrayAppend( &data->stack, node );
|
||||
|
@ -94,32 +97,39 @@ callback( void * vdata,
|
|||
tr_snprintf( buf, sizeof( buf ), "%f",
|
||||
(double)value->vu.float_value );
|
||||
tr_bencInitStr( getNode( data ), buf, -1 );
|
||||
data->hasContent = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case JSON_T_NULL:
|
||||
data->hasContent = TRUE;
|
||||
tr_bencInitStr( getNode( data ), "", 0 );
|
||||
break;
|
||||
|
||||
case JSON_T_INTEGER:
|
||||
data->hasContent = TRUE;
|
||||
tr_bencInitInt( getNode( data ), value->vu.integer_value );
|
||||
break;
|
||||
|
||||
case JSON_T_TRUE:
|
||||
data->hasContent = TRUE;
|
||||
tr_bencInitInt( getNode( data ), 1 );
|
||||
break;
|
||||
|
||||
case JSON_T_FALSE:
|
||||
data->hasContent = TRUE;
|
||||
tr_bencInitInt( getNode( data ), 0 );
|
||||
break;
|
||||
|
||||
case JSON_T_STRING:
|
||||
data->hasContent = TRUE;
|
||||
tr_bencInitStr( getNode( data ),
|
||||
value->vu.str.value,
|
||||
value->vu.str.length );
|
||||
break;
|
||||
|
||||
case JSON_T_KEY:
|
||||
data->hasContent = TRUE;
|
||||
assert( !data->key );
|
||||
data->key = tr_strdup( value->vu.str.value );
|
||||
break;
|
||||
|
@ -129,14 +139,14 @@ callback( void * vdata,
|
|||
}
|
||||
|
||||
int
|
||||
tr_jsonParse( const void * vbuf,
|
||||
tr_jsonParse( const void * vbuf,
|
||||
size_t len,
|
||||
tr_benc * setme_benc,
|
||||
tr_benc * setme_benc,
|
||||
const uint8_t ** setme_end )
|
||||
{
|
||||
int err = 0;
|
||||
const unsigned char * buf = vbuf;
|
||||
const void * bufend = buf + len;
|
||||
const unsigned char * buf = vbuf;
|
||||
const void * bufend = buf + len;
|
||||
struct JSON_config_struct config;
|
||||
struct JSON_parser_struct * checker;
|
||||
struct json_benc_data data;
|
||||
|
@ -146,6 +156,7 @@ tr_jsonParse( const void * vbuf,
|
|||
config.callback_ctx = &data;
|
||||
config.depth = -1;
|
||||
|
||||
data.hasContent = FALSE;
|
||||
data.key = NULL;
|
||||
data.top = setme_benc;
|
||||
data.stack = TR_PTR_ARRAY_INIT;
|
||||
|
@ -157,6 +168,9 @@ tr_jsonParse( const void * vbuf,
|
|||
if( buf != bufend )
|
||||
err = EILSEQ;
|
||||
|
||||
if( !data.hasContent )
|
||||
err = EINVAL;
|
||||
|
||||
if( setme_end )
|
||||
*setme_end = (const uint8_t*) buf;
|
||||
|
||||
|
|
Loading…
Reference in New Issue