Commit 617726b6 authored by Laurent Aimar's avatar Laurent Aimar

Rework a bit http socket handling to avoid uninitialized variable access.

parent f64ef866
...@@ -2035,9 +2035,9 @@ static void httpd_HostThread( httpd_host_t *host ) ...@@ -2035,9 +2035,9 @@ static void httpd_HostThread( httpd_host_t *host )
if( ( p_tls == NULL ) && ( host->p_tls != NULL ) ) if( ( p_tls == NULL ) && ( host->p_tls != NULL ) )
p_tls = tls_ServerSessionPrepare( host->p_tls ); p_tls = tls_ServerSessionPrepare( host->p_tls );
struct pollfd ufd[host->nfd + host->i_client + host->nfd]; /* We have nfd listening sockets, i_client, and lay accept up to nfd new client */ struct pollfd ufd[host->nfd + host->i_client];
unsigned nfd; unsigned nfd;
for (nfd = 0; nfd < host->nfd; nfd++) for( nfd = 0; nfd < host->nfd; nfd++ )
{ {
ufd[nfd].fd = host->fds[nfd]; ufd[nfd].fd = host->fds[nfd];
ufd[nfd].events = POLLIN; ufd[nfd].events = POLLIN;
...@@ -2414,7 +2414,7 @@ static void httpd_HostThread( httpd_host_t *host ) ...@@ -2414,7 +2414,7 @@ static void httpd_HostThread( httpd_host_t *host )
vlc_mutex_unlock( &host->lock ); vlc_mutex_unlock( &host->lock );
/* we will wait 100ms or 20ms (not too big 'cause HTTPD_CLIENT_WAITING) */ /* we will wait 100ms or 20ms (not too big 'cause HTTPD_CLIENT_WAITING) */
switch (poll (ufd, nfd, b_low_delay ? 20 : 100)) switch( poll( ufd, nfd, b_low_delay ? 20 : 100) )
{ {
case -1: case -1:
if (errno != EINTR) if (errno != EINTR)
...@@ -2427,29 +2427,73 @@ static void httpd_HostThread( httpd_host_t *host ) ...@@ -2427,29 +2427,73 @@ static void httpd_HostThread( httpd_host_t *host )
continue; continue;
} }
/* Handle client sockets */
vlc_mutex_lock( &host->lock );
now = mdate(); now = mdate();
for( int i_client = 0; i_client < host->i_client; i_client++ )
{
httpd_client_t *cl = host->client[i_client];
const struct pollfd *pufd = &ufd[host->nfd + i_client];
assert( pufd < &ufd[sizeof(ufd) / sizeof(ufd[0])] );
if( cl->fd != pufd->fd )
continue; // we were not waiting for this client
if( pufd->revents == 0 )
continue; // no event received
cl->i_activity_date = now;
if( cl->i_state == HTTPD_CLIENT_RECEIVING )
{
httpd_ClientRecv( cl );
}
else if( cl->i_state == HTTPD_CLIENT_SENDING )
{
httpd_ClientSend( cl );
}
else if( cl->i_state == HTTPD_CLIENT_TLS_HS_IN )
{
httpd_ClientTlsHsIn( cl );
}
else if( cl->i_state == HTTPD_CLIENT_TLS_HS_OUT )
{
httpd_ClientTlsHsOut( cl );
}
if( cl->i_mode == HTTPD_CLIENT_BIDIR &&
cl->i_state == HTTPD_CLIENT_SENDING &&
(pufd->revents & POLLIN) )
{
cl->b_read_waiting = VLC_TRUE;
}
}
vlc_mutex_unlock( &host->lock );
/* accept new connections */ /* Handle server sockets (accept new connections) */
for (nfd = 0; nfd < host->nfd; nfd++) for( nfd = 0; nfd < host->nfd; nfd++ )
{ {
httpd_client_t *cl;
int fd;
int i_state = -1;
assert (ufd[nfd].fd == host->fds[nfd]); assert (ufd[nfd].fd == host->fds[nfd]);
if (ufd[nfd].revents == 0) if( ufd[nfd].revents == 0 )
continue; continue;
int fd = net_Accept (host, host->fds, 0); /* */
if (fd == -1) fd = net_Accept( host, host->fds, 0 );
if( fd < 0 )
continue; continue;
int i_state = 0; if( p_tls != NULL )
if (p_tls != NULL)
{ {
switch (tls_ServerSessionHandshake (p_tls, fd)) switch( tls_ServerSessionHandshake( p_tls, fd ) )
{ {
case -1: case -1:
msg_Err( host, "Rejecting TLS connection" ); msg_Err( host, "Rejecting TLS connection" );
net_Close (fd); net_Close( fd );
fd = -1; fd = -1;
p_tls = NULL; p_tls = NULL;
break; break;
...@@ -2463,11 +2507,10 @@ static void httpd_HostThread( httpd_host_t *host ) ...@@ -2463,11 +2507,10 @@ static void httpd_HostThread( httpd_host_t *host )
break; break;
} }
if ((p_tls == NULL) != (host->p_tls == NULL)) if( (p_tls == NULL) != (host->p_tls == NULL) )
break; // wasted TLS session, cannot accept() anymore break; // wasted TLS session, cannot accept() anymore
} }
httpd_client_t *cl;
stats_UpdateInteger( host, host->p_total_counter, 1, NULL ); stats_UpdateInteger( host, host->p_total_counter, 1, NULL );
stats_UpdateInteger( host, host->p_active_counter, 1, NULL ); stats_UpdateInteger( host, host->p_active_counter, 1, NULL );
cl = httpd_ClientNew( fd, p_tls, now ); cl = httpd_ClientNew( fd, p_tls, now );
...@@ -2475,56 +2518,13 @@ static void httpd_HostThread( httpd_host_t *host ) ...@@ -2475,56 +2518,13 @@ static void httpd_HostThread( httpd_host_t *host )
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 );
cl->i_state = i_state; // override state for TLS if( i_state != -1 )
cl->i_state = i_state; // override state for TLS
if (host->p_tls != NULL) if (host->p_tls != NULL)
break; // cannot accept further without new TLS session break; // cannot accept further without new TLS session
} }
/* now try all others socket */
vlc_mutex_lock( &host->lock );
for( int i_client = 0; i_client < host->i_client; i_client++ )
{
httpd_client_t *cl = host->client[i_client];
const struct pollfd *pufd = ufd + nfd;
assert (pufd < ufd + (sizeof (ufd) / sizeof (ufd[0])));
if (cl->fd != pufd->fd)
continue; // we were not waiting for this client
nfd++;
if (pufd->revents == 0)
continue; // no event received
cl->i_activity_date = now;
if( cl->i_state == HTTPD_CLIENT_RECEIVING )
{
httpd_ClientRecv( cl );
}
else if( cl->i_state == HTTPD_CLIENT_SENDING )
{
httpd_ClientSend( cl );
}
else if( cl->i_state == HTTPD_CLIENT_TLS_HS_IN )
{
httpd_ClientTlsHsIn( cl );
}
else if( cl->i_state == HTTPD_CLIENT_TLS_HS_OUT )
{
httpd_ClientTlsHsOut( cl );
}
if( cl->i_mode == HTTPD_CLIENT_BIDIR &&
cl->i_state == HTTPD_CLIENT_SENDING &&
(pufd->revents & POLLIN) )
{
cl->b_read_waiting = VLC_TRUE;
}
}
vlc_mutex_unlock( &host->lock );
} }
if( p_tls != NULL ) if( p_tls != NULL )
......
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