Commit ed0ae0a0 authored by fallenstardust's avatar fallenstardust

Revert "use std array in NetServer::ServerEchoRead"

check len before memcpy in UpdateDeck
parent bafe0abf
......@@ -105,17 +105,18 @@ void DuelClient::ClientRead(bufferevent* bev, void* ctx) {
int len = evbuffer_get_length(input);
if (len < 2)
return;
std::array<unsigned char, SIZE_NETWORK_BUFFER> duel_client_read;
unsigned char* duel_client_read = new unsigned char[SIZE_NETWORK_BUFFER];
uint16_t packet_len = 0;
while (len >= 2) {
evbuffer_copyout(input, &packet_len, sizeof packet_len);
if (len < packet_len + 2)
break;
int read_len = evbuffer_remove(input, duel_client_read.data(), packet_len + 2);
int read_len = evbuffer_remove(input, duel_client_read, packet_len + 2);
if (read_len > 2)
HandleSTOCPacketLan(&duel_client_read[2], read_len - 2);
len -= packet_len + 2;
}
delete[] duel_client_read;
}
void DuelClient::ClientEvent(bufferevent* bev, short events, void* ctx) {
if (events & BEV_EVENT_CONNECTED) {
......
......@@ -4,7 +4,6 @@
#include "tag_duel.h"
#include "deck_manager.h"
#include <thread>
#include <array>
namespace ygo {
std::unordered_map<bufferevent*, DuelPlayer> NetServer::users;
......@@ -127,17 +126,18 @@ void NetServer::ServerEchoRead(bufferevent *bev, void *ctx) {
int len = evbuffer_get_length(input);
if (len < 2)
return;
std::array<unsigned char, SIZE_NETWORK_BUFFER> net_server_read;
unsigned char* net_server_read = new unsigned char[SIZE_NETWORK_BUFFER];
uint16_t packet_len = 0;
while (len >= 2) {
evbuffer_copyout(input, &packet_len, sizeof packet_len);
if (len < packet_len + 2)
break;
int read_len = evbuffer_remove(input, net_server_read.data(), packet_len + 2);
int read_len = evbuffer_remove(input, net_server_read, packet_len + 2);
if (read_len > 2)
HandleCTOSPacket(&users[bev], &net_server_read[2], read_len - 2);
len -= packet_len + 2;
}
delete[] net_server_read;
}
void NetServer::ServerEchoEvent(bufferevent* bev, short events, void* ctx) {
if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) {
......
......@@ -278,6 +278,8 @@ 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 || len > sizeof(CTOS_DeckData))
return;
bool valid = true;
CTOS_DeckData deckbuf;
std::memcpy(&deckbuf, pdata, len);
......
......@@ -261,6 +261,8 @@ 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 || len > sizeof(CTOS_DeckData))
return;
bool valid = true;
CTOS_DeckData deckbuf;
std::memcpy(&deckbuf, pdata, len);
......
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