summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2008-12-28 21:07:45 +0000
committerrubidium <rubidium@openttd.org>2008-12-28 21:07:45 +0000
commite626e07bd3083bc876b3cd309a2d58f78cf90bd5 (patch)
treecaa9a1b5f5ce4b37fab3bb77b97803d5b6e3494e
parentee952b10d96675a2c20b03d8d7d0fe1cfcecc01b (diff)
downloadopenttd-e626e07bd3083bc876b3cd309a2d58f78cf90bd5.tar.xz
(svn r14759) -Fix (r14730): tab completion causing out-of-bounds read.
-rw-r--r--src/network/core/tcp.h2
-rw-r--r--src/network/network_chat_gui.cpp14
2 files changed, 9 insertions, 7 deletions
diff --git a/src/network/core/tcp.h b/src/network/core/tcp.h
index 06d382f6c..84863ca2f 100644
--- a/src/network/core/tcp.h
+++ b/src/network/core/tcp.h
@@ -127,7 +127,7 @@ static inline bool IsValidNetworkClientSocketIndex(ClientIndex index)
return (uint)index < GetNetworkClientSocketPoolSize() && GetNetworkClientSocket(index)->IsValid();
}
-#define FOR_ALL_CLIENT_SOCKETS_FROM(d, start) for (d = (start < GetNetworkClientSocketPoolSize() ? GetNetworkClientSocket(start) : NULL); d != NULL; d = (d->index + 1U < GetNetworkClientSocketPoolSize()) ? GetNetworkClientSocket(d->index + 1U) : NULL) if (d->IsValid())
+#define FOR_ALL_CLIENT_SOCKETS_FROM(d, start) for (d = GetNetworkClientSocket(start); d != NULL; d = (d->index + 1U < GetNetworkClientSocketPoolSize()) ? GetNetworkClientSocket(d->index + 1U) : NULL) if (d->IsValid())
#define FOR_ALL_CLIENT_SOCKETS(d) FOR_ALL_CLIENT_SOCKETS_FROM(d, 0)
typedef NetworkClientSocket NetworkTCPSocketHandler;
diff --git a/src/network/network_chat_gui.cpp b/src/network/network_chat_gui.cpp
index 4f4447779..43505cf75 100644
--- a/src/network/network_chat_gui.cpp
+++ b/src/network/network_chat_gui.cpp
@@ -300,12 +300,14 @@ struct NetworkChatWindow : public QueryStringBaseWindow {
/* First, try clients */
if (*item < MAX_CLIENT_SLOTS) {
- /* Skip inactive clients */
- NetworkClientInfo *ci;
- FOR_ALL_CLIENT_INFOS_FROM(ci, *item + 1) break;
- if (ci != NULL) {
- *item = ci->index;
- return ci->client_name;
+ if (*item + 1 < GetNetworkClientInfoPoolSize()) {
+ /* Skip inactive clients */
+ NetworkClientInfo *ci;
+ FOR_ALL_CLIENT_INFOS_FROM(ci, *item + 1) break;
+ if (ci != NULL) {
+ *item = ci->index;
+ return ci->client_name;
+ }
}
*item = MAX_CLIENT_SLOTS;
}