Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/rapi/rc_api_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ int rc_json_parse_server_response(rc_api_response_t* response, const rc_api_serv
return RC_NO_RESPONSE;
}

if (!server_response->body || !*server_response->body) {
if (!server_response->body || !server_response->body_length) {
/* expect valid HTTP status codes to have bodies that we can extract the message from,
* but provide some default messages in case they don't. */
switch (server_response->http_status_code) {
Expand Down
5 changes: 5 additions & 0 deletions src/rapi/rc_api_editor.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,11 @@ int rc_api_process_fetch_code_notes_server_response(rc_api_fetch_code_notes_resp

++note;
}

if (note < response->notes + response->num_notes) {
response->num_notes = (uint32_t)(note - response->notes);
return RC_INVALID_VALUE;
}
}

return RC_OK;
Expand Down
20 changes: 20 additions & 0 deletions src/rapi/rc_api_info.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,11 @@ int rc_api_process_fetch_achievement_info_server_response(rc_api_fetch_achieveme

++entry;
}

if (entry < response->recently_awarded + response->num_recently_awarded) {
response->num_recently_awarded = (uint32_t)(entry - response->recently_awarded);
return RC_INVALID_VALUE;
}
}

return RC_OK;
Expand Down Expand Up @@ -295,6 +300,11 @@ int rc_api_process_fetch_leaderboard_info_server_response(rc_api_fetch_leaderboa

++entry;
}

if (entry < response->entries + response->num_entries) {
response->num_entries = (uint32_t)(entry - response->entries);
return RC_INVALID_VALUE;
}
}

return RC_OK;
Expand Down Expand Up @@ -415,6 +425,11 @@ int rc_api_process_fetch_games_list_server_response(rc_api_fetch_games_list_resp

++entry;
}

if (entry < response->entries + response->num_entries) {
response->num_entries = (uint32_t)(entry - response->entries);
return RC_INVALID_VALUE;
}
}

return RC_OK;
Expand Down Expand Up @@ -514,6 +529,11 @@ int rc_api_process_fetch_game_titles_server_response(rc_api_fetch_game_titles_re

++entry;
}

if (entry < response->entries + response->num_entries) {
response->num_entries = (uint32_t)(entry - response->entries);
return RC_INVALID_VALUE;
}
}

return RC_OK;
Expand Down
38 changes: 31 additions & 7 deletions src/rapi/rc_api_runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,8 @@ int rc_api_process_fetch_game_data_response(rc_api_fetch_game_data_response_t* r
return rc_api_process_fetch_game_data_server_response(response, &response_obj);
}

