From 694b7a9723946539a12447009a185acf0f51800f Mon Sep 17 00:00:00 2001 From: Gregor Richards Date: Wed, 14 Dec 2016 22:02:01 -0500 Subject: [PATCH] Don't allow more players to join than are actually being polled --- network/netplay/netplay_frontend.c | 3 +++ network/netplay/netplay_init.c | 1 + network/netplay/netplay_io.c | 8 ++++---- network/netplay/netplay_private.h | 5 ++++- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index 0a5bda016e..f69695a368 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -333,6 +333,9 @@ static int16_t netplay_input_state(netplay_t *netplay, return 0; } + if (port > netplay->player_max) + netplay->player_max = port; + if (netplay->buffer[ptr].have_real[port]) { netplay->buffer[ptr].used_real[port] = true; diff --git a/network/netplay/netplay_init.c b/network/netplay/netplay_init.c index 665dae8f61..ec6fd26d83 100644 --- a/network/netplay/netplay_init.c +++ b/network/netplay/netplay_init.c @@ -414,6 +414,7 @@ netplay_t *netplay_new(void *direct_host, const char *server, uint16_t port, netplay->tcp_port = port; netplay->cbs = *cb; netplay->connected_players = 0; + netplay->player_max = 1; netplay->is_server = server == NULL; netplay->nat_traversal = netplay->is_server ? nat_traversal : false; netplay->delay_frames = delay_frames; diff --git a/network/netplay/netplay_io.c b/network/netplay/netplay_io.c index c910de072d..cc4ef274ea 100644 --- a/network/netplay/netplay_io.c +++ b/network/netplay/netplay_io.c @@ -567,17 +567,17 @@ static bool netplay_get_cmd(netplay_t *netplay, return netplay_cmd_nak(netplay, connection); /* Find an available player slot */ - for (player = 0; player < MAX_USERS; player++) + for (player = 0; player <= netplay->player_max; player++) { if (!(netplay->self_mode == NETPLAY_CONNECTION_PLAYING && netplay->self_player == player) && !(netplay->connected_players & (1< netplay->player_max) { - /* FIXME */ - return netplay_cmd_nak(netplay, connection); + /* Sorry, you can't play! */ + break; } if (connection->mode != NETPLAY_CONNECTION_PLAYING) diff --git a/network/netplay/netplay_private.h b/network/netplay/netplay_private.h index 77e8358187..42c6e80695 100644 --- a/network/netplay/netplay_private.h +++ b/network/netplay/netplay_private.h @@ -304,7 +304,10 @@ struct netplay /* Bitmap of players with controllers (whether local or remote) (low bit is * player 1) */ - int connected_players; + uint32_t connected_players; + + /* Maximum player number */ + uint32_t player_max; struct retro_callbacks cbs;