]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Y2038: Use time_t for commSetConnTimeout() timeout parameter (#1492)
authorFrancesco Chemolli <5175948+kinkie@users.noreply.github.com>
Tue, 26 Sep 2023 09:56:54 +0000 (09:56 +0000)
committerSquid Anubis <squid-anubis@squid-cache.org>
Tue, 26 Sep 2023 20:19:38 +0000 (20:19 +0000)
Change commSetConnTimeout() "timeout" parameter from int to time_t, to
match the common caller type and improve Year 2038-safety on systems
with 32-bit int.

Detected by Coverity. CID 1545129: Use of 32-bit time_t (Y2K38_SAFETY).

src/comm.cc
src/comm.h
src/dns_internal.cc
src/helper.cc
src/ipc/UdsOp.cc
src/ipc/UdsOp.h
src/tests/stub_comm.cc

index f703786d157b59fca95d04dab69c95ba9f364b7d..6a86649acf796206f978791677335fe44b8d9260 100644 (file)
@@ -592,7 +592,7 @@ commUnsetFdTimeout(int fd)
 }
 
 int
-commSetConnTimeout(const Comm::ConnectionPointer &conn, int timeout, AsyncCall::Pointer &callback)
+commSetConnTimeout(const Comm::ConnectionPointer &conn, time_t timeout, AsyncCall::Pointer &callback)
 {
     debugs(5, 3, conn << " timeout " << timeout);
     assert(Comm::IsConnOpen(conn));
index abee989033a86445ba493b55cd0ad965c275e89c..70a784a29fda859498f7dac32c08f229306dfc51 100644 (file)
@@ -66,7 +66,7 @@ void commUnsetFdTimeout(int fd);
  * Set or clear the timeout for some action on an active connection.
  * API to replace commSetTimeout() when a Comm::ConnectionPointer is available.
  */
-int commSetConnTimeout(const Comm::ConnectionPointer &conn, int seconds, AsyncCall::Pointer &callback);
+int commSetConnTimeout(const Comm::ConnectionPointer &conn, time_t seconds, AsyncCall::Pointer &callback);
 int commUnsetConnTimeout(const Comm::ConnectionPointer &conn);
 
 int ignoreErrno(int);
index de3171a6e3023a35e43d902feed3260d7aca1b67..c080cf817b59bc11e0d42384e69fdb6c358411b6 100644 (file)
@@ -833,8 +833,8 @@ idnsDoSendQueryVC(nsvc *vc)
     vc->busy = 1;
 
     // Comm needs seconds but idnsCheckQueue() will check the exact timeout
-    const int timeout = (Config.Timeout.idns_query % 1000 ?
-                         Config.Timeout.idns_query + 1000 : Config.Timeout.idns_query) / 1000;
+    const auto timeout = (Config.Timeout.idns_query % 1000 ?
+                          Config.Timeout.idns_query + 1000 : Config.Timeout.idns_query) / 1000;
     AsyncCall::Pointer nil;
 
     commSetConnTimeout(vc->conn, timeout, nil);
index 000031d6c2e5b9b50b3ba011f816955ce02c0500..eed0324f1bdff8f6f6fb4ba2b638d8013be88c7a 100644 (file)
@@ -1604,8 +1604,9 @@ Helper::Session::requestTimeout(const CommTimeoutCbParams &io)
     AsyncCall::Pointer timeoutCall = commCbCall(84, 4, "Helper::Session::requestTimeout",
                                      CommTimeoutCbPtrFun(Session::requestTimeout, srv));
 
-    const int timeSpent = srv->requests.empty() ? 0 : (squid_curtime - srv->requests.front()->request.dispatch_time.tv_sec);
-    const int timeLeft = max(1, (static_cast<int>(srv->parent->timeout) - timeSpent));
+    const time_t timeSpent = srv->requests.empty() ? 0 : (squid_curtime - srv->requests.front()->request.dispatch_time.tv_sec);
+    const time_t minimumNewTimeout = 1; // second
+    const auto timeLeft = max(minimumNewTimeout, srv->parent->timeout - timeSpent);
 
     commSetConnTimeout(io.conn, timeLeft, timeoutCall);
 }
index f6e44295522e4d7618c83b53c4e5f0ae3075016e..77727822a968430fcce71ca2618318c4c636200a 100644 (file)
@@ -51,7 +51,7 @@ Ipc::UdsOp::conn()
     return conn_;
 }
 
-void Ipc::UdsOp::setTimeout(int seconds, const char *handlerName)
+void Ipc::UdsOp::setTimeout(time_t seconds, const char *handlerName)
 {
     typedef CommCbMemFunT<UdsOp, CommTimeoutCbParams> Dialer;
     AsyncCall::Pointer handler = asyncCall(54,5, handlerName,
index 27a548017fed5d4d4af939dff297cda17e09f0c3..d594b64c91fd3ca473105414d76cbba876653638 100644 (file)
@@ -42,7 +42,7 @@ protected:
     Comm::ConnectionPointer &conn(); ///< creates if needed and returns raw UDS socket descriptor
 
     /// call timedout() if no UDS messages in a given number of seconds
-    void setTimeout(int seconds, const char *handlerName);
+    void setTimeout(time_t seconds, const char *handlerName);
     void clearTimeout(); ///< remove previously set timeout, if any
 
     void setOptions(int newOptions); ///< changes socket options
@@ -92,7 +92,7 @@ private:
 private:
     TypedMsgHdr message; ///< what to send
     int retries; ///< how many times to try after a write error
-    int timeout; ///< total time to send the message
+    time_t timeout; ///< total time to send the message
     bool sleeping; ///< whether we are waiting to retry a failed write
     bool writing; ///< whether Comm started and did not finish writing
 
index a479d22ff312b504209ece31e3dca20b78cda950..f1d59cf71db7f400804e5ce66ef705ce94f33b65 100644 (file)
@@ -48,7 +48,7 @@ int comm_udp_sendto(int, const Ip::Address &, const void *, int) STUB_RETVAL(-1)
 void commCallCloseHandlers(int) STUB
 void commUnsetFdTimeout(int) STUB
 // int commSetTimeout(const Comm::ConnectionPointer &, int, AsyncCall::Pointer&) STUB_RETVAL(-1)
-int commSetConnTimeout(const Comm::ConnectionPointer &, int, AsyncCall::Pointer &) STUB_RETVAL(-1)
+int commSetConnTimeout(const Comm::ConnectionPointer &, time_t, AsyncCall::Pointer &) STUB_RETVAL(-1)
 int commUnsetConnTimeout(const Comm::ConnectionPointer &) STUB_RETVAL(-1)
 int ignoreErrno(int) STUB_RETVAL(-1)
 void commCloseAllSockets(void) STUB