static int rc_api_process_fetch_game_data_achievements(rc_api_response_t* response, rc_api_achievement_definition_t* achievement, rc_json_field_t* array_field) {
static int rc_api_process_fetch_game_data_achievements(rc_api_response_t* response, rc_api_achievement_definition_t* achievement, uint32_t* num_achievements, rc_json_field_t* array_field) {
const rc_api_achievement_definition_t* first_achievement = achievement;
rc_json_iterator_t iterator;
const char* last_author = "";
const char* last_author_field = "";
Expand Down Expand Up @@ -220,10 +221,16 @@ static int rc_api_process_fetch_game_data_achievements(rc_api_response_t* respon
++achievement;
}

if (achievement < first_achievement + *num_achievements) {
*num_achievements = (uint32_t)(achievement - first_achievement);
return RC_INVALID_VALUE;
}

return RC_OK;
}

static int rc_api_process_fetch_game_data_leaderboards(rc_api_response_t* response, rc_api_leaderboard_definition_t* leaderboard, rc_json_field_t* array_field) {
static int rc_api_process_fetch_game_data_leaderboards(rc_api_response_t* response, rc_api_leaderboard_definition_t* leaderboard, uint32_t* num_leaderboards, rc_json_field_t* array_field) {
const rc_api_leaderboard_definition_t* first_leaderboard = leaderboard;
rc_json_iterator_t iterator;
size_t len;
int result;
Expand Down Expand Up @@ -280,6 +287,11 @@ static int rc_api_process_fetch_game_data_leaderboards(rc_api_response_t* respon
++leaderboard;
}

if (leaderboard < first_leaderboard + *num_leaderboards) {
*num_leaderboards = (uint32_t)(leaderboard - first_leaderboard);
return RC_INVALID_VALUE;
}

return RC_OK;
}

Expand Down Expand Up @@ -356,7 +368,7 @@ int rc_api_process_fetch_game_data_server_response(rc_api_fetch_game_data_respon
if (!response->achievements)
return RC_OUT_OF_MEMORY;

result = rc_api_process_fetch_game_data_achievements(&response->response, response->achievements, &array_field);
result = rc_api_process_fetch_game_data_achievements(&response->response, response->achievements, &response->num_achievements, &array_field);
if (result != RC_OK)
return result;
}
Expand All @@ -369,7 +381,7 @@ int rc_api_process_fetch_game_data_server_response(rc_api_fetch_game_data_respon
if (!response->leaderboards)
return RC_OUT_OF_MEMORY;

result = rc_api_process_fetch_game_data_leaderboards(&response->response, response->leaderboards, &array_field);
result = rc_api_process_fetch_game_data_leaderboards(&response->response, response->leaderboards, &response->num_leaderboards, &array_field);
if (result != RC_OK)
return result;
}
Expand Down Expand Up @@ -415,7 +427,9 @@ int rc_api_init_fetch_game_sets_request_hosted(rc_api_request_t* request,

static int rc_api_process_fetch_game_sets_achievement_sets(rc_api_fetch_game_sets_response_t* response,
rc_api_achievement_set_definition_t* subset,
uint32_t* num_subsets,
rc_json_field_t* subset_array_field) {
const rc_api_achievement_set_definition_t* first_subset = subset;
rc_json_iterator_t iterator;
rc_json_field_t array_field;
size_t len;
Expand Down Expand Up @@ -487,7 +501,7 @@ static int rc_api_process_fetch_game_sets_achievement_sets(rc_api_fetch_game_set
if (!subset->achievements)
return RC_OUT_OF_MEMORY;

result = rc_api_process_fetch_game_data_achievements(&response->response, subset->achievements, &array_field);
result = rc_api_process_fetch_game_data_achievements(&response->response, subset->achievements, &subset->num_achievements, &array_field);
if (result != RC_OK)
return result;
}
Expand All @@ -500,14 +514,19 @@ static int rc_api_process_fetch_game_sets_achievement_sets(rc_api_fetch_game_set
if (!subset->leaderboards)
return RC_OUT_OF_MEMORY;

result = rc_api_process_fetch_game_data_leaderboards(&response->response, subset->leaderboards, &array_field);
result = rc_api_process_fetch_game_data_leaderboards(&response->response, subset->leaderboards, &subset->num_leaderboards, &array_field);
if (result != RC_OK)
return result;
}

++subset;
}

if (subset < first_subset + *num_subsets) {
*num_subsets = (uint32_t)(subset - first_subset);
return RC_INVALID_VALUE;
}

return RC_OK;
}

Expand Down Expand Up @@ -558,7 +577,7 @@ int rc_api_process_fetch_game_sets_server_response(rc_api_fetch_game_sets_respon
if (!response->sets)
return RC_OUT_OF_MEMORY;

result = rc_api_process_fetch_game_sets_achievement_sets(response, response->sets, &array_field);
result = rc_api_process_fetch_game_sets_achievement_sets(response, response->sets, &response->num_sets, &array_field);
if (result != RC_OK)
return result;
}
Expand Down Expand Up @@ -900,6 +919,11 @@ int rc_api_process_submit_lboard_entry_server_response(rc_api_submit_lboard_entr

++entry;
}

if (entry < response->top_entries + response->num_top_entries) {
response->num_top_entries = (uint32_t)(entry - response->top_entries);
return RC_INVALID_VALUE;
}
}

return RC_OK;
Expand Down
15 changes: 15 additions & 0 deletions src/rapi/rc_api_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,11 @@ int rc_api_process_start_session_server_response(rc_api_start_session_response_t

++unlock;
}

if (unlock < response->unlocks + response->num_unlocks) {
response->num_unlocks = (uint32_t)(unlock - response->unlocks);
return RC_INVALID_VALUE;
}
}

if (rc_json_get_optional_array(&response->num_hardcore_unlocks, &array_field, &fields[3], "HardcoreUnlocks") && response->num_hardcore_unlocks) {
Expand All @@ -208,6 +213,11 @@ int rc_api_process_start_session_server_response(rc_api_start_session_response_t

++unlock;
}

if (unlock < response->hardcore_unlocks + response->num_hardcore_unlocks) {
response->num_hardcore_unlocks = (uint32_t)(unlock - response->hardcore_unlocks);
return RC_INVALID_VALUE;
}
}

rc_json_get_optional_timet(&response->server_now, &fields[4], "ServerNow", 0);
Expand Down Expand Up @@ -363,6 +373,11 @@ int rc_api_process_fetch_followed_users_server_response(rc_api_fetch_followed_us

++user;
}

if (user < response->users + response->num_users) {
response->num_users = (uint32_t)(user - response->users);
return RC_INVALID_VALUE;
}
}

return RC_OK;
Expand Down
Loading
Loading