summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarkvater <darkvater@openttd.org>2005-12-20 20:52:05 +0000
committerDarkvater <darkvater@openttd.org>2005-12-20 20:52:05 +0000
commit0f41b99c5e106e11708d0be478e7defb92f0a43a (patch)
treea8811c0d9f666534f8861378b0eb8b6629c5186b
parent8f873d4ece827d8f95f8ded0f49b47dbe5942506 (diff)
downloadopenttd-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.h10
-rw-r--r--network_gui.c14
-rw-r--r--network_udp.c6
-rw-r--r--string.c6
-rw-r--r--string.h16
5 files changed, 33 insertions, 19 deletions
diff --git a/macros.h b/macros.h
index 7d886fbe0..b9faad6b2 100644
--- a/macros.h
+++ b/macros.h
@@ -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));
}
diff --git a/string.c b/string.c
index ee5f1152e..18428527d 100644
--- a/string.c
+++ b/string.c
@@ -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 = '?';
+}
diff --git a/string.h b/string.h
index 1b673a8c0..cbe3881db 100644
--- a/string.h
+++ b/string.h
@@ -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 */