]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#4141] added no limit test
authorRazvan Becheriu <razvan@isc.org>
Thu, 20 Nov 2025 06:02:26 +0000 (08:02 +0200)
committerRazvan Becheriu <razvan@isc.org>
Fri, 21 Nov 2025 13:02:43 +0000 (13:02 +0000)
src/lib/util/select_event_handler.cc
src/lib/util/select_event_handler.h
src/lib/util/tests/fd_event_handler_factory_unittests.cc
src/lib/util/tests/fd_event_handler_unittests.h

index 13f4377822ab40535e81cc31f46f4fc5393e4239..b5e15cc0f706a33d74c2d9b3df4a7e9fa6a0bab7 100644 (file)
@@ -60,9 +60,19 @@ int SelectEventHandler::waitEvent(uint32_t timeout_sec, uint32_t timeout_usec /*
 }
 
 bool SelectEventHandler::readReady(int fd) {
+    if (fd >= FD_SETSIZE) {
+        isc_throw(BadValue, "invalid value for fd exceeds maximum allowed " << FD_SETSIZE);
+    }
     return (FD_ISSET(fd, &read_fd_set_data_));
 }
 
+bool SelectEventHandler::hasError(int fd) {
+    if (fd >= FD_SETSIZE) {
+        isc_throw(BadValue, "invalid value for fd exceeds maximum allowed " << FD_SETSIZE);
+    }
+    return (false);
+}
+
 void SelectEventHandler::clear() {
     FD_ZERO(&read_fd_set_);
     max_fd_ = 0;
index d0cfe8f872f18e892553ab6da95e6f4c1999f269..7ccb82f0450c20a6ad0325edfc7542738f5c02c6 100644 (file)
@@ -47,6 +47,13 @@ public:
     /// @return True if file descriptor is ready for reading.
     bool readReady(int fd);
 
+    /// @brief Check if file descriptor has error.
+    ///
+    /// @param fd The file descriptor.
+    ///
+    /// @return True if file descriptor has error.
+    virtual bool hasError(int fd);
+
     /// @brief Clear registered file descriptors.
     void clear();
 
index 63f4d6f6ff15a6a4a5fa39431f094f539ba411ba..4b335fa25026f654be8876a5e6f1891e4b8366f1 100644 (file)
@@ -23,6 +23,8 @@ TEST(FDEventHandlerFactory, factory) {
     FDEventHandlerPtr handler = FDEventHandlerFactory::factoryFDEventHandler();
     if (handler->type() == FDEventHandler::TYPE_SELECT) {
         EXPECT_THROW(handler->add(FD_SETSIZE), BadValue);
+        EXPECT_THROW(handler->readReady(FD_SETSIZE), BadValue);
+        EXPECT_THROW(handler->hasError(FD_SETSIZE), BadValue);
     } else {
         EXPECT_NO_THROW(handler->add(FD_SETSIZE));
     }
index 9de3d59ad554488b585a341082156724bc42e2de..54d4b11931e3ea4d0c0f6ade65ed97ba99936057 100644 (file)
@@ -20,6 +20,7 @@
 #include <gtest/gtest.h>
 
 #include <thread>
+#include <vector>
 
 #include <fcntl.h>
 #include <signal.h>
@@ -27,6 +28,7 @@
 
 using namespace isc;
 using namespace isc::util;
+using namespace std;
 
 const unsigned char MARKER = 0;
 
@@ -397,4 +399,34 @@ TEST_F(FDEventHandlerTest, hup) {
     pipe(pipe_fd_);
 }
 
+TEST_F(FDEventHandlerTest, noLimit) {
+    if (handler_->type() != FDEventHandler::TYPE_SELECT) {
+        vector<int> fds;
+        const size_t limit = 2  * FD_SETSIZE;
+        int result;
+        for (size_t i = 0; i < limit; ++i) {
+            int pipe_fd[2];
+            result = pipe(pipe_fd);
+            if (result < 0) {
+                for (size_t j = 0; j < fds.size(); ++j) {
+                    close(fds[j]);
+                }
+                ASSERT_GT(result, 0);
+            }
+            fds.push_back(pipe_fd[0]);
+            EXPECT_EQ(sizeof(i), write(pipe_fd[1], &i, sizeof(i)));
+            fds.push_back(pipe_fd[1]);
+            EXPECT_NO_THROW(handler_->add(pipe_fd[0]));
+        }
+        EXPECT_EQ(limit, handler_->waitEvent(0, 1000));
+        for (size_t i = 0; i < fds.size(); i += 2) {
+            size_t data = 0;
+            EXPECT_EQ(sizeof(i), read(fds[i], &data, sizeof(data)));
+            EXPECT_EQ(data, i / 2);
+            close(fds[i]);
+            close(fds[i + 1]);
+        }
+    }
+}
+
 } // end of anonymous namespace