Skip to content

Commit 8ef2167

Browse files
salix5Copilot
andauthored
Remove CTOS_DeckData and use uint32_t array in deck loading functions (#3071)
* Use size_t for length in HandleCTOSPacket Co-authored-by: Copilot <copilot@github.com> * Use uint32_t in deck loading functions Co-authored-by: Copilot <copilot@github.com> * fix Co-authored-by: Copilot <copilot@github.com> * Validate deck update length in SingleDuel and TagDuel Co-authored-by: Copilot <copilot@github.com> * revert --------- Co-authored-by: Copilot <copilot@github.com>
1 parent ccbe7bd commit 8ef2167

9 files changed

Lines changed: 42 additions & 48 deletions

File tree

gframe/deck_manager.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,11 @@ uint32_t DeckManager::CheckDeck(const Deck& deck, unsigned int lfhash, size_t ru
148148
}
149149
return 0;
150150
}
151-
uint32_t DeckManager::LoadDeck(Deck& deck, uint32_t dbuf[], int mainc, int sidec, bool is_packlist) {
151+
uint32_t DeckManager::LoadDeck(Deck& deck, uint32_t dbuf[], uint32_t mainc, uint32_t sidec, bool is_packlist) {
152152
deck.clear();
153153
uint32_t errorcode = 0;
154154
auto& _datas = dataManager.GetDataTable();
155-
for(int i = 0; i < mainc; ++i) {
155+
for(uint32_t i = 0; i < mainc; ++i) {
156156
auto code = dbuf[i];
157157
auto it = _datas.find(code);
158158
if(it == _datas.end()) {
@@ -177,7 +177,7 @@ uint32_t DeckManager::LoadDeck(Deck& deck, uint32_t dbuf[], int mainc, int sidec
177177
deck.main.push_back(&cd);
178178
}
179179
}
180-
for(int i = 0; i < sidec; ++i) {
180+
for(uint32_t i = 0; i < sidec; ++i) {
181181
auto code = dbuf[mainc + i];
182182
auto it = _datas.find(code);
183183
if(it == _datas.end()) {
@@ -219,7 +219,7 @@ uint32_t DeckManager::LoadDeckFromStream(Deck& deck, std::istringstream& deckStr
219219
}
220220
return LoadDeck(deck, cardlist, mainc, sidec, is_packlist);
221221
}
222-
bool DeckManager::LoadSide(Deck& deck, uint32_t dbuf[], int mainc, int sidec) {
222+
bool DeckManager::LoadSide(Deck& deck, uint32_t dbuf[], uint32_t mainc, uint32_t sidec) {
223223
std::unordered_map<uint32_t, int> pcount;
224224
std::unordered_map<uint32_t, int> ncount;
225225
for(auto card : deck.main)

gframe/deck_manager.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ class DeckManager {
5151
bool LoadCurrentDeck(int category_index, const wchar_t* category_name, const wchar_t* deckname);
5252
bool LoadCurrentDeck(std::istringstream& deckStream, bool is_packlist = false);
5353

54-
static uint32_t LoadDeck(Deck& deck, uint32_t dbuf[], int mainc, int sidec, bool is_packlist = false);
54+
static uint32_t LoadDeck(Deck& deck, uint32_t dbuf[], uint32_t mainc, uint32_t sidec, bool is_packlist = false);
5555
static uint32_t LoadDeckFromStream(Deck& deck, std::istringstream& deckStream, bool is_packlist = false);
56-
static bool LoadSide(Deck& deck, uint32_t dbuf[], int mainc, int sidec);
56+
static bool LoadSide(Deck& deck, uint32_t dbuf[], uint32_t mainc, uint32_t sidec);
5757
static void GetCategoryPath(wchar_t* ret, int index, const wchar_t* text);
5858
static void GetDeckFile(wchar_t* ret, int category_index, const wchar_t* category_name, const wchar_t* deckname);
5959
static FILE* OpenDeckFile(const wchar_t* file, const char* mode);

gframe/netserver.cpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
#include "netserver.h"
33
#include "single_duel.h"
44
#include "tag_duel.h"
5-
#include "deck_manager.h"
65
#include <thread>
76
#include <unordered_map>
87

@@ -129,7 +128,7 @@ void NetServer::ServerAcceptError(evconnlistener* listener, void* ctx) {
129128
*/
130129
void NetServer::ServerEchoRead(bufferevent *bev, void *ctx) {
131130
evbuffer* input = bufferevent_get_input(bev);
132-
int len = evbuffer_get_length(input);
131+
size_t len = evbuffer_get_length(input);
133132
if (len < 2)
134133
return;
135134
uint16_t packet_len = 0;
@@ -187,7 +186,7 @@ void NetServer::DisconnectPlayer(DuelPlayer* dp) {
187186
users.erase(bit);
188187
}
189188
}
190-
void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
189+
void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, size_t len) {
191190
auto pdata = data;
192191
unsigned char pktType = BufferIO::Read<uint8_t>(pdata);
193192
if((pktType != CTOS_SURRENDER) && (pktType != CTOS_CHAT) && (dp->state == 0xff || (dp->state && dp->state != pktType)))
@@ -196,7 +195,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
196195
case CTOS_RESPONSE: {
197196
if(!dp->game || !duel_mode->pduel)
198197
return;
199-
if (len < 1 + (int)sizeof(unsigned char))
198+
if (len < 1 + sizeof(unsigned char))
200199
return;
201200
duel_mode->GetResponse(dp, pdata, len - 1);
202201
break;
@@ -222,17 +221,15 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
222221
case CTOS_UPDATE_DECK: {
223222
if(!dp->game)
224223
return;
225-
if (len < 1 + (int)sizeof(int32_t) + (int)sizeof(int32_t))
226-
return;
227-
if (len > 1 + (int)sizeof(CTOS_DeckData))
224+
if (len < 1 + sizeof(uint32_t) * 2)
228225
return;
229226
duel_mode->UpdateDeck(dp, pdata, len - 1);
230227
break;
231228
}
232229
case CTOS_HAND_RESULT: {
233230
if(!dp->game)
234231
return;
235-
if (len < 1 + (int)sizeof(CTOS_HandResult))
232+
if (len < 1 + sizeof(CTOS_HandResult))
236233
return;
237234
CTOS_HandResult packet;
238235
std::memcpy(&packet, pdata, sizeof packet);
@@ -243,7 +240,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
243240
case CTOS_TP_RESULT: {
244241
if(!dp->game)
245242
return;
246-
if (len < 1 + (int)sizeof(CTOS_TPResult))
243+
if (len < 1 + sizeof(CTOS_TPResult))
247244
return;
248245
CTOS_TPResult packet;
249246
std::memcpy(&packet, pdata, sizeof packet);
@@ -252,7 +249,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
252249
break;
253250
}
254251
case CTOS_PLAYER_INFO: {
255-
if (len < 1 + (int)sizeof(CTOS_PlayerInfo))
252+
if (len < 1 + sizeof(CTOS_PlayerInfo))
256253
return;
257254
CTOS_PlayerInfo packet;
258255
std::memcpy(&packet, pdata, sizeof packet);
@@ -273,7 +270,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
273270
case CTOS_CREATE_GAME: {
274271
if(dp->game || duel_mode)
275272
return;
276-
if (len < 1 + (int)sizeof(CTOS_CreateGame))
273+
if (len < 1 + sizeof(CTOS_CreateGame))
277274
return;
278275
CTOS_CreateGame packet;
279276
std::memcpy(&packet, pdata, sizeof packet);
@@ -321,7 +318,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
321318
case CTOS_JOIN_GAME: {
322319
if (!duel_mode)
323320
return;
324-
if (len < 1 + (int)sizeof(CTOS_JoinGame))
321+
if (len < 1 + sizeof(CTOS_JoinGame))
325322
return;
326323
duel_mode->JoinGame(dp, pdata, false);
327324
break;
@@ -360,7 +357,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
360357
case CTOS_HS_KICK: {
361358
if (!duel_mode || duel_mode->pduel)
362359
return;
363-
if (len < 1 + (int)sizeof(CTOS_Kick))
360+
if (len < 1 + sizeof(CTOS_Kick))
364361
return;
365362
CTOS_Kick packet;
366363
std::memcpy(&packet, pdata, sizeof packet);

gframe/netserver.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class NetServer {
2424
static void ServerEchoEvent(bufferevent* bev, short events, void* ctx);
2525
static int ServerThread();
2626
static void DisconnectPlayer(DuelPlayer* dp);
27-
static void HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len);
27+
static void HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, size_t len);
2828
static size_t CreateChatPacket(unsigned char* src, int src_size, unsigned char* dst, uint16_t dst_player_type);
2929
static void SendPacketToPlayer(DuelPlayer* dp, unsigned char proto) {
3030
auto p = net_server_write;

gframe/network.h

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,6 @@ struct HostRequest {
5454
check_trivially_copyable(HostRequest);
5555
static_assert(sizeof(HostRequest) == 2, "size mismatch: HostRequest");
5656

57-
struct CTOS_DeckData {
58-
int32_t mainc{};
59-
int32_t sidec{};
60-
uint32_t list[MAINC_MAX + SIDEC_MAX]{};
61-
};
62-
check_trivially_copyable(CTOS_DeckData);
63-
6457
struct CTOS_HandResult {
6558
uint8_t res{};
6659
};
@@ -221,7 +214,7 @@ class DuelMode {
221214
virtual void ToObserver(DuelPlayer* dp) = 0;
222215
virtual void PlayerReady(DuelPlayer* dp, bool is_ready) = 0;
223216
virtual void PlayerKick(DuelPlayer* dp, unsigned char pos) = 0;
224-
virtual void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) = 0;
217+
virtual void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, unsigned int len) = 0;
225218
virtual void StartDuel(DuelPlayer* dp) = 0;
226219
virtual void HandResult(DuelPlayer* dp, unsigned char res) = 0;
227220
virtual void TPResult(DuelPlayer* dp, unsigned char tp) = 0;
@@ -256,7 +249,7 @@ class DuelMode {
256249
#define NETPLAYER_TYPE_OBSERVER 7
257250

258251
#define CTOS_RESPONSE 0x1 // byte array
259-
#define CTOS_UPDATE_DECK 0x2 // CTOS_DeckData
252+
#define CTOS_UPDATE_DECK 0x2 // uint32_t mainc, uint32_t sidec, uint32_t[mainc+sidec]
260253
#define CTOS_HAND_RESULT 0x3 // CTOS_HandResult
261254
#define CTOS_TP_RESULT 0x4 // CTOS_TPResult
262255
#define CTOS_PLAYER_INFO 0x10 // CTOS_PlayerInfo

gframe/single_duel.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -275,19 +275,19 @@ void SingleDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
275275
return;
276276
LeaveGame(players[pos]);
277277
}
278-
void SingleDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {
278+
void SingleDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, unsigned int len) {
279279
if(dp->type > 1 || ready[dp->type])
280280
return;
281-
if (len < 8 || len > sizeof(CTOS_DeckData))
281+
if (len < sizeof(uint32_t) * 2)
282282
return;
283283
bool valid = true;
284-
CTOS_DeckData deckbuf;
285-
std::memcpy(&deckbuf, pdata, len);
286-
if (deckbuf.mainc < 0 || deckbuf.mainc > MAINC_MAX)
284+
uint32_t mainc = BufferIO::Read<uint32_t>(pdata);
285+
uint32_t sidec = BufferIO::Read<uint32_t>(pdata);
286+
if (mainc > MAINC_MAX)
287287
valid = false;
288-
else if (deckbuf.sidec < 0 || deckbuf.sidec > SIDEC_MAX)
288+
else if (sidec > SIDEC_MAX)
289289
valid = false;
290-
else if (len < (2 + deckbuf.mainc + deckbuf.sidec) * (int)sizeof(int32_t))
290+
else if (len < (2 + mainc + sidec) * sizeof(uint32_t))
291291
valid = false;
292292
if (!valid) {
293293
STOC_ErrorMsg scem;
@@ -296,10 +296,12 @@ void SingleDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {
296296
NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem);
297297
return;
298298
}
299+
uint32_t deckbuf[MAINC_MAX + SIDEC_MAX];
300+
std::memcpy(deckbuf, pdata, (mainc + sidec) * sizeof(uint32_t));
299301
if(duel_count == 0) {
300-
deck_error[dp->type] = DeckManager::LoadDeck(pdeck[dp->type], deckbuf.list, deckbuf.mainc, deckbuf.sidec);
302+
deck_error[dp->type] = DeckManager::LoadDeck(pdeck[dp->type], deckbuf, mainc, sidec);
301303
} else {
302-
if(DeckManager::LoadSide(pdeck[dp->type], deckbuf.list, deckbuf.mainc, deckbuf.sidec)) {
304+
if(DeckManager::LoadSide(pdeck[dp->type], deckbuf, mainc, sidec)) {
303305
ready[dp->type] = true;
304306
NetServer::SendPacketToPlayer(dp, STOC_DUEL_START);
305307
if(ready[0] && ready[1]) {

gframe/single_duel.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class SingleDuel: public DuelMode {
1919
void ToObserver(DuelPlayer* dp) override;
2020
void PlayerReady(DuelPlayer* dp, bool is_ready) override;
2121
void PlayerKick(DuelPlayer* dp, unsigned char pos) override;
22-
void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) override;
22+
void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, unsigned int len) override;
2323
void StartDuel(DuelPlayer* dp) override;
2424
void HandResult(DuelPlayer* dp, unsigned char res) override;
2525
void TPResult(DuelPlayer* dp, unsigned char tp) override;

gframe/tag_duel.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -257,19 +257,19 @@ void TagDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
257257
return;
258258
LeaveGame(players[pos]);
259259
}
260-
void TagDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {
260+
void TagDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, unsigned int len) {
261261
if(dp->type > 3 || ready[dp->type])
262262
return;
263-
if (len < 8 || len > sizeof(CTOS_DeckData))
263+
if (len < sizeof(uint32_t) * 2)
264264
return;
265265
bool valid = true;
266-
CTOS_DeckData deckbuf;
267-
std::memcpy(&deckbuf, pdata, len);
268-
if (deckbuf.mainc < 0 || deckbuf.mainc > MAINC_MAX)
266+
uint32_t mainc = BufferIO::Read<uint32_t>(pdata);
267+
uint32_t sidec = BufferIO::Read<uint32_t>(pdata);
268+
if (mainc > MAINC_MAX)
269269
valid = false;
270-
else if (deckbuf.sidec < 0 || deckbuf.sidec > SIDEC_MAX)
270+
else if (sidec > SIDEC_MAX)
271271
valid = false;
272-
else if (len < (2 + deckbuf.mainc + deckbuf.sidec) * (int)sizeof(int32_t))
272+
else if (len < (2 + mainc + sidec) * sizeof(uint32_t))
273273
valid = false;
274274
if (!valid) {
275275
STOC_ErrorMsg scem;
@@ -278,7 +278,9 @@ void TagDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {
278278
NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem);
279279
return;
280280
}
281-
deck_error[dp->type] = DeckManager::LoadDeck(pdeck[dp->type], deckbuf.list, deckbuf.mainc, deckbuf.sidec);
281+
uint32_t deckbuf[MAINC_MAX + SIDEC_MAX];
282+
std::memcpy(deckbuf, pdata, (mainc + sidec) * sizeof(uint32_t));
283+
deck_error[dp->type] = DeckManager::LoadDeck(pdeck[dp->type], deckbuf, mainc, sidec);
282284
}
283285
void TagDuel::StartDuel(DuelPlayer* dp) {
284286
if(dp != host_player)

gframe/tag_duel.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class TagDuel: public DuelMode {
1919
void ToObserver(DuelPlayer* dp) override;
2020
void PlayerReady(DuelPlayer* dp, bool is_ready) override;
2121
void PlayerKick(DuelPlayer* dp, unsigned char pos) override;
22-
void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) override;
22+
void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, unsigned int len) override;
2323
void StartDuel(DuelPlayer* dp) override;
2424
void HandResult(DuelPlayer* dp, unsigned char res) override;
2525
void TPResult(DuelPlayer* dp, unsigned char tp) override;

0 commit comments

Comments
 (0)