Skip to content

Commit

Permalink
tls: make vlc_tls_ClientSessionCreate() cancellation-safe
Browse files Browse the repository at this point in the history
  • Loading branch information
Rémi Denis-Courmont committed Nov 9, 2015
1 parent cc80d6a commit 949032d
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 8 deletions.
3 changes: 2 additions & 1 deletion include/vlc_tls.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ struct vlc_tls
* Initiates a client TLS session.
*
* Performs client side of TLS handshake through a connected socket, and
* establishes a secure channel. This is a blocking network operation.
* establishes a secure channel. This is a blocking network operation and may
* be a thread cancellation point.
*
* @param fd socket through which to establish the secure channel
* @param hostname expected server name, used both as Server Name Indication
Expand Down
33 changes: 26 additions & 7 deletions src/network/tls.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,27 +159,44 @@ void vlc_tls_SessionDelete (vlc_tls_t *session)
vlc_object_release (session);
}

static void cleanup_tls(void *data)
{
vlc_tls_t *session = data;

vlc_tls_SessionDelete (session);
}

vlc_tls_t *vlc_tls_ClientSessionCreate (vlc_tls_creds_t *crd, int fd,
const char *host, const char *service,
const char *const *alpn, char **alp)
{
vlc_tls_t *session = vlc_tls_SessionCreate (crd, fd, host, alpn);
vlc_tls_t *session;
int canc, val;

canc = vlc_savecancel();
session = vlc_tls_SessionCreate (crd, fd, host, alpn);
if (session == NULL)
{
vlc_restorecancel(canc);
return NULL;
}

mtime_t deadline = mdate ();
deadline += var_InheritInteger (crd, "ipv4-timeout") * 1000;

struct pollfd ufd[1];
ufd[0].fd = fd;

int val;
vlc_cleanup_push (cleanup_tls, session);
while ((val = vlc_tls_SessionHandshake (session, host, service, alp)) != 0)
{
if (val < 0)
{
msg_Err (session, "TLS client session handshake error");
goto error;
error:
vlc_tls_SessionDelete (session);
session = NULL;
break;
}

mtime_t now = mdate ();
Expand All @@ -189,16 +206,18 @@ vlc_tls_t *vlc_tls_ClientSessionCreate (vlc_tls_creds_t *crd, int fd,
assert (val <= 2);
ufd[0] .events = (val == 1) ? POLLIN : POLLOUT;

if (poll (ufd, 1, (deadline - now) / 1000) == 0)
vlc_restorecancel(canc);
val = poll (ufd, 1, (deadline - now) / 1000);
canc = vlc_savecancel();
if (val == 0)
{
msg_Err (session, "TLS client session handshake timeout");
goto error;
}
}
vlc_cleanup_pop();
vlc_restorecancel(canc);
return session;
error:
vlc_tls_SessionDelete (session);
return NULL;
}

int vlc_tls_Read(vlc_tls_t *session, void *buf, size_t len, bool waitall)
Expand Down

0 comments on commit 949032d

Please sign in to comment.