From: Pauli Nieminen <ext-pauli.niemi...@nokia.com>

Handler pointer is set to NULL when it was deleted while inside handler
calls. Too bad deletion loop tried to find first not NULL pointer which
incorrectly removed wrong handlers from the list.

That resulted to NULL pointer call when sending syntetic mouse events
with delay.

8  0x00000000 in ?? ()
9  0x00025d7c in WakeupHandler (result=0, pReadmask=0x1c4d48)
    at ../../dix/dixutils.c:435
10 0x0005c9bc in WaitForSomething (pClientsReady=<value optimized out>)

Fixes: NB# 220574 - xorg crash with xtst

Signed-off-by: Pauli Nieminen <ext-pauli.niemi...@nokia.com>
---
 dix/dixutils.c |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/dix/dixutils.c b/dix/dixutils.c
index 7db31ff..2b90d58 100644
--- a/dix/dixutils.c
+++ b/dix/dixutils.c
@@ -405,16 +405,16 @@ BlockHandler(pointer pTimeout, pointer pReadmask)
                block.handlers[block.index].blockData, pTimeout, pReadmask);
     if (block.deleted)
     {
-       for (i = 0; !block.handlers[i].BlockHandler; i++) {
+       for (i = 0; block.handlers[i].BlockHandler; i++) {
        }
 
        for (j = i + 1; j < block.num; j++) {
-           if (block.handlers[j].BlockHandler)
+           if (!block.handlers[j].BlockHandler)
                continue;
            block.handlers[i] = block.handlers[j];
            i++;
        }
-       block.num = i + 1;
+       block.num = i;
        block.deleted = FALSE;
     }
     --block.inHandler;
@@ -440,16 +440,16 @@ WakeupHandler(int result, pointer pReadmask)
                                result, pReadmask);
     if (wakeup.deleted)
     {
-       for (i = 0; !wakeup.handlers[i].WakeupHandler; i++) {
+       for (i = 0; wakeup.handlers[i].WakeupHandler; i++) {
        }
 
        for (j = i + 1; j < wakeup.num; j++) {
-           if (wakeup.handlers[j].WakeupHandler)
+           if (!wakeup.handlers[j].WakeupHandler)
                continue;
            wakeup.handlers[i] = wakeup.handlers[j];
            i++;
        }
-       wakeup.num =  i + 1;
+       wakeup.num =  i;
        wakeup.deleted = FALSE;
     }
     --wakeup.inHandler;
-- 
1.7.0.4

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to