From 54f01713bc7d4f9baaad09377cbc3c5a21a06b4a Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sun, 3 Apr 2022 23:36:22 -0700 Subject: [PATCH] fix bug causing private subcommands to get truncated --- src/ReceiveCommands.cc | 14 ++++++------- src/ReceiveSubcommands.cc | 4 ++-- src/SendCommands.cc | 2 +- src/SendCommands.hh | 43 +++++++++++++++++++++++++++++++-------- 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index f8dccb6f..30e24f30 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -445,7 +445,7 @@ void process_ep3_menu_challenge(shared_ptr, shared_ptr c, uint16_t, uint32_t flag, const string& data) { // DC check_size_v(data.size(), 0); if (flag != 0) { - send_command(c, 0xDC); + send_command(c, 0xDC, 0x00); } } @@ -1030,7 +1030,7 @@ void process_quest_ready(shared_ptr s, shared_ptr c, // if they're all done, start the quest if (x == l->max_clients) { - send_command(l, 0xAC); + send_command(l, 0xAC, 0x00); } } @@ -1710,7 +1710,7 @@ void process_team_command_bb(shared_ptr, shared_ptr c, void process_encryption_ok_patch(shared_ptr, shared_ptr c, uint16_t, uint32_t, const string& data) { check_size_v(data.size(), 0); - send_command(c, 0x04); // this requests the user's login information + send_command(c, 0x04, 0x00); // This requests the user's login information } void process_login_patch(shared_ptr s, shared_ptr c, @@ -1762,13 +1762,13 @@ independently.\r\n\ send_check_directory_patch(c, "."); send_check_directory_patch(c, "data"); send_check_directory_patch(c, "scene"); - send_command(c, 0x0A); - send_command(c, 0x0A); - send_command(c, 0x0A); + send_command(c, 0x0A, 0x00); + send_command(c, 0x0A, 0x00); + send_command(c, 0x0A, 0x00); // This command terminates the patch connection successfully. PSOBB complains // if we don't check the above directories before sending this though - send_command(c, 0x0012, 0x00000000); + send_command(c, 0x12, 0x00); } //////////////////////////////////////////////////////////////////////////////// diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index 4945ce61..2b4f0e83 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -78,7 +78,7 @@ static void forward_subcommand(shared_ptr l, shared_ptr c, if (command_is_ep3 && !(target->flags & Client::Flag::EPISODE_3)) { return; } - send_command(target, command, flag, data); + send_command(target, command, flag, data, size); } else { if (command_is_ep3) { @@ -86,7 +86,7 @@ static void forward_subcommand(shared_ptr l, shared_ptr c, if (!target || (target == c) || !(target->flags & Client::Flag::EPISODE_3)) { continue; } - send_command(target, command, flag, data); + send_command(target, command, flag, data, size); } } else { diff --git a/src/SendCommands.cc b/src/SendCommands.cc index 65f808a1..10469ffb 100644 --- a/src/SendCommands.cc +++ b/src/SendCommands.cc @@ -1017,7 +1017,7 @@ void send_player_leave_notification(shared_ptr l, uint8_t leaving_client_ } void send_get_player_info(shared_ptr c) { - send_command(c, 0x95); + send_command(c, 0x95, 0x00); } diff --git a/src/SendCommands.hh b/src/SendCommands.hh index f3a5d56a..192f6274 100644 --- a/src/SendCommands.hh +++ b/src/SendCommands.hh @@ -17,22 +17,49 @@ +// Note: There are so many versions of this function for a few reasons: +// - There are a lot of different target types (sometimes we want to send a +// command to one client, sometimes to everyone in a lobby, etc.) +// - For the const void* versions, the data and size arguments should not be +// independently optional - this can lead to bugs where a non-null data +// pointer is given but size is accidentally not given zero (e.g. if the type +// of data in the calling function is changed from string to void*). + void send_command(struct bufferevent* bev, GameVersion version, - PSOEncryption* crypt, uint16_t command, uint32_t flag = 0, - const void* data = nullptr, size_t size = 0, const char* name_str = nullptr); + PSOEncryption* crypt, uint16_t command, uint32_t flag, const void* data, + size_t size, const char* name_str = nullptr); void send_command(std::shared_ptr c, uint16_t command, - uint32_t flag = 0, const void* data = nullptr, size_t size = 0); + uint32_t flag, const void* data, size_t size); + +inline void send_command(std::shared_ptr c, uint16_t command, + uint32_t flag) { + send_command(c, command, flag, nullptr, 0); +} void send_command_excluding_client(std::shared_ptr l, - std::shared_ptr c, uint16_t command, uint32_t flag = 0, - const void* data = nullptr, size_t size = 0); + std::shared_ptr c, uint16_t command, uint32_t flag, + const void* data, size_t size); -void send_command(std::shared_ptr l, uint16_t command, uint32_t flag = 0, - const void* data = nullptr, size_t size = 0); +inline void send_command_excluding_client(std::shared_ptr l, + std::shared_ptr c, uint16_t command, uint32_t flag) { + send_command_excluding_client(l, c, command, flag, nullptr, 0); +} + +void send_command(std::shared_ptr l, uint16_t command, uint32_t flag, + const void* data, size_t size); + +inline void send_command(std::shared_ptr l, uint16_t command, uint32_t flag) { + send_command(l, command, flag, nullptr, 0); +} void send_command(std::shared_ptr s, uint16_t command, - uint32_t flag = 0, const void* data = nullptr, size_t size = 0); + uint32_t flag, const void* data, size_t size); + +inline void send_command(std::shared_ptr s, uint16_t command, + uint32_t flag) { + send_command(s, command, flag, nullptr, 0); +} template static void send_command(std::shared_ptr c, uint16_t command, uint32_t flag,