From: Razvan Becheriu Date: Thu, 20 Nov 2025 06:02:26 +0000 (+0200) Subject: [#4141] added no limit test X-Git-Tag: Kea-3.1.4~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=518d8d954048d20e6618bb17c111ff5c63910d3b;p=thirdparty%2Fkea.git [#4141] added no limit test --- diff --git a/src/lib/util/select_event_handler.cc b/src/lib/util/select_event_handler.cc index 13f4377822..b5e15cc0f7 100644 --- a/src/lib/util/select_event_handler.cc +++ b/src/lib/util/select_event_handler.cc @@ -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; diff --git a/src/lib/util/select_event_handler.h b/src/lib/util/select_event_handler.h index d0cfe8f872..7ccb82f045 100644 --- a/src/lib/util/select_event_handler.h +++ b/src/lib/util/select_event_handler.h @@ -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(); diff --git a/src/lib/util/tests/fd_event_handler_factory_unittests.cc b/src/lib/util/tests/fd_event_handler_factory_unittests.cc index 63f4d6f6ff..4b335fa250 100644 --- a/src/lib/util/tests/fd_event_handler_factory_unittests.cc +++ b/src/lib/util/tests/fd_event_handler_factory_unittests.cc @@ -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)); } diff --git a/src/lib/util/tests/fd_event_handler_unittests.h b/src/lib/util/tests/fd_event_handler_unittests.h index 9de3d59ad5..54d4b11931 100644 --- a/src/lib/util/tests/fd_event_handler_unittests.h +++ b/src/lib/util/tests/fd_event_handler_unittests.h @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -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 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