Browse Source

json_helper: get the size of the read buffer

pull/144/head
Steve Lhomme 3 years ago
parent
commit
6f9b01e6f4
  1. 10
      modules/misc/webservices/acoustid.c
  2. 16
      modules/misc/webservices/json_helper.h
  3. 5
      modules/misc/webservices/musicbrainz.c

10
modules/misc/webservices/acoustid.c

@ -74,9 +74,10 @@ static void parse_recordings( vlc_object_t *p_obj, const json_value *node, acous
}
}
static bool ParseJson( vlc_object_t *p_obj, const void *p_buffer, acoustid_results_t *p_results )
static bool ParseJson( vlc_object_t *p_obj, const void *p_buffer, size_t i_buffer,
acoustid_results_t *p_results )
{
json_value *root = json_parse_document( p_obj, p_buffer );
json_value *root = json_parse_document( p_obj, p_buffer, i_buffer );
if( !root )
return false;
@ -153,12 +154,13 @@ int acoustid_lookup_fingerprint( const acoustid_config_t *p_cfg, acoustid_finger
}
msg_Dbg( p_cfg->p_obj, "Querying AcoustID from %s", psz_url );
void *p_buffer = json_retrieve_document( p_cfg->p_obj, psz_url );
size_t i_buffer;
void *p_buffer = json_retrieve_document( p_cfg->p_obj, psz_url, &i_buffer );
free( psz_url );
if( !p_buffer )
return VLC_EGENERIC;
if ( ParseJson( p_cfg->p_obj, p_buffer, & p_data->results ) )
if ( ParseJson( p_cfg->p_obj, p_buffer, i_buffer, & p_data->results ) )
msg_Dbg( p_cfg->p_obj, "results count == %d", p_data->results.count );
else
msg_Dbg( p_cfg->p_obj, "No results" );

16
modules/misc/webservices/json_helper.h

@ -54,7 +54,7 @@ char * json_dupstring(const json_value *node, const char *key)
}
static inline
json_value * json_parse_document(vlc_object_t *p_obj, const char *psz_buffer)
json_value * json_parse_document(vlc_object_t *p_obj, const char *psz_buffer, size_t i_buffer)
{
json_settings settings;
char psz_error[128];
@ -79,7 +79,7 @@ error:
}
static inline
void * json_retrieve_document(vlc_object_t *p_obj, const char *psz_url)
void * json_retrieve_document(vlc_object_t *p_obj, const char *psz_url, size_t *buf_size)
{
bool saved_no_interact = p_obj->no_interact;
p_obj->no_interact = true;
@ -95,29 +95,29 @@ void * json_retrieve_document(vlc_object_t *p_obj, const char *psz_url)
/* read answer */
char *p_buffer = NULL;
int i_ret = 0;
*buf_size = 0;
for(;;)
{
int i_read = 65536;
if(i_ret >= INT_MAX - i_read)
if(*buf_size >= (SIZE_MAX - i_read - 1))
break;
p_buffer = realloc_or_free(p_buffer, 1 + i_ret + i_read);
p_buffer = realloc_or_free(p_buffer, 1 + *buf_size + i_read);
if(unlikely(p_buffer == NULL))
{
vlc_stream_Delete(p_stream);
return NULL;
}
i_read = vlc_stream_Read(p_stream, &p_buffer[i_ret], i_read);
i_read = vlc_stream_Read(p_stream, &p_buffer[*buf_size], i_read);
if(i_read <= 0)
break;
i_ret += i_read;
*buf_size += i_read;
}
vlc_stream_Delete(p_stream);
p_buffer[i_ret] = 0;
p_buffer[*buf_size++] = '\0';
return p_buffer;
}

5
modules/misc/webservices/musicbrainz.c

@ -47,14 +47,15 @@ static musicbrainz_lookup_t * musicbrainz_lookup_new(void)
static musicbrainz_lookup_t * musicbrainz_lookup(vlc_object_t *p_obj, const char *psz_url)
{
msg_Dbg(p_obj, "Querying MB for %s", psz_url);
void *p_buffer = json_retrieve_document(p_obj, psz_url);
size_t i_buffer;
void *p_buffer = json_retrieve_document(p_obj, psz_url, &i_buffer);
if(!p_buffer)
return NULL;
musicbrainz_lookup_t *p_lookup = musicbrainz_lookup_new();
if(p_lookup)
{
p_lookup->root = json_parse_document(p_obj, p_buffer);
p_lookup->root = json_parse_document(p_obj, p_buffer, i_buffer);
if (!p_lookup->root)
msg_Dbg(p_obj, "No results");
}

Loading…
Cancel
Save