Mercurial > hg > openttd
changeset 2775:8cb018056ea2 draft
(svn r3322) - Fix: Network window crash when it receives invalid information for example from the integrated nightly, so validate the network-input when it is received
- CodeChange: added str_validate(char *str) function that checks if a string contains only printable characters and if not, replaces those characters by question marks. Also move IsValidAsciiChar() to string.h
author | Darkvater <Darkvater@openttd.org> |
---|---|
date | Tue, 20 Dec 2005 20:52:05 +0000 |
parents | 4f08dd288731 |
children | 826fe21572de |
files | macros.h network_gui.c network_udp.c string.c string.h |
diffstat | 5 files changed, 33 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/macros.h +++ b/macros.h @@ -164,14 +164,4 @@ */ #define ALIGN(x, n) (((x) + (n) - 1) & ~((n) - 1)) -/* IS_INT_INSIDE = filter for ascii-function codes like BELL and so on [we need an special filter here later] */ -static inline bool IsValidAsciiChar(byte key) -{ - // XXX This filter stops certain crashes, but may be too restrictive. - return IS_INT_INSIDE(key, ' ', 127) || - (IS_INT_INSIDE(key, 160, 256) && - key != 0xAA && key != 0xAC && key != 0xAD && key != 0xAF && - key != 0xB5 && key != 0xB6 && key != 0xB7 && key != 0xB9); -} - #endif /* MACROS_H */
--- a/network_gui.c +++ b/network_gui.c @@ -179,16 +179,12 @@ DrawString(260, y, STR_NETWORK_CLIENTS, 2); // clients on the server / maximum slots y += 10; - if (sel->info.server_lang < NETWORK_NUM_LANGUAGES) { - SetDParam(0, STR_NETWORK_LANG_ANY + sel->info.server_lang); - DrawString(260, y, STR_NETWORK_LANGUAGE, 2); // server language - } + SetDParam(0, STR_NETWORK_LANG_ANY + sel->info.server_lang); + DrawString(260, y, STR_NETWORK_LANGUAGE, 2); // server language y += 10; - if (sel->info.map_set < NUM_LANDSCAPE ) { - SetDParam(0, STR_TEMPERATE_LANDSCAPE + sel->info.map_set); - DrawString(260, y, STR_NETWORK_TILESET, 2); // tileset - } + SetDParam(0, STR_TEMPERATE_LANDSCAPE + sel->info.map_set); + DrawString(260, y, STR_NETWORK_TILESET, 2); // tileset y += 10; SetDParam(0, sel->info.map_width); @@ -231,7 +227,7 @@ case WE_CLICK: _selected_field = e->click.widget; - switch(e->click.widget) { + switch (e->click.widget) { case 0: case 14: /* Close 'X' | Cancel button */ DeleteWindowById(WC_NETWORK_WINDOW, 0); break;
--- a/network_udp.c +++ b/network_udp.c @@ -119,6 +119,12 @@ item->info.map_set = NetworkRecv_uint8(&_udp_cs, p); item->info.dedicated = NetworkRecv_uint8(&_udp_cs, p); + str_validate(item->info.server_name); + str_validate(item->info.server_revision); + str_validate(item->info.map_name); + if (item->info.server_lang >= NETWORK_NUM_LANGUAGES) item->info.server_lang = 0; + if (item->info.map_set >= NUM_LANDSCAPE ) item->info.map_set = 0; + if (item->info.hostname[0] == '\0') snprintf(item->info.hostname, sizeof(item->info.hostname), "%s", inet_ntoa(client_addr->sin_addr)); }
--- a/string.c +++ b/string.c @@ -57,3 +57,9 @@ if (p != NULL) memcpy(p, buf, len + 1); return p; } + +void str_validate(char *str) +{ + for (; *str != '\0'; str++) + if (!IsValidAsciiChar(*str)) *str = '?'; +}
--- a/string.h +++ b/string.h @@ -25,4 +25,20 @@ char* CDECL str_fmt(const char* str, ...); +/** Scans the string for valid characters and if it finds invalid ones, + * replaces them with a question mark '?' */ +void str_validate(char *str); + +/** Only allow valid ascii-function codes. Filter special codes like BELL and + * so on [we need a special filter here later] + * @param key character to be checked + * @return true or false depending if the character is printable/valid or not */ +static inline bool IsValidAsciiChar(byte key) +{ + // XXX This filter stops certain crashes, but may be too restrictive. + return (key >= ' ' && key < 127) || (key >= 160 && + key != 0xAA && key != 0xAC && key != 0xAD && key != 0xAF && + key != 0xB5 && key != 0xB6 && key != 0xB7 && key != 0xB9); +} + #endif /* STRING_H */