summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/socketengine.h6
-rw-r--r--src/inspsocket.cpp2
-rw-r--r--src/socketengine.cpp9
-rw-r--r--src/socketengine_iocp.cpp11
-rw-r--r--src/users.cpp6
5 files changed, 29 insertions, 5 deletions
diff --git a/include/socketengine.h b/include/socketengine.h
index ce701beff..112496656 100644
--- a/include/socketengine.h
+++ b/include/socketengine.h
@@ -290,6 +290,12 @@ public:
* @return The socket engine name
*/
virtual std::string GetName();
+
+ /** Returns true if the file descriptors in the
+ * given event handler are within sensible ranges
+ * which can be handled by the socket engine.
+ */
+ bool BoundsCheckFd(EventHandler* eh);
};
#endif
diff --git a/src/inspsocket.cpp b/src/inspsocket.cpp
index edb58a05c..3eddb6f62 100644
--- a/src/inspsocket.cpp
+++ b/src/inspsocket.cpp
@@ -378,6 +378,8 @@ std::string InspSocket::GetIP()
char* InspSocket::Read()
{
+ if (Instance->SE->BoundsCheckFd(this))
+ return NULL;
#ifdef WINDOWS
if ((fd < 0) || (m_internalFd > MAX_DESCRIPTORS))
#else
diff --git a/src/socketengine.cpp b/src/socketengine.cpp
index 48f7e11bf..28ba8c252 100644
--- a/src/socketengine.cpp
+++ b/src/socketengine.cpp
@@ -91,3 +91,12 @@ std::string SocketEngine::GetName()
return "misconfigured";
}
+bool SocketEngine::BoundsCheckFd(EventHandler* eh)
+{
+ if (!eh)
+ return false;
+ if ((eh->GetFd() < 0) || (eh->GetFd() > MAX_DESCRIPTORS))
+ return false;
+ return true;
+}
+
diff --git a/src/socketengine_iocp.cpp b/src/socketengine_iocp.cpp
index c61b44062..dad8b8a0a 100644
--- a/src/socketengine_iocp.cpp
+++ b/src/socketengine_iocp.cpp
@@ -420,6 +420,17 @@ bool IOCPEngine::HasFd(int fd)
return (GetRef(fd) != 0);
}
+bool IOCPEngine::BoundsCheckFd(EventHandler* eh)
+{
+ if (!eh)
+ return false;
+ if ((eh->m_internalFd < 0) || (eh->m_internalFd > MAX_DESCRIPTORS))
+ return false;
+ if ((eh->GetFd() < 0) || (eh->GetFd() > MAX_DESCRIPTORS))
+ return false;
+ return true;
+}
+
EventHandler * IOCPEngine::GetIntRef(int fd)
{
if(fd < 0 || fd > MAX_DESCRIPTORS)
diff --git a/src/users.cpp b/src/users.cpp
index 12742bbc9..efaffd2dd 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -1354,11 +1354,7 @@ const char* userrec::GetIPString(char* buf)
*/
void userrec::Write(std::string text)
{
-#ifdef WINDOWS
- if ((this->fd < 0) || (this->m_internalFd > MAX_DESCRIPTORS))
-#else
- if ((this->fd < 0) || (this->fd > MAX_DESCRIPTORS))
-#endif
+ if (ServerInstance->SE->BoundsCheckFd(this))
return;
try