Commit 3ff00b50 authored by Chen Bill's avatar Chen Bill

update DuelMode::UpdateDeck

parent 27b2e125
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
namespace ygo { namespace ygo {
constexpr int SIZE_NETWORK_BUFFER = 0x2000; constexpr int SIZE_NETWORK_BUFFER = 0x2000;
constexpr int MAX_DATA_SIZE = SIZE_NETWORK_BUFFER - 3; constexpr int MAX_DATA_SIZE = SIZE_NETWORK_BUFFER - 3;
constexpr int MAINC_MAX = 250; // the limit of card_state
constexpr int SIDEC_MAX = MAINC_MAX;
struct HostInfo { struct HostInfo {
unsigned int lflist{}; unsigned int lflist{};
......
...@@ -277,16 +277,16 @@ void SingleDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) { ...@@ -277,16 +277,16 @@ void SingleDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
void SingleDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) { void SingleDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {
if(dp->type > 1 || ready[dp->type]) if(dp->type > 1 || ready[dp->type])
return; return;
if (len <= 8 || len % sizeof(int32_t) != 0) if (len < 8)
return; return;
bool valid = true; bool valid = true;
auto deckbuf = pdata; auto deckbuf = pdata;
int mainc = BufferIO::ReadInt32(deckbuf); int mainc = BufferIO::ReadInt32(deckbuf);
int sidec = BufferIO::ReadInt32(deckbuf); int sidec = BufferIO::ReadInt32(deckbuf);
const int deck_size = len - 2 * sizeof(int32_t); const int deck_size = len - 2 * sizeof(int32_t);
if (mainc < DECK_MIN_SIZE || mainc > DECK_MAX_SIZE + EXTRA_MAX_SIZE) if (mainc < 0 || mainc > MAINC_MAX)
valid = false; valid = false;
else if (sidec < 0 || sidec > SIDE_MAX_SIZE) else if (sidec < 0 || sidec > SIDEC_MAX)
valid = false; valid = false;
else if (deck_size != (mainc + sidec) * (int)sizeof(int32_t)) else if (deck_size != (mainc + sidec) * (int)sizeof(int32_t))
valid = false; valid = false;
...@@ -297,7 +297,7 @@ void SingleDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) { ...@@ -297,7 +297,7 @@ void SingleDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {
NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem); NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem);
return; return;
} }
int deck_list[DECK_MAX_SIZE + EXTRA_MAX_SIZE + SIDE_MAX_SIZE]; int deck_list[SIZE_NETWORK_BUFFER / sizeof(int32_t)];
std::memcpy(deck_list, deckbuf, deck_size); std::memcpy(deck_list, deckbuf, deck_size);
if(duel_count == 0) { if(duel_count == 0) {
deck_error[dp->type] = deckManager.LoadDeck(pdeck[dp->type], deck_list, mainc, sidec); deck_error[dp->type] = deckManager.LoadDeck(pdeck[dp->type], deck_list, mainc, sidec);
......
...@@ -260,16 +260,16 @@ void TagDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) { ...@@ -260,16 +260,16 @@ void TagDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
void TagDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) { void TagDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {
if(dp->type > 3 || ready[dp->type]) if(dp->type > 3 || ready[dp->type])
return; return;
if (len <= 8 || len % sizeof(int32_t) != 0) if (len < 8)
return; return;
bool valid = true; bool valid = true;
auto deckbuf = pdata; auto deckbuf = pdata;
int mainc = BufferIO::ReadInt32(deckbuf); int mainc = BufferIO::ReadInt32(deckbuf);
int sidec = BufferIO::ReadInt32(deckbuf); int sidec = BufferIO::ReadInt32(deckbuf);
const int deck_size = len - 2 * sizeof(int32_t); const int deck_size = len - 2 * sizeof(int32_t);
if (mainc < DECK_MIN_SIZE || mainc > DECK_MAX_SIZE + EXTRA_MAX_SIZE) if (mainc < 0 || mainc > MAINC_MAX)
valid = false; valid = false;
else if (sidec < 0 || sidec > SIDE_MAX_SIZE) else if (sidec < 0 || sidec > SIDEC_MAX)
valid = false; valid = false;
else if (deck_size != (mainc + sidec) * (int)sizeof(int32_t)) else if (deck_size != (mainc + sidec) * (int)sizeof(int32_t))
valid = false; valid = false;
...@@ -280,7 +280,7 @@ void TagDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) { ...@@ -280,7 +280,7 @@ void TagDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {
NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem); NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem);
return; return;
} }
int deck_list[DECK_MAX_SIZE + EXTRA_MAX_SIZE + SIDE_MAX_SIZE]; int deck_list[SIZE_NETWORK_BUFFER / sizeof(int32_t)];
std::memcpy(deck_list, deckbuf, deck_size); std::memcpy(deck_list, deckbuf, deck_size);
deck_error[dp->type] = deckManager.LoadDeck(pdeck[dp->type], deck_list, mainc, sidec); deck_error[dp->type] = deckManager.LoadDeck(pdeck[dp->type], deck_list, mainc, sidec);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment