From: Pierre Ossman Date: Fri, 26 Oct 2018 13:54:00 +0000 (+0200) Subject: Change idle timeout to timer X-Git-Tag: v1.9.90~65^2~1 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=65e08fdc9d783a863b0d0b0acb62c9f3a6b49d63;p=tigervnc.git Change idle timeout to timer Get this timeout in to the timer system as well to make things simpler and more robust. --- diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx index 7b261e74..8758362c 100644 --- a/common/rfb/VNCSConnectionST.cxx +++ b/common/rfb/VNCSConnectionST.cxx @@ -51,15 +51,23 @@ VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s, fenceDataLen(0), fenceData(NULL), congestionTimer(this), losslessTimer(this), server(server_), updates(false), updateRenderedCursor(false), removeRenderedCursor(false), - continuousUpdates(false), encodeManager(this), pointerEventTime(0), - clientHasCursor(false) + continuousUpdates(false), encodeManager(this), idleTimer(this), + pointerEventTime(0), clientHasCursor(false) { setStreams(&sock->inStream(), &sock->outStream()); peerEndpoint.buf = sock->getPeerEndpoint(); // Configure the socket setSocketTimeouts(); - lastEventTime = time(0); + + // Kick off the idle timer + if (rfb::Server::idleTimeout) { + // minimum of 15 seconds while authenticating + if (rfb::Server::idleTimeout < 15) + idleTimer.start(secsToMillis(15)); + else + idleTimer.start(secsToMillis(rfb::Server::idleTimeout)); + } } @@ -312,36 +320,6 @@ void VNCSConnectionST::setLEDStateOrClose(unsigned int state) } -int VNCSConnectionST::checkIdleTimeout() -{ - int idleTimeout = rfb::Server::idleTimeout; - if (idleTimeout == 0) return 0; - if (state() != RFBSTATE_NORMAL && idleTimeout < 15) - idleTimeout = 15; // minimum of 15 seconds while authenticating - time_t now = time(0); - if (now < lastEventTime) { - // Someone must have set the time backwards. Set lastEventTime so that the - // idleTimeout will count from now. - vlog.info("Time has gone backwards - resetting idle timeout"); - lastEventTime = now; - } - int timeLeft = lastEventTime + idleTimeout - now; - if (timeLeft < -60) { - // Our callback is over a minute late - someone must have set the time - // forwards. Set lastEventTime so that the idleTimeout will count from - // now. - vlog.info("Time has gone forwards - resetting idle timeout"); - lastEventTime = now; - return secsToMillis(idleTimeout); - } - if (timeLeft <= 0) { - close("Idle timeout"); - return 0; - } - return secsToMillis(timeLeft); -} - - bool VNCSConnectionST::getComparerState() { // We interpret a low compression level as an indication that the client @@ -412,7 +390,8 @@ void VNCSConnectionST::approveConnectionOrClose(bool accept, void VNCSConnectionST::authSuccess() { - lastEventTime = time(0); + if (rfb::Server::idleTimeout) + idleTimer.start(secsToMillis(rfb::Server::idleTimeout)); // - Set the connection parameters appropriately cp.width = server->getPixelBuffer()->width(); @@ -438,7 +417,8 @@ void VNCSConnectionST::queryConnection(const char* userName) void VNCSConnectionST::clientInit(bool shared) { - lastEventTime = time(0); + if (rfb::Server::idleTimeout) + idleTimer.start(secsToMillis(rfb::Server::idleTimeout)); if (rfb::Server::alwaysShared || reverseConnection) shared = true; if (!accessCheck(AccessNonShared)) shared = true; if (rfb::Server::neverShared) shared = false; @@ -457,7 +437,9 @@ void VNCSConnectionST::setPixelFormat(const PixelFormat& pf) void VNCSConnectionST::pointerEvent(const Point& pos, int buttonMask) { - pointerEventTime = lastEventTime = time(0); + if (rfb::Server::idleTimeout) + idleTimer.start(secsToMillis(rfb::Server::idleTimeout)); + pointerEventTime = time(0); if (!accessCheck(AccessPtrEvents)) return; if (!rfb::Server::acceptPointerEvents) return; pointerEventPos = pos; @@ -489,7 +471,8 @@ public: void VNCSConnectionST::keyEvent(rdr::U32 keysym, rdr::U32 keycode, bool down) { rdr::U32 lookup; - lastEventTime = time(0); + if (rfb::Server::idleTimeout) + idleTimer.start(secsToMillis(rfb::Server::idleTimeout)); if (!accessCheck(AccessKeyEvents)) return; if (!rfb::Server::acceptKeyEvents) return; @@ -765,6 +748,9 @@ bool VNCSConnectionST::handleTimeout(Timer* t) close(e.str()); } + if (t == &idleTimer) + close("Idle timeout"); + return false; } @@ -1106,7 +1092,6 @@ void VNCSConnectionST::setLEDState(unsigned int ledstate) void VNCSConnectionST::setSocketTimeouts() { int timeoutms = rfb::Server::clientWaitTimeMillis; - soonestTimeout(&timeoutms, secsToMillis(rfb::Server::idleTimeout)); if (timeoutms == 0) timeoutms = -1; sock->inStream().setTimeout(timeoutms); diff --git a/common/rfb/VNCSConnectionST.h b/common/rfb/VNCSConnectionST.h index 1b7d59ac..c992d145 100644 --- a/common/rfb/VNCSConnectionST.h +++ b/common/rfb/VNCSConnectionST.h @@ -77,11 +77,6 @@ namespace rfb { void setLEDStateOrClose(unsigned int state); void approveConnectionOrClose(bool accept, const char* reason); - // checkIdleTimeout() returns the number of milliseconds left until the - // idle timeout expires. If it has expired, the connection is closed and - // zero is returned. Zero is also returned if there is no idle timeout. - int checkIdleTimeout(); - // The following methods never throw exceptions // getComparerState() returns if this client would like the framebuffer @@ -182,7 +177,8 @@ namespace rfb { std::map pressedKeys; - time_t lastEventTime; + Timer idleTimer; + time_t pointerEventTime; Point pointerEventPos; bool clientHasCursor; diff --git a/common/rfb/VNCServerST.cxx b/common/rfb/VNCServerST.cxx index 601e6367..c6734458 100644 --- a/common/rfb/VNCServerST.cxx +++ b/common/rfb/VNCServerST.cxx @@ -227,14 +227,8 @@ void VNCServerST::processSocketWriteEvent(network::Socket* sock) int VNCServerST::checkTimeouts() { int timeout = 0; - std::list::iterator ci, ci_next; soonestTimeout(&timeout, Timer::checkTimeouts()); - - for (ci=clients.begin();ci!=clients.end();ci=ci_next) { - ci_next = ci; ci_next++; - soonestTimeout(&timeout, (*ci)->checkIdleTimeout()); - } return timeout; }