[vlc-commits] securetransport: Protect reading/writing with a mutex
Marvin Scholz
git at videolan.org
Fri Apr 6 11:29:13 CEST 2018
vlc/vlc-3.0 | branch: master | Marvin Scholz <epirat07 at gmail.com> | Fri Mar 23 15:59:17 2018 +0100| [e0927b4ca18829852c3ce7efac5d74ebb907d44a] | committer: Jean-Baptiste Kempf
securetransport: Protect reading/writing with a mutex
Secure Transport does not support concurrent reading and writing,
therefore this adds a mutex for reading/writing to ensure that, in case
of reading and writing happening on separate threads, they can't
happen concurrently.
Signed-off-by: Thomas Guillem <thomas at gllm.fr>
(cherry picked from commit 3c28dc60b921119da724051173a820d92ae7bf6c)
Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>
> http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=e0927b4ca18829852c3ce7efac5d74ebb907d44a
---
modules/misc/securetransport.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/modules/misc/securetransport.c b/modules/misc/securetransport.c
index 3a6acba65f..ff5d9a98c0 100644
--- a/modules/misc/securetransport.c
+++ b/modules/misc/securetransport.c
@@ -96,6 +96,8 @@ typedef struct {
bool b_blocking_send;
bool b_handshaked;
bool b_server_mode;
+
+ vlc_mutex_t lock;
} vlc_tls_st_t;
static int st_Error (vlc_tls_t *obj, int val)
@@ -455,6 +457,8 @@ static ssize_t st_Send (vlc_tls_t *session, const struct iovec *iov,
if (unlikely(count == 0))
return 0;
+ vlc_mutex_lock(&sys->lock);
+
/*
* SSLWrite does not return the number of bytes actually written to
* the socket, but the number of bytes written to the internal cache.
@@ -483,6 +487,7 @@ static ssize_t st_Send (vlc_tls_t *session, const struct iovec *iov,
sys->i_send_buffered_bytes = 0;
} else if (ret == errSSLWouldBlock) {
+ vlc_mutex_unlock(&sys->lock);
errno = againErr;
return -1;
}
@@ -494,10 +499,12 @@ static ssize_t st_Send (vlc_tls_t *session, const struct iovec *iov,
if (ret == errSSLWouldBlock) {
sys->i_send_buffered_bytes = iov->iov_len;
errno = againErr;
+ vlc_mutex_unlock(&sys->lock);
return -1;
}
}
+ vlc_mutex_unlock(&sys->lock);
return ret != noErr ? st_Error(session, ret) : actualSize;
}
@@ -511,19 +518,25 @@ static ssize_t st_Recv (vlc_tls_t *session, struct iovec *iov, unsigned count)
if (unlikely(count == 0))
return 0;
+ vlc_mutex_lock(&sys->lock);
+
size_t actualSize;
OSStatus ret = SSLRead(sys->p_context, iov->iov_base, iov->iov_len,
&actualSize);
- if (ret == errSSLWouldBlock && actualSize)
+ if (ret == errSSLWouldBlock && actualSize) {
+ vlc_mutex_unlock(&sys->lock);
return actualSize;
+ }
/* peer performed shutdown */
if (ret == errSSLClosedNoNotify || ret == errSSLClosedGraceful) {
msg_Dbg(sys->obj, "Got close notification with code %i", (int)ret);
+ vlc_mutex_unlock(&sys->lock);
return 0;
}
+ vlc_mutex_unlock(&sys->lock);
return ret != noErr ? st_Error(session, ret) : actualSize;
}
@@ -537,6 +550,8 @@ static int st_SessionShutdown (vlc_tls_t *session, bool duplex) {
msg_Dbg(sys->obj, "shutdown TLS session");
+ vlc_mutex_destroy(&sys->lock);
+
OSStatus ret = noErr;
VLC_UNUSED(duplex);
@@ -587,6 +602,7 @@ static vlc_tls_t *st_SessionOpenCommon(vlc_tls_creds_t *crd, vlc_tls_t *sock,
sys->p_context = NULL;
sys->sock = sock;
sys->b_server_mode = b_server;
+ vlc_mutex_init(&sys->lock);
sys->obj = VLC_OBJECT(crd);
vlc_tls_t *tls = &sys->tls;
More information about the vlc-commits
mailing list