Piotr Kliczewski has uploaded a new change for review.

Change subject: protocoldetecor: SSLError handled not correctly
......................................................................

protocoldetecor: SSLError handled not correctly

Whenever there was ssl issue during protocol detection the code entered
infinite loop because we haven't remove fd from pending_connections.
It is fixed by caching SSLError in processing_events loop and clean up
fd correctly.


Change-Id: I8ea5c305b19c0a7421ea74e069c3ad02d9ffd141
Signed-off-by: pkliczewski <[email protected]>
Bug-Url: https://bugzilla.redhat.com/1229859
---
M vdsm/protocoldetector.py
1 file changed, 21 insertions(+), 15 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/06/42206/1

diff --git a/vdsm/protocoldetector.py b/vdsm/protocoldetector.py
index c53f41d..6768f9c 100644
--- a/vdsm/protocoldetector.py
+++ b/vdsm/protocoldetector.py
@@ -96,15 +96,20 @@
         events = self._poller.poll(seconds * 1000)
 
         for fd, event in events:
-            if event & (select.POLLIN | select.POLLPRI):
-                if fd is self._read_fd:
-                    self._maybe_stop()
-                elif fd is self._socket.fileno():
-                    self._accept_connection()
-                else:
-                    self._handle_connection_read(fd)
-            if event & (select.POLLOUT):
-                    self._handle_connection_write(fd)
+            try:
+                if event & (select.POLLIN | select.POLLPRI):
+                    if fd is self._read_fd:
+                        self._maybe_stop()
+                    elif fd is self._socket.fileno():
+                        self._accept_connection()
+                    else:
+                        self._handle_connection_read(fd)
+                if event & (select.POLLOUT):
+                        self._handle_connection_write(fd)
+            except SSL.SSLError as e:
+                self.log.error("SSL error: %s", e)
+                _, client_socket = self._pending_connections[fd]
+                self._handle_socket_cleanup(client_socket)
 
         now = time.time()
         if now > self._next_cleanup:
@@ -115,8 +120,7 @@
         self.log.debug("Cleaning Acceptor")
 
         for _, (_, client_socket) in self._pending_connections.items():
-            self._remove_connection(client_socket)
-            client_socket.close()
+            self._handle_socket_cleanup(client_socket)
 
         self._poller.unregister(self._socket)
         self._poller.unregister(self._read_fd)
@@ -127,8 +131,7 @@
     def _cleanup_pending_connections(self):
         for _, (accepted, client_socket) in self._pending_connections.items():
             if time.time() - accepted > self.CLEANUP_INTERVAL:
-                self._remove_connection(client_socket)
-                client_socket.close()
+                self._handle_socket_cleanup(client_socket)
 
     def detect_protocol(self, data):
         for handler in self._handlers:
@@ -226,8 +229,7 @@
         except socket.error as e:
             if e.errno not in (errno.EAGAIN, errno.EWOULDBLOCK):
                 self.log.warning("Unable to read data: %s", e)
-                self._remove_connection(client_socket)
-                client_socket.close()
+                self._handle_socket_cleanup(client_socket)
             return
 
         if data is None:
@@ -246,6 +248,10 @@
                            handler.NAME, host, port)
             handler.handleSocket(client_socket, (host, port))
 
+    def _handle_socket_cleanup(self, socket):
+        self._remove_connection(socket)
+        socket.close()
+
     def _create_socket(self, host, port):
         addr = socket.getaddrinfo(host, port, socket.AF_INET,
                                   socket.SOCK_STREAM)


-- 
To view, visit https://gerrit.ovirt.org/42206
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I8ea5c305b19c0a7421ea74e069c3ad02d9ffd141
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: ovirt-3.5
Gerrit-Owner: Piotr Kliczewski <[email protected]>
_______________________________________________
vdsm-patches mailing list
[email protected]
https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches

Reply via email to