git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 1/1] poll: use GetTickCount64() to avoid wrap-around issues

From
Steve Hoelzer via GitGitGadget <gitgitgadget@gmail.com>
Date
Oct 31, 2018, 21:11 UTC
Message-ID
<69bc5924f94b56f92d9653b3a64f721bd03f1956.1541020294.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.64.git.gitgitgadget@gmail.com>
From: Steve Hoelzer <shoelzer@gmail.com>

From Visual Studio 2015 Code Analysis: Warning C28159 Consider using 'GetTickCount64' instead of 'GetTickCount'.

Reason: GetTickCount() overflows roughly every 49 days. Code that does
not take that into account can loop indefinitely. GetTickCount64()
operates on 64 bit values and does not have that problem.
Note: this patch has been carried in Git for Windows for almost two
years, but with a fallback for Windows XP, as the GetTickCount64()
function is only available on Windows Vista and later. However, in the
meantime we require Vista or later, hence we can drop that fallback.
Signed-off-by: Steve Hoelzer <shoelzer@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 compat/poll/poll.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/compat/poll/poll.c b/compat/poll/poll.c
index ad5dcde439..4abbfcb6a4 100644
--- a/compat/poll/poll.c
+++ b/compat/poll/poll.c
@@ -18,6 +18,9 @@
    You should have received a copy of the GNU General Public License along
    with this program; if not, see <http://www.gnu.org/licenses/>.  */
 
+/* To bump the minimum Windows version to Windows Vista */
+#include "git-compat-util.h"
+
 /* Tell gcc not to warn about the (nfd < 0) tests, below.  */
 #if (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) || 4 < __GNUC__
 # pragma GCC diagnostic ignored "-Wtype-limits"
@@ -449,7 +452,8 @@ poll (struct pollfd *pfd, nfds_t nfd, int timeout)
   static HANDLE hEvent;
   WSANETWORKEVENTS ev;
   HANDLE h, handle_array[FD_SETSIZE + 2];
-  DWORD ret, wait_timeout, nhandles, start = 0, elapsed, orig_timeout = 0;
+  DWORD ret, wait_timeout, nhandles, elapsed, orig_timeout = 0;
+  ULONGLONG start = 0;
   fd_set rfds, wfds, xfds;
   BOOL poll_again;
   MSG msg;
@@ -465,7 +469,7 @@ poll (struct pollfd *pfd, nfds_t nfd, int timeout)
   if (timeout != INFTIM)
     {
       orig_timeout = timeout;
-      start = GetTickCount();
+      start = GetTickCount64();
     }
 
   if (!hEvent)
@@ -614,7 +618,7 @@ restart:
 
   if (!rc && orig_timeout && timeout != INFTIM)
     {
-      elapsed = GetTickCount() - start;
+      elapsed = (DWORD)(GetTickCount64() - start);
       timeout = elapsed >= orig_timeout ? 0 : orig_timeout - elapsed;
     }
 
-- 
gitgitgadget
Previous: Johannes Schindelin via GitGitGadgetNext: Johannes Sixt
Message 2 of 17 in “Make compat/poll safer on Windows”
  1. 0/1 Make compat/poll safer on WindowsJohannes Schindelin via GitGitGadget, Oct 31, 2018
  2. 1/1 poll: use GetTickCount64() to avoid wrap-around issuesSteve Hoelzer via GitGitGadget, Oct 31, 2018
  3. Johannes SixtNov 1, 2018
  4. Steve HoelzerNov 2, 2018
  5. Johannes SixtNov 2, 2018
  6. Steve HoelzerNov 2, 2018
  7. Junio C HamanoNov 3, 2018
  8. Junio C HamanoNov 3, 2018
  9. Carlo ArenasNov 3, 2018
  10. Johannes SixtNov 3, 2018
  11. Junio C HamanoNov 4, 2018
  12. Randall S. BeckerNov 4, 2018
  13. Eric SunshineNov 5, 2018
  14. Junio C HamanoNov 5, 2018
  15. Johannes SixtNov 5, 2018
  16. Johannes SixtNov 5, 2018
  17. Johannes SchindelinNov 5, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.