Commit a204ce5b authored by Jon Olav Hauglid's avatar Jon Olav Hauglid

Bug#21770366 backport bug#21657078 to 5.5 and 5.6

Post-push fix: The problem was that condition variable
timeouts could in some cases (slow machines and/or short
timeouts) be infinite.

When the number of milliseconds to wait is computed, the
end time is computed before the now() time. This can result
in the now() time being later than the end time, leading to
negative timeout. Which after conversion to unsigned becomes
~infinite.

This patch fixes the problem by explicitly checking if we
get negative timeout and then using 0 if this is the case.
parent 1624c26d
......@@ -127,8 +127,12 @@ static DWORD get_milliseconds(const struct timespec *abstime)
if (abstime == NULL)
return INFINITE;
return (DWORD)(abstime->tv_sec * 1000 + abstime->tv_nsec / 1000000 -
my_getsystime() / 10000);
ulonglong future= abstime->tv_sec * 1000 + abstime->tv_nsec / 1000000;
ulonglong now= my_getsystime() / 10000;
/* Don't allow the timeout to be negative. */
if (future < now)
return 0;
return (DWORD)(future - now);
#endif
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment