summaryrefslogtreecommitdiff
path: root/compat
diff options
context:
space:
mode:
authorSteve Hoelzer <shoelzer@gmail.com>2018-10-31 14:11:36 -0700
committerJunio C Hamano <gitster@pobox.com>2018-11-05 13:02:42 +0900
commite8dfcace316aaaca226c2ae2d268bcc4d3131b38 (patch)
tree8baa89194ed437fdaf34c0eed80241d080afc219 /compat
parent4ede3d42dfb57f9a41ac96a1f216c62eb7566cc2 (diff)
downloadgit-e8dfcace316aaaca226c2ae2d268bcc4d3131b38.tar.gz
poll: use GetTickCount64() to avoid wrap-around issues
The value of timeout starts as an int value, and for this reason it cannot overflow unsigned long long aka ULONGLONG. The unsigned version of this initial value is available in orig_timeout. The difference (orig_timeout - elapsed) cannot wrap around because it is protected by a conditional (as can be seen in the patch text). Hence, the ULONGLONG difference can only have values that are smaller than the initial timeout value and truncation to int cannot overflow. Signed-off-by: Steve Hoelzer <shoelzer@gmail.com> [j6t: improved both implementation and log message] Signed-off-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'compat')
-rw-r--r--compat/poll/poll.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/compat/poll/poll.c b/compat/poll/poll.c
index ad5dcde439..4459408c7d 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, 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,8 +618,8 @@ restart:
if (!rc && orig_timeout && timeout != INFTIM)
{
- elapsed = GetTickCount() - start;
- timeout = elapsed >= orig_timeout ? 0 : orig_timeout - elapsed;
+ ULONGLONG elapsed = GetTickCount64() - start;
+ timeout = elapsed >= orig_timeout ? 0 : (int)(orig_timeout - elapsed);
}
if (!rc && timeout)