[vlc-devel] [PATCH 1/2] securetransport: Protect reading/writing with a mutex

Marvin Scholz epirat07 at gmail.com
Fri Mar 23 15:59:03 CET 2018


Please ignore this, git send-email did a bit unexpected thing here, 
sorry.

On 23 Mar 2018, at 15:58, Marvin Scholz wrote:

> 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.
> ---
>  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 74d4b9cdc7..fcd5e8bc72 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)
> @@ -449,6 +451,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.
> @@ -477,6 +481,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;
>          }
> @@ -488,10 +493,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;
>  }
>
> @@ -505,19 +512,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;
>  }
>
> @@ -531,6 +544,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);
>
> @@ -581,6 +596,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;
> -- 
> 2.14.3 (Apple Git-98)


More information about the vlc-devel mailing list