[ovs-dev] [PATCH] dpif-linux: Recheck the socket pointer existence before getting its pid.

Alex Wang alexw at nicira.com
Tue Jul 8 01:20:42 UTC 2014


This commit fixes a race between port deletion and flow miss handling.
More specifically, a port could be removed while handling the flow
miss from it.  If the flow requires slow path action, the handler
thread will try querying a pid from port's sockets.  Since the port
has been deleted, the query will cause a dereference of NULL socket
pointer.

This commit makes the handler thread recheck the socket pointer before
dereferencing it.

VMware-BZ: 1251981

Reported-by: Pratap Reddy <preddy at nicira.com>
Signed-off-by: Alex Wang <alexw at nicira.com>
---
 lib/dpif-linux.c |    6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c
index 0eac3e7..b7495ce 100644
--- a/lib/dpif-linux.c
+++ b/lib/dpif-linux.c
@@ -831,7 +831,11 @@ dpif_linux_port_get_pid__(const struct dpif_linux *dpif, odp_port_t port_no,
         uint32_t idx = port_idx >= dpif->uc_array_size ? 0 : port_idx;
         struct dpif_handler *h = &dpif->handlers[hash % dpif->n_handlers];
 
-        pid = nl_sock_pid(h->channels[idx].sock);
+        /* Needs to check in case the socket pointer is changed in between
+         * of holding the locks. */
+        if (h->channels[idx].sock) {
+            pid = nl_sock_pid(h->channels[idx].sock);
+        }
     }
 
     return pid;
-- 
1.7.9.5




More information about the dev mailing list