diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d0cfed83..f3c6b14a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -387,9 +387,9 @@ IF(EQEMU_BUILD_SERVER) ADD_SUBDIRECTORY(shared_memory) ADD_SUBDIRECTORY(world) ADD_SUBDIRECTORY(zone) - #ADD_SUBDIRECTORY(ucs) + ADD_SUBDIRECTORY(ucs) #ADD_SUBDIRECTORY(queryserv) - #ADD_SUBDIRECTORY(eqlaunch) + ADD_SUBDIRECTORY(eqlaunch) ENDIF(EQEMU_BUILD_SERVER) IF(EQEMU_BUILD_LOGIN) ADD_SUBDIRECTORY(loginserver) diff --git a/common/net/daybreak_connection.cpp b/common/net/daybreak_connection.cpp index 8b994c43b..c61fd8a6c 100644 --- a/common/net/daybreak_connection.cpp +++ b/common/net/daybreak_connection.cpp @@ -238,12 +238,14 @@ void EQ::Net::DaybreakConnectionManager::SendDisconnect(const std::string &addr, sockaddr_in send_addr; uv_ip4_addr(addr.c_str(), port, &send_addr); uv_buf_t send_buffers[1]; - - send_buffers[0].base = (char*)out.Data(); - send_buffers[0].len = out.Length(); - + + char *data = new char[out.Length()]; + memcpy(data, out.Data(), out.Length()); + send_buffers[0] = uv_buf_init(data, out.Length()); + send_req->data = send_buffers[0].base; int ret = uv_udp_send(send_req, &m_socket, send_buffers, 1, (sockaddr*)&send_addr, [](uv_udp_send_t* req, int status) { + delete[] (char*)req->data; delete req; }); } @@ -928,7 +930,7 @@ void EQ::Net::DaybreakConnection::Decompress(Packet &p, size_t offset, size_t le void EQ::Net::DaybreakConnection::Compress(Packet &p, size_t offset, size_t length) { - uint8_t new_buffer[2048]; + uint8_t new_buffer[2048] = { 0 }; uint8_t *buffer = (uint8_t*)p.Data() + offset; uint32_t new_length = 0; @@ -1115,6 +1117,7 @@ void EQ::Net::DaybreakConnection::InternalSend(Packet &p) m_last_send = Clock::now(); auto send_func = [](uv_udp_send_t* req, int status) { + delete[](char*)req->data; delete req; }; @@ -1138,16 +1141,20 @@ void EQ::Net::DaybreakConnection::InternalSend(Packet &p) AppendCRC(out); uv_udp_send_t *send_req = new uv_udp_send_t; + memset(send_req, 0, sizeof(*send_req)); sockaddr_in send_addr; uv_ip4_addr(m_endpoint.c_str(), m_port, &send_addr); uv_buf_t send_buffers[1]; - send_buffers[0].base = (char*)out.Data(); - send_buffers[0].len = out.Length(); + char *data = new char[out.Length()]; + memcpy(data, out.Data(), out.Length()); + send_buffers[0] = uv_buf_init(data, out.Length()); + send_req->data = send_buffers[0].base; m_stats.sent_bytes += out.Length(); m_stats.sent_packets++; if (m_owner->m_options.simulated_out_packet_loss && m_owner->m_options.simulated_out_packet_loss >= m_owner->m_rand.Int(0, 100)) { + delete[] (char*)send_req->data; delete send_req; return; } @@ -1161,13 +1168,16 @@ void EQ::Net::DaybreakConnection::InternalSend(Packet &p) uv_ip4_addr(m_endpoint.c_str(), m_port, &send_addr); uv_buf_t send_buffers[1]; - send_buffers[0].base = (char*)p.Data(); - send_buffers[0].len = p.Length(); + char *data = new char[p.Length()]; + memcpy(data, p.Data(), p.Length()); + send_buffers[0] = uv_buf_init(data, p.Length()); + send_req->data = send_buffers[0].base; m_stats.sent_bytes += p.Length(); m_stats.sent_packets++; if (m_owner->m_options.simulated_out_packet_loss && m_owner->m_options.simulated_out_packet_loss >= m_owner->m_rand.Int(0, 100)) { + delete[] (char*)send_req->data; delete send_req; return; } diff --git a/common/net/packet.h b/common/net/packet.h index a3275b48e..b5cb114ea 100644 --- a/common/net/packet.h +++ b/common/net/packet.h @@ -118,7 +118,7 @@ namespace EQ { virtual size_t Length() const { return m_data.size(); } virtual size_t Length() { return m_data.size(); } virtual bool Clear() { m_data.clear(); return true; } - virtual bool Resize(size_t new_size) { m_data.resize(new_size); return true; } + virtual bool Resize(size_t new_size) { m_data.resize(new_size, 0); return true; } virtual void Reserve(size_t new_size) { m_data.reserve(new_size); } protected: std::vector m_data; diff --git a/common/net/tcp_connection.cpp b/common/net/tcp_connection.cpp index 62c049d0e..4ff018eb5 100644 --- a/common/net/tcp_connection.cpp +++ b/common/net/tcp_connection.cpp @@ -138,11 +138,15 @@ void EQ::Net::TCPConnection::Write(const char *data, size_t count) memset(write_req, 0, sizeof(uv_write_t)); write_req->data = this; uv_buf_t send_buffers[1]; - send_buffers[0].base = (char*)data; - send_buffers[0].len = count; + + char *data_out = new char[count]; + memcpy(data_out, data, count); + send_buffers[0] = uv_buf_init(data_out, count); + write_req->data = send_buffers[0].base; uv_write(write_req, (uv_stream_t*)m_socket, send_buffers, 1, [](uv_write_t* req, int status) { EQ::Net::TCPConnection *connection = (EQ::Net::TCPConnection*)req->data; + delete[] (char*)req->data; delete req; if (status < 0) { diff --git a/zone/net.cpp b/zone/net.cpp index d08fd7975..f0c761af1 100644 --- a/zone/net.cpp +++ b/zone/net.cpp @@ -445,7 +445,7 @@ int main(int argc, char** argv) { if (!eqsf_open && Config->ZonePort != 0) { Log.Out(Logs::General, Logs::Zone_Server, "Starting EQ Network server on port %d", Config->ZonePort); - EQ::Net::EQStreamManagerOptions opts(Config->ZonePort, false, false); + EQ::Net::EQStreamManagerOptions opts(Config->ZonePort, false, true); eqsm.reset(new EQ::Net::EQStreamManager(opts)); eqsf_open = true;