Commit c8803e16 authored by nanahira's avatar nanahira

Merge branch 'patch1' of github.com:salix5/ygopro into server-develop

parents b0e3c982 8866da6a
......@@ -305,7 +305,9 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
case CTOS_UPDATE_DECK: {
if(!dp->game)
return;
if (len < 1 + (int)sizeof(unsigned char))
if (len < 1 + (int)sizeof(int32_t) + (int)sizeof(int32_t))
return;
if (len > 1 + (int)sizeof(CTOS_DeckData))
return;
duel_mode->UpdateDeck(dp, pdata, len - 1);
break;
......
......@@ -54,6 +54,13 @@ struct HostRequest {
check_trivially_copyable(HostRequest);
static_assert(sizeof(HostRequest) == 2, "size mismatch: HostRequest");
struct CTOS_DeckData {
int32_t mainc{};
int32_t sidec{};
int32_t list[MAINC_MAX + SIDEC_MAX]{};
};
check_trivially_copyable(CTOS_DeckData);
struct CTOS_HandResult {
unsigned char res{};
};
......@@ -258,7 +265,7 @@ public:
#define NETPLAYER_TYPE_OBSERVER 7
#define CTOS_RESPONSE 0x1 // byte array
#define CTOS_UPDATE_DECK 0x2 // mainc, sidec, int32_t[mainc + sidec]
#define CTOS_UPDATE_DECK 0x2 // CTOS_DeckData
#define CTOS_HAND_RESULT 0x3 // CTOS_HandResult
#define CTOS_TP_RESULT 0x4 // CTOS_TPResult
#define CTOS_PLAYER_INFO 0x10 // CTOS_PlayerInfo
......
......@@ -394,22 +394,18 @@ void SingleDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
void SingleDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {
if(dp->type > 1 || ready[dp->type])
return;
if (len < 8)
return;
bool valid = true;
auto deckbuf = pdata;
int mainc = BufferIO::ReadInt32(deckbuf);
int sidec = BufferIO::ReadInt32(deckbuf);
const int deck_size = len - 2 * sizeof(int32_t);
if (mainc < 0 || mainc > MAINC_MAX)
CTOS_DeckData deckbuf;
std::memcpy(&deckbuf, pdata, len);
if (deckbuf.mainc < 0 || deckbuf.mainc > MAINC_MAX)
valid = false;
else if (sidec < 0 || sidec > SIDEC_MAX)
else if (deckbuf.sidec < 0 || deckbuf.sidec > SIDEC_MAX)
valid = false;
else if
#ifdef YGOPRO_SERVER_MODE
(deck_size < (mainc + sidec) * (int)sizeof(int32_t) || deck_size > MAINC_MAX + SIDEC_MAX)
(len < (2 + deckbuf.mainc + deckbuf.sidec) * (int)sizeof(int32_t) || len > (2 + MAINC_MAX + SIDEC_MAX) * (int)sizeof(int32_t))
#else
(deck_size != (mainc + sidec) * (int)sizeof(int32_t))
(len != (2 + deckbuf.mainc + deckbuf.sidec) * (int)sizeof(int32_t))
#endif
valid = false;
if (!valid) {
......@@ -419,12 +415,10 @@ void SingleDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {
NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem);
return;
}
int deck_list[SIZE_NETWORK_BUFFER / sizeof(int32_t)];
std::memcpy(deck_list, deckbuf, deck_size);
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], deckbuf.list, deckbuf.mainc, deckbuf.sidec);
} else {
if(deckManager.LoadSide(pdeck[dp->type], deck_list, mainc, sidec)) {
if(deckManager.LoadSide(pdeck[dp->type], deckbuf.list, deckbuf.mainc, deckbuf.sidec)) {
ready[dp->type] = true;
NetServer::SendPacketToPlayer(dp, STOC_DUEL_START);
if(ready[0] && ready[1]) {
......
......@@ -380,22 +380,18 @@ void TagDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
void TagDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {
if(dp->type > 3 || ready[dp->type])
return;
if (len < 8)
return;
bool valid = true;
auto deckbuf = pdata;
int mainc = BufferIO::ReadInt32(deckbuf);
int sidec = BufferIO::ReadInt32(deckbuf);
const int deck_size = len - 2 * sizeof(int32_t);
if (mainc < 0 || mainc > MAINC_MAX)
CTOS_DeckData deckbuf;
std::memcpy(&deckbuf, pdata, len);
if (deckbuf.mainc < 0 || deckbuf.mainc > MAINC_MAX)
valid = false;
else if (sidec < 0 || sidec > SIDEC_MAX)
else if (deckbuf.sidec < 0 || deckbuf.sidec > SIDEC_MAX)
valid = false;
else if
#ifdef YGOPRO_SERVER_MODE
(deck_size < (mainc + sidec) * (int)sizeof(int32_t) || deck_size > MAINC_MAX + SIDEC_MAX)
(len < (2 + deckbuf.mainc + deckbuf.sidec) * (int)sizeof(int32_t) || len > (2 + MAINC_MAX + SIDEC_MAX) * (int)sizeof(int32_t))
#else
(deck_size != (mainc + sidec) * (int)sizeof(int32_t))
(len != (2 + deckbuf.mainc + deckbuf.sidec) * (int)sizeof(int32_t))
#endif
valid = false;
if (!valid) {
......@@ -405,9 +401,7 @@ void TagDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {
NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem);
return;
}
int deck_list[SIZE_NETWORK_BUFFER / sizeof(int32_t)];
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], deckbuf.list, deckbuf.mainc, deckbuf.sidec);
}
void TagDuel::StartDuel(DuelPlayer* dp) {
if(dp != host_player)
......
Subproject commit 15ae75c68c2120e72566b6cd9083ed5bc1558dce
Subproject commit 9fd9ad8bb4e12283926d176f975fa5e5c2bc9edb
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