[ovs-dev] [PATCH] poll-loop: Fix a bug while finding a poll node.

Gurucharan Shetty shettyg at nicira.com
Wed Sep 30 21:18:47 UTC 2015


When a poll_node is created, it gets either a 'fd' or
a 'wevent' (can't get both). When the poll_node is
searched for previous creations on that 'fd' or 'wevent',
the search criteria was wrong for Windows. In Windows,
when a 'fd' is received in poll_create_node, we create a
corresponding 'wevent'. So while searching for that 'fd',
we should not look for 'wevent' in the hmap_node.

Reported-by: Alin Gabriel Serdean <aserdean at cloudbasesolutions.com>
Signed-off-by: Gurucharan Shetty <gshetty at nicira.com>
---
 lib/poll-loop.c |    8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/lib/poll-loop.c b/lib/poll-loop.c
index 3c4b55c..60e1f6e 100644
--- a/lib/poll-loop.c
+++ b/lib/poll-loop.c
@@ -57,16 +57,20 @@ struct poll_loop {
 
 static struct poll_loop *poll_loop(void);
 
-/* Look up the node with same fd and wevent. */
+/* Look up the node with same fd or wevent. */
 static struct poll_node *
 find_poll_node(struct poll_loop *loop, int fd, HANDLE wevent)
 {
     struct poll_node *node;
 
+    /* Both 'fd' and 'wevent' cannot be set. */
+    ovs_assert(!fd != !wevent);
+
     HMAP_FOR_EACH_WITH_HASH (node, hmap_node,
                              hash_2words(fd, (uint32_t)wevent),
                              &loop->poll_nodes) {
-        if (node->pollfd.fd == fd && node->wevent == wevent) {
+        if ((fd && node->pollfd.fd == fd)
+            || (wevent && node->wevent == wevent)) {
             return node;
         }
     }
-- 
1.7.9.5




More information about the dev mailing list