Fix sending uninitialized bytes in light request

This commit is contained in:
Kp 2014-12-30 02:09:21 +00:00
parent b86870f5ef
commit bd9513b080

View file

@ -78,7 +78,6 @@ struct UDP_frame_info : prohibit_void_ptr<UDP_frame_info>
// Prototypes // Prototypes
static void net_udp_init(); static void net_udp_init();
static void net_udp_close(); static void net_udp_close();
static void net_udp_request_game_info(const _sockaddr &game_addr, int lite);
static void net_udp_listen(); static void net_udp_listen();
static int net_udp_show_game_info(); static int net_udp_show_game_info();
static int net_udp_do_join_game(); static int net_udp_do_join_game();
@ -124,10 +123,10 @@ int num_active_udp_changed = 0;
static uint16_t UDP_MyPort; static uint16_t UDP_MyPort;
struct _sockaddr GBcast; // global Broadcast address clients and hosts will use for lite_info exchange over LAN struct _sockaddr GBcast; // global Broadcast address clients and hosts will use for lite_info exchange over LAN
#ifdef IPv6 #ifdef IPv6
struct _sockaddr GMcast_v6; // same for IPv6-only static _sockaddr GMcast_v6; // same for IPv6-only
#endif #endif
#ifdef USE_TRACKER #ifdef USE_TRACKER
struct _sockaddr TrackerSocket; static _sockaddr TrackerSocket;
int iTrackerVerified = 0; int iTrackerVerified = 0;
static const int require_tracker_socket = 1; static const int require_tracker_socket = 1;
#else #else
@ -209,6 +208,16 @@ static void copy_to_ntstring(const uint8_t *const buf, uint_fast32_t &len, ntstr
out.back() = 0; out.back() = 0;
} }
static void net_udp_prepare_request_game_info(array<uint8_t, UPID_GAME_INFO_REQ_SIZE> &buf, int lite)
{
buf[0] = lite ? UPID_GAME_INFO_LITE_REQ : UPID_GAME_INFO_REQ;
memcpy(&buf[1], UDP_REQ_ID, 4);
PUT_INTEL_SHORT(&buf[5], DXX_VERSION_MAJORi);
PUT_INTEL_SHORT(&buf[7], DXX_VERSION_MINORi);
PUT_INTEL_SHORT(&buf[9], DXX_VERSION_MICROi);
PUT_INTEL_SHORT(&buf[11], MULTI_PROTO_VERSION);
}
static void reset_UDP_MyPort() static void reset_UDP_MyPort()
{ {
UDP_MyPort = GameArg.MplUdpMyPort >= 1024 ? GameArg.MplUdpMyPort : UDP_PORT_DEFAULT; UDP_MyPort = GameArg.MplUdpMyPort >= 1024 ? GameArg.MplUdpMyPort : UDP_PORT_DEFAULT;
@ -616,6 +625,14 @@ static void udp_tracker_reqgames()
} }
#endif /* USE_TRACKER */ #endif /* USE_TRACKER */
template <typename T>
static void net_udp_request_game_info(const T &game_addr, int lite)
{
array<uint8_t, UPID_GAME_INFO_REQ_SIZE> buf;
net_udp_prepare_request_game_info(buf, lite);
dxx_sendto (UDP_Socket[0], &buf[0], buf.size(), 0, game_addr);
}
struct direct_join struct direct_join
{ {
struct _sockaddr host_addr; struct _sockaddr host_addr;
@ -2174,21 +2191,6 @@ static void net_udp_process_version_deny(ubyte *data, const _sockaddr &)
Netgame.protocol.udp.valid = -1; Netgame.protocol.udp.valid = -1;
} }
void net_udp_request_game_info(const _sockaddr &game_addr, int lite)
{
ubyte buf[UPID_GAME_INFO_REQ_SIZE];
buf[0] = (lite?UPID_GAME_INFO_LITE_REQ:UPID_GAME_INFO_REQ);
memcpy(&(buf[1]), UDP_REQ_ID, 4);
PUT_INTEL_SHORT(buf + 5, DXX_VERSION_MAJORi);
PUT_INTEL_SHORT(buf + 7, DXX_VERSION_MINORi);
PUT_INTEL_SHORT(buf + 9, DXX_VERSION_MICROi);
if (!lite)
PUT_INTEL_SHORT(buf + 11, MULTI_PROTO_VERSION);
dxx_sendto (UDP_Socket[0], buf, sizeof(buf), 0, game_addr);
}
// Check request for game info. Return 1 if sucessful; -1 if version mismatch; 0 if wrong game or some other error - do not process // Check request for game info. Return 1 if sucessful; -1 if version mismatch; 0 if wrong game or some other error - do not process
static int net_udp_check_game_info_request(ubyte *data, int lite) static int net_udp_check_game_info_request(ubyte *data, int lite)
{ {