diff --git a/libreborn/include/libreborn/libreborn.h b/libreborn/include/libreborn/libreborn.h index a220b30..7bb402c 100644 --- a/libreborn/include/libreborn/libreborn.h +++ b/libreborn/include/libreborn/libreborn.h @@ -18,6 +18,7 @@ extern "C" { // Set obj To NULL On asprintf() Failure #define asprintf(obj, ...) if (asprintf(obj, __VA_ARGS__) == -1) { *obj = NULL; } +// Hook Library Function #define HOOK(name, return_type, args) \ typedef return_type (*name##_t)args; \ static name##_t real_##name = NULL; \ @@ -34,6 +35,11 @@ extern "C" { \ __attribute__((__used__)) return_type name args +// Sanitize String +void sanitize_string(char **str, int max_length); + +// Patching Functions + void _overwrite_call(const char *file, int line, void *start, void *target); #define overwrite_call(start, target) _overwrite_call(__FILE__, __LINE__, start, target); diff --git a/libreborn/src/libreborn.c b/libreborn/src/libreborn.c index 82e196b..c0eb346 100644 --- a/libreborn/src/libreborn.c +++ b/libreborn/src/libreborn.c @@ -210,3 +210,23 @@ void _patch_address(const char *file, int line, void *start, void *target) { unsigned char patch_data[4] = {addr & 0xff, (addr >> 8) & 0xff, (addr >> 16) & 0xff, (addr >> 24) & 0xff}; _patch(file, line, start, patch_data); } + +// Sanitize String +#define MINIMUM_MESSAGE_CHARACTER 32 +#define MAXIMUM_MESSAGE_CHARACTER 126 +void sanitize_string(char **str, int max_length) { + // Store Message Length + int length = strlen(*str); + // Truncate Message + if (max_length != -1 && length > max_length) { + (*str)[max_length] = '\0'; + length = max_length; + } + // Loop Through Message + for (int i = 0; i < length; i++) { + if ((*str)[i] < MINIMUM_MESSAGE_CHARACTER || (*str)[i] > MAXIMUM_MESSAGE_CHARACTER) { + // Replace Illegal Character + (*str)[i] = '?'; + } + } +} \ No newline at end of file diff --git a/mods/src/chat/chat.cpp b/mods/src/chat/chat.cpp index adefb97..02d17e4 100644 --- a/mods/src/chat/chat.cpp +++ b/mods/src/chat/chat.cpp @@ -12,9 +12,7 @@ #include "chat.h" // Message Limitations -#define MAX_MESSAGE_LENGTH 512 -#define MINIMUM_MESSAGE_CHARACTER 32 -#define MAXIMUM_MESSAGE_CHARACTER 126 +#define MAX_CHAT_MESSAGE_LENGTH 512 // Send API Command static void send_api_command(unsigned char *minecraft, char *str) { @@ -36,29 +34,12 @@ static void send_api_chat_command(unsigned char *minecraft, char *str) { free(command); } -// Sanitize Message -static void sanitize_message(char **message) { - // Store Message Length - int length = strlen(*message); - // Truncate Message - if (length > MAX_MESSAGE_LENGTH) { - (*message)[MAX_MESSAGE_LENGTH] = '\0'; - length = MAX_MESSAGE_LENGTH; - } - // Loop Through Message - for (int i = 0; i < length; i++) { - if ((*message)[i] < MINIMUM_MESSAGE_CHARACTER || (*message)[i] > MAXIMUM_MESSAGE_CHARACTER) { - // Replace Illegal Character - (*message)[i] = '?'; - } - } -} // Send Message To Players static void send_message(unsigned char *server_side_network_handler, char *username, char *message) { char *full_message = NULL; asprintf(&full_message, "<%s> %s", username, message); ALLOC_CHECK(full_message); - sanitize_message(&full_message); + sanitize_string(&full_message, MAX_CHAT_MESSAGE_LENGTH); (*ServerSideNetworkHandler_displayGameMessage)(server_side_network_handler, std::string(full_message)); free(full_message); } diff --git a/mods/src/misc/misc.cpp b/mods/src/misc/misc.cpp index 869e587..a130fef 100644 --- a/mods/src/misc/misc.cpp +++ b/mods/src/misc/misc.cpp @@ -71,22 +71,31 @@ static int32_t Inventory_setupDefault_FillingContainer_addItem_call_injection(un // Print Chat To Log static bool Gui_addMessage_recursing = false; static void Gui_addMessage_injection(unsigned char *gui, std::string const& text) { + // Sanitize Message + char *new_message = strdup(text.c_str()); + ALLOC_CHECK(new_message); + sanitize_string(&new_message, -1); + + // Process Message if (!Gui_addMessage_recursing) { // Start Recursing Gui_addMessage_recursing = true; // Print Log Message - fprintf(stderr, "[CHAT]: %s\n", text.c_str()); + fprintf(stderr, "[CHAT]: %s\n", new_message); // Call Original Method - (*Gui_addMessage)(gui, text); + (*Gui_addMessage)(gui, std::string(new_message)); // End Recursing Gui_addMessage_recursing = false; } else { // Call Original Method - (*Gui_addMessage)(gui, text); + (*Gui_addMessage)(gui, std::string(new_message)); } + + // Free + free(new_message); } // Death Messages