Commit 9c8d0bf2 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Merge tls_ServerSessionPrepare() and tls_SessionHandshake()

parent e424248a
...@@ -67,10 +67,9 @@ void tls_ServerDelete (tls_server_t *); ...@@ -67,10 +67,9 @@ void tls_ServerDelete (tls_server_t *);
int tls_ServerAddCA (tls_server_t *srv, const char *path); int tls_ServerAddCA (tls_server_t *srv, const char *path);
int tls_ServerAddCRL (tls_server_t *srv, const char *path); int tls_ServerAddCRL (tls_server_t *srv, const char *path);
tls_session_t *tls_ServerSessionPrepare (tls_server_t *); tls_session_t *tls_ServerSessionCreate (tls_server_t *, int fd);
int tls_ServerSessionHandshake (tls_session_t *, int fd); int tls_ServerSessionHandshake (tls_session_t *);
int tls_SessionContinueHandshake (tls_session_t *); void tls_ServerSessionDelete (tls_session_t *);
void tls_ServerSessionClose (tls_session_t *);
VLC_API tls_session_t * tls_ClientCreate( vlc_object_t *, int, const char * ); VLC_API tls_session_t * tls_ClientCreate( vlc_object_t *, int, const char * );
VLC_API void tls_ClientDelete( tls_session_t * ); VLC_API void tls_ClientDelete( tls_session_t * );
......
...@@ -1429,7 +1429,7 @@ static void httpd_ClientClean( httpd_client_t *cl ) ...@@ -1429,7 +1429,7 @@ static void httpd_ClientClean( httpd_client_t *cl )
if( cl->fd >= 0 ) if( cl->fd >= 0 )
{ {
if( cl->p_tls != NULL ) if( cl->p_tls != NULL )
tls_ServerSessionClose( cl->p_tls ); tls_ServerSessionDelete( cl->p_tls );
net_Close( cl->fd ); net_Close( cl->fd );
cl->fd = -1; cl->fd = -1;
} }
...@@ -2015,7 +2015,7 @@ static void httpd_ClientSend( httpd_client_t *cl ) ...@@ -2015,7 +2015,7 @@ static void httpd_ClientSend( httpd_client_t *cl )
static void httpd_ClientTlsHsIn( httpd_client_t *cl ) static void httpd_ClientTlsHsIn( httpd_client_t *cl )
{ {
switch( tls_SessionContinueHandshake( cl->p_tls ) ) switch( tls_ServerSessionHandshake( cl->p_tls ) )
{ {
case 0: case 0:
cl->i_state = HTTPD_CLIENT_RECEIVING; cl->i_state = HTTPD_CLIENT_RECEIVING;
...@@ -2033,7 +2033,7 @@ static void httpd_ClientTlsHsIn( httpd_client_t *cl ) ...@@ -2033,7 +2033,7 @@ static void httpd_ClientTlsHsIn( httpd_client_t *cl )
static void httpd_ClientTlsHsOut( httpd_client_t *cl ) static void httpd_ClientTlsHsOut( httpd_client_t *cl )
{ {
switch( tls_SessionContinueHandshake( cl->p_tls ) ) switch( tls_ServerSessionHandshake( cl->p_tls ) )
{ {
case 0: case 0:
cl->i_state = HTTPD_CLIENT_RECEIVING; cl->i_state = HTTPD_CLIENT_RECEIVING;
...@@ -2053,17 +2053,12 @@ static void httpd_ClientTlsHsOut( httpd_client_t *cl ) ...@@ -2053,17 +2053,12 @@ static void httpd_ClientTlsHsOut( httpd_client_t *cl )
static void* httpd_HostThread( void *data ) static void* httpd_HostThread( void *data )
{ {
httpd_host_t *host = data; httpd_host_t *host = data;
tls_session_t *p_tls = NULL;
counter_t *p_total_counter = stats_CounterCreate( host, VLC_VAR_INTEGER, STATS_COUNTER ); counter_t *p_total_counter = stats_CounterCreate( host, VLC_VAR_INTEGER, STATS_COUNTER );
counter_t *p_active_counter = stats_CounterCreate( host, VLC_VAR_INTEGER, STATS_COUNTER ); counter_t *p_active_counter = stats_CounterCreate( host, VLC_VAR_INTEGER, STATS_COUNTER );
int evfd = vlc_object_waitpipe( VLC_OBJECT( host ) ); int evfd = vlc_object_waitpipe( VLC_OBJECT( host ) );
for( ;; ) for( ;; )
{ {
/* prepare a new TLS session */
if( ( p_tls == NULL ) && ( host->p_tls != NULL ) )
p_tls = tls_ServerSessionPrepare( host->p_tls );
struct pollfd ufd[host->nfd + host->i_client + 1]; struct pollfd ufd[host->nfd + host->i_client + 1];
unsigned nfd; unsigned nfd;
for( nfd = 0; nfd < host->nfd; nfd++ ) for( nfd = 0; nfd < host->nfd; nfd++ )
...@@ -2538,16 +2533,20 @@ static void* httpd_HostThread( void *data ) ...@@ -2538,16 +2533,20 @@ static void* httpd_HostThread( void *data )
setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, setsockopt (fd, SOL_SOCKET, SO_REUSEADDR,
&(int){ 1 }, sizeof(int)); &(int){ 1 }, sizeof(int));
if( p_tls != NULL ) tls_session_t *p_tls;
if( host->p_tls != NULL )
{ {
switch( tls_ServerSessionHandshake( p_tls, fd ) ) p_tls = tls_ServerSessionCreate( host->p_tls, fd );
switch( tls_ServerSessionHandshake( p_tls ) )
{ {
case -1: case -1:
msg_Err( host, "Rejecting TLS connection" ); msg_Err( host, "Rejecting TLS connection" );
/* p_tls is destroyed implicitly */
net_Close( fd ); net_Close( fd );
fd = -1; fd = -1;
p_tls = NULL; p_tls = NULL;
break; continue;
case 1: /* missing input - most likely */ case 1: /* missing input - most likely */
i_state = HTTPD_CLIENT_TLS_HS_IN; i_state = HTTPD_CLIENT_TLS_HS_IN;
...@@ -2557,29 +2556,22 @@ static void* httpd_HostThread( void *data ) ...@@ -2557,29 +2556,22 @@ static void* httpd_HostThread( void *data )
i_state = HTTPD_CLIENT_TLS_HS_OUT; i_state = HTTPD_CLIENT_TLS_HS_OUT;
break; break;
} }
if( (p_tls == NULL) != (host->p_tls == NULL) )
break; // wasted TLS session, cannot accept() anymore
} }
else
p_tls = NULL;
stats_UpdateInteger( host, p_total_counter, 1, NULL ); stats_UpdateInteger( host, p_total_counter, 1, NULL );
stats_UpdateInteger( host, p_active_counter, 1, NULL ); stats_UpdateInteger( host, p_active_counter, 1, NULL );
cl = httpd_ClientNew( fd, p_tls, now ); cl = httpd_ClientNew( fd, p_tls, now );
p_tls = NULL;
vlc_mutex_lock( &host->lock ); vlc_mutex_lock( &host->lock );
TAB_APPEND( host->i_client, host->client, cl ); TAB_APPEND( host->i_client, host->client, cl );
vlc_mutex_unlock( &host->lock ); vlc_mutex_unlock( &host->lock );
if( i_state != -1 ) if( i_state != -1 )
cl->i_state = i_state; // override state for TLS cl->i_state = i_state; // override state for TLS
if (host->p_tls != NULL)
break; // cannot accept further without new TLS session
} }
} }
if( p_tls != NULL )
tls_ServerSessionClose( p_tls );
if( p_total_counter ) if( p_total_counter )
stats_CounterClean( p_total_counter ); stats_CounterClean( p_total_counter );
if( p_active_counter ) if( p_active_counter )
......
...@@ -115,31 +115,27 @@ int tls_ServerAddCRL (tls_server_t *srv, const char *path) ...@@ -115,31 +115,27 @@ int tls_ServerAddCRL (tls_server_t *srv, const char *path)
} }
tls_session_t *tls_ServerSessionPrepare (tls_server_t *srv) tls_session_t *tls_ServerSessionCreate (tls_server_t *srv, int fd)
{ {
return srv->pf_open (srv); tls_session_t *ses = srv->pf_open (srv);
if (ses != NULL)
ses->pf_set_fd (ses, fd);
return ses;
} }
void tls_ServerSessionClose (tls_session_t *ses) void tls_ServerSessionDelete (tls_session_t *ses)
{ {
tls_server_t *srv = (tls_server_t *)(ses->p_parent); tls_server_t *srv = (tls_server_t *)(ses->p_parent);
srv->pf_close (srv, ses); srv->pf_close (srv, ses);
} }
int tls_ServerSessionHandshake (tls_session_t *ses, int fd) int tls_ServerSessionHandshake (tls_session_t *ses)
{
ses->pf_set_fd (ses, fd);
return 2;
}
int tls_SessionContinueHandshake (tls_session_t *ses)
{ {
int val = ses->pf_handshake (ses); int val = ses->pf_handshake (ses);
if (val < 0) if (val < 0)
tls_ServerSessionClose (ses); tls_ServerSessionDelete (ses);
return val; return val;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment