[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kwin
Subject:    KDE/kdelibs/kdeui/windowmanagement
From:       Christoph Feck <christoph () maxiom ! de>
Date:       2009-07-21 12:13:23
Message-ID: 1248178403.110504.21666.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1000474 by cfeck:

Fix reentrancy problem in NETRootInfo::update

See http://lists.kde.org/?l=kwin&m=124791974016062&w=2
Reviewed by Luboš Luňák

BUG: 170519
CCMAIL: kwin@kde.org


 M  +15 -6     netwm.cpp  


--- trunk/KDE/kdelibs/kdeui/windowmanagement/netwm.cpp #1000473:1000474
@@ -2108,6 +2108,9 @@
     }
 
     if (dirty & ClientList) {
+        QList<Window> clientsToRemove;
+        QList<Window> clientsToAdd;
+
         bool read_ok = false;
 	if (XGetWindowProperty(p->display, p->root, net_client_list,
 			       0l, MAX_PROP_SIZE, False, XA_WINDOW, &type_ret,
@@ -2126,16 +2129,16 @@
 
 			while (old_index < old_count || new_index < new_count) {
 			    if (old_index == old_count) {
-				addClient(wins[new_index++]);
+				clientsToAdd.append(wins[new_index++]);
 			    } else if (new_index == new_count) {
-				removeClient(p->clients[old_index++]);
+				clientsToRemove.append(p->clients[old_index++]);
 			    } else {
 				if (p->clients[old_index] <
 				    wins[new_index]) {
-				    removeClient(p->clients[old_index++]);
+				    clientsToRemove.append(p->clients[old_index++]);
 				} else if (wins[new_index] <
 					   p->clients[old_index]) {
-				    addClient(wins[new_index++]);
+				    clientsToAdd.append(wins[new_index++]);
 				} else {
 				    new_index++;
 				    old_index++;
@@ -2152,7 +2155,7 @@
 
 		    unsigned long n;
 		    for (n = 0; n < nitems_ret; n++) {
-			addClient(wins[n]);
+			clientsToAdd.append(wins[n]);
 		    }
 		}
 
@@ -2166,7 +2169,7 @@
 	}
         if( !read_ok ) {
             for( unsigned int i = 0; i < p->clients_count; ++ i )
-	        removeClient(p->clients[i]);
+	        clientsToRemove.append(p->clients[i]);
             p->clients_count = 0;
             delete[] p->clients;
             p->clients = NULL;
@@ -2176,6 +2179,12 @@
 	fprintf(stderr, "NETRootInfo::update: client list updated (%ld clients)\n",
 		p->clients_count);
 #endif
+        for (int i = 0; i < clientsToRemove.size(); ++i) {
+            removeClient(clientsToRemove.at(i));
+        }
+        for (int i = 0; i < clientsToAdd.size(); ++i) {
+            addClient(clientsToAdd.at(i));
+        }
     }
 
     if (dirty & ClientListStacking) {
_______________________________________________
kwin mailing list
kwin@kde.org
https://mail.kde.org/mailman/listinfo/kwin

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic