]> git.sesse.net Git - vlc/commitdiff
win32: fix gnutls access
authorRafaël Carré <funman@videolan.org>
Sat, 19 Nov 2011 01:57:44 +0000 (20:57 -0500)
committerRafaël Carré <funman@videolan.org>
Wed, 23 Nov 2011 18:44:22 +0000 (13:44 -0500)
reading failed with EAGAIN but this error was not catched properly

Signed-off-by: Rafaël Carré <funman@videolan.org>
src/network/io.c

index 8f92852a44875e1c80a3a5a97cf0f60f71e59bc3..6011cec4a3e1e9d8310be632ff744f7967b7bf47 100644 (file)
@@ -310,16 +310,29 @@ net_Read (vlc_object_t *restrict p_this, int fd, const v_socket_t *vs,
         assert (ufd[0].revents);
 
         ssize_t n;
+#if defined(WIN32) || defined(UNDER_CE)
+        int error;
+#endif
         if (vs != NULL)
         {
             int canc = vlc_savecancel ();
             n = vs->pf_recv (vs->p_sys, p_buf, i_buflen);
+#if defined(WIN32) || defined(UNDER_CE)
+            /* We must read last error immediately, because vlc_restorecancel()
+             * access thread local storage, and TlsGetValue() will call
+             * SetLastError() to indicate that the function succeeded, thus
+             * overwriting the error code coming from pf_recv().
+             * WSAGetLastError is just an alias for GetLastError these days.
+             */
+            error = WSAGetLastError();
+#endif
             vlc_restorecancel (canc);
         }
         else
         {
 #ifdef WIN32
             n = recv (fd, p_buf, i_buflen, 0);
+            error = WSAGetLastError();
 #else
             n = read (fd, p_buf, i_buflen);
 #endif
@@ -328,7 +341,7 @@ net_Read (vlc_object_t *restrict p_this, int fd, const v_socket_t *vs,
         if (n == -1)
         {
 #if defined(WIN32) || defined(UNDER_CE)
-            switch (WSAGetLastError ())
+            switch (error)
             {
                 case WSAEWOULDBLOCK:
                 case WSAEINTR: