diff options
author | Darkvater <darkvater@openttd.org> | 2005-12-20 20:52:05 +0000 |
---|---|---|
committer | Darkvater <darkvater@openttd.org> | 2005-12-20 20:52:05 +0000 |
commit | 0f41b99c5e106e11708d0be478e7defb92f0a43a (patch) | |
tree | a8811c0d9f666534f8861378b0eb8b6629c5186b | |
parent | 8f873d4ece827d8f95f8ded0f49b47dbe5942506 (diff) | |
download | openttd-0f41b99c5e106e11708d0be478e7defb92f0a43a.tar.xz |
(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
-rw-r--r-- | macros.h | 10 | ||||
-rw-r--r-- | network_gui.c | 14 | ||||
-rw-r--r-- | network_udp.c | 6 | ||||
-rw-r--r-- | string.c | 6 | ||||
-rw-r--r-- | string.h | 16 |
5 files changed, 33 insertions, 19 deletions
@@ -164,14 +164,4 @@ static inline void swap_tile(TileIndex *a, TileIndex *b) { TileIndex t = *a; *a */ #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 */ diff --git a/network_gui.c b/network_gui.c index 8da59c644..5c755dbd2 100644 --- a/network_gui.c +++ b/network_gui.c @@ -179,16 +179,12 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e) 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 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e) 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; diff --git a/network_udp.c b/network_udp.c index a24e8da7d..28e5a0301 100644 --- a/network_udp.c +++ b/network_udp.c @@ -119,6 +119,12 @@ DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_SERVER_RESPONSE) 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)); } @@ -57,3 +57,9 @@ char* CDECL str_fmt(const char* str, ...) if (p != NULL) memcpy(p, buf, len + 1); return p; } + +void str_validate(char *str) +{ + for (; *str != '\0'; str++) + if (!IsValidAsciiChar(*str)) *str = '?'; +} @@ -25,4 +25,20 @@ char* strecpy(char* dst, const char* src, const char* last); 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 */ |