[PATCH 1/2] os: Fix buggy integer comparison.
Cyril Brulebois
kibi at debian.org
Sun Mar 6 11:39:46 PST 2011
(CARD32 can be unsigned int or unsigned long, but the following applies
to both, it's only a matter of signedness.)
Trying to compare two unsigned integers by diffing them and then casting
that into a signed quantity is wrong in one half of all cases (i.e.: the
difference is higher than maximal integer/2).
Accordingly, replace all:
(int) (foo-bar) <= 0
tests with:
foo <= bar
This is the first patch to fix the following bugs.
Debian Bug 616667 <http://bugs.debian.org/616667>
X.Org Bug 35066 <http://bugs.freedesktop.org/show_bug.cgi?id=35066>
Signed-off-by: Cyril Brulebois <kibi at debian.org>
---
os/WaitFor.c | 14 +++++++-------
1 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/os/WaitFor.c b/os/WaitFor.c
index 867cb04..d44e00b 100644
--- a/os/WaitFor.c
+++ b/os/WaitFor.c
@@ -272,10 +272,10 @@ WaitForSomething(int *pClientsReady)
{
int expired = 0;
now = GetTimeInMillis();
- if ((int) (timers->expires - now) <= 0)
+ if (timers->expires <= now)
expired = 1;
- while (timers && (int) (timers->expires - now) <= 0)
+ while (timers && (timers->expires <= now))
DoTimer(timers, now, &timers);
if (expired)
@@ -291,10 +291,10 @@ WaitForSomething(int *pClientsReady)
{
int expired = 0;
now = GetTimeInMillis();
- if ((int) (timers->expires - now) <= 0)
+ if (timers->expires <= now)
expired = 1;
- while (timers && (int) (timers->expires - now) <= 0)
+ while (timers && (timers->expires <= now))
DoTimer(timers, now, &timers);
if (expired)
@@ -466,7 +466,7 @@ TimerSet(OsTimerPtr timer, int flags, CARD32 millis,
timer->expires = millis;
timer->callback = func;
timer->arg = arg;
- if ((int) (millis - now) <= 0)
+ if (millis <= now)
{
timer->next = NULL;
millis = (*timer->callback)(timer, now, timer->arg);
@@ -474,7 +474,7 @@ TimerSet(OsTimerPtr timer, int flags, CARD32 millis,
return timer;
}
for (prev = &timers;
- *prev && (int) ((*prev)->expires - millis) <= 0;
+ *prev && ((*prev)->expires <= millis);
prev = &(*prev)->next)
;
timer->next = *prev;
@@ -530,7 +530,7 @@ TimerCheck(void)
{
CARD32 now = GetTimeInMillis();
- while (timers && (int) (timers->expires - now) <= 0)
+ while (timers && (timers->expires <= now))
DoTimer(timers, now, &timers);
}
--
1.7.4.1
More information about the xorg-devel
mailing list