Skip to content

Commit 0927625

Browse files
committed
fix replaybuf overflow
1 parent d4b0cf3 commit 0927625

2 files changed

Lines changed: 16 additions & 8 deletions

File tree

gframe/single_duel.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1428,14 +1428,18 @@ void SingleDuel::EndDuel() {
14281428
if(!pduel)
14291429
return;
14301430
last_replay.EndRecord();
1431-
char replaybuf[0x2000], *pbuf = replaybuf;
1432-
std::memcpy(pbuf, &last_replay.pheader, sizeof last_replay.pheader);
1433-
pbuf += sizeof last_replay.pheader;
1431+
size_t header_size = sizeof last_replay.pheader;
1432+
size_t buffer_size = header_size + last_replay.comp_size;
1433+
char* replaybuf = new char[buffer_size];
1434+
char* pbuf = replaybuf;
1435+
std::memcpy(pbuf, &last_replay.pheader, header_size);
1436+
pbuf += header_size;
14341437
std::memcpy(pbuf, last_replay.comp_data, last_replay.comp_size);
1435-
NetServer::SendBufferToPlayer(players[0], STOC_REPLAY, replaybuf, sizeof last_replay.pheader + last_replay.comp_size);
1438+
NetServer::SendBufferToPlayer(players[0], STOC_REPLAY, replaybuf, buffer_size);
14361439
NetServer::ReSendToPlayer(players[1]);
14371440
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
14381441
NetServer::ReSendToPlayer(*oit);
1442+
delete[] replaybuf;
14391443
end_duel(pduel);
14401444
event_del(etimer);
14411445
pduel = 0;

gframe/tag_duel.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1536,16 +1536,20 @@ void TagDuel::EndDuel() {
15361536
if(!pduel)
15371537
return;
15381538
last_replay.EndRecord();
1539-
char replaybuf[0x2000], *pbuf = replaybuf;
1540-
std::memcpy(pbuf, &last_replay.pheader, sizeof last_replay.pheader);
1541-
pbuf += sizeof last_replay.pheader;
1539+
size_t header_size = sizeof last_replay.pheader;
1540+
size_t buffer_size = header_size + last_replay.comp_size;
1541+
char* replaybuf = new char[buffer_size];
1542+
char* pbuf = replaybuf;
1543+
std::memcpy(pbuf, &last_replay.pheader, header_size);
1544+
pbuf += header_size;
15421545
std::memcpy(pbuf, last_replay.comp_data, last_replay.comp_size);
1543-
NetServer::SendBufferToPlayer(players[0], STOC_REPLAY, replaybuf, sizeof last_replay.pheader + last_replay.comp_size);
1546+
NetServer::SendBufferToPlayer(players[0], STOC_REPLAY, replaybuf, buffer_size);
15441547
NetServer::ReSendToPlayer(players[1]);
15451548
NetServer::ReSendToPlayer(players[2]);
15461549
NetServer::ReSendToPlayer(players[3]);
15471550
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
15481551
NetServer::ReSendToPlayer(*oit);
1552+
delete[] replaybuf;
15491553
end_duel(pduel);
15501554
event_del(etimer);
15511555
pduel = 0;

0 commit comments

Comments
 (0)