[vlc-commits] tls: poll and timeout during handshake (fixes #7533)

Rémi Denis-Courmont git at videolan.org
Sun Sep 30 17:32:57 CEST 2012


vlc/vlc-2.0 | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Sep 30 18:18:37 2012 +0300| [b0255011ce7d06f323c63b85242b0fae39c39a50] | committer: Rémi Denis-Courmont

tls: poll and timeout during handshake (fixes #7533)

(cherry picked from commit 2f66c69631cc461ac8619d1f14561fd13a59dc08)

Conflicts:
	src/network/tls.c

> http://git.videolan.org/gitweb.cgi/vlc/vlc-2.0.git/?a=commit;h=b0255011ce7d06f323c63b85242b0fae39c39a50
---

 src/network/tls.c |   31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/src/network/tls.c b/src/network/tls.c
index 93892aa..db723af 100644
--- a/src/network/tls.c
+++ b/src/network/tls.c
@@ -30,6 +30,11 @@
 # include "config.h"
 #endif
 
+#ifdef HAVE_POLL
+# include <poll.h>
+#endif
+#include <assert.h>
+
 #include <vlc_common.h>
 #include "libvlc.h"
 
@@ -181,11 +186,29 @@ vlc_tls_ClientCreate (vlc_object_t *obj, int fd, const char *hostname)
         return NULL;
     }
 
-    /* TODO: do this directly in the TLS plugin */
+    mtime_t deadline = mdate ();
+    deadline += var_InheritInteger (obj, "ipv4-timeout") * 1000;
+
+    struct pollfd ufd[1];
+    ufd[0].fd = fd;
+
     int val;
-    do
-        val = cl->handshake (cl);
-    while (val > 0);
+    while ((val = cl->handshake (cl)) > 0)
+    {
+        mtime_t now = mdate ();
+        if (now > deadline)
+           now = deadline;
+
+        assert (val <= 2);
+        ufd[0] .events = (val == 1) ? POLLIN : POLLOUT;
+
+        if (poll (ufd, 1, (deadline - now) / 1000) == 0)
+        {
+            msg_Err (cl, "TLS client session handshake timeout");
+            val = -1;
+            break;
+        }
+    }
 
     if (val != 0)
     {



More information about the vlc-commits mailing list