]> source.dussan.org Git - tigervnc.git/commitdiff
Fix wrap-aware isAfter function in Congestion.cxx 817/head
authorLoic Prylli <lprylli@netflix.com>
Wed, 10 Apr 2019 21:25:35 +0000 (14:25 -0700)
committerLoic Prylli <lprylli@netflix.com>
Sat, 27 Apr 2019 01:56:08 +0000 (01:56 +0000)
Result of overflow on signed integer arithmetic is undefined in C/C++ standard.
So in previous version clang was compiling the statement as (int)a > (int)b (i.e. assuming no overflow), which leads to incorrect result.

Correct deterministic behavior means doing overflow arithmetic as unsigned, i.e.
 a != b && a - b <= UINT_MAX / 2

common/rfb/Congestion.cxx

index 4a784522ae64f6861737625ab3dd93b2d17f5261..f3f9ceea8eef8d1fe75935414f5a04ab80190db1 100644 (file)
@@ -70,7 +70,7 @@ static const unsigned MAXIMUM_WINDOW = 4194304;
 
 // Compare position even when wrapped around
 static inline bool isAfter(unsigned a, unsigned b) {
-  return (int)a - (int)b > 0;
+  return a != b && a - b <= UINT_MAX / 2;
 }
 
 static LogWriter vlog("Congestion");