]> git.sesse.net Git - vlc/blobdiff - src/network/httpd.c
correct realloc() usage, on failure realloc will return NULL
[vlc] / src / network / httpd.c
index c55077ffd64c651df72c54471a08d03423ec9fbc..39493bdc182acd8982e0823cd98cdd4189245ccf 100644 (file)
@@ -95,6 +95,7 @@ struct httpd_host_t
     int         *fds;
     unsigned     nfd;
 
+    vlc_thread_t thread;
     vlc_mutex_t lock;
     vlc_cond_t  wait;
 
@@ -365,7 +366,7 @@ static size_t httpd_HtmlError (char **body, int code, const char *url)
         "<a href=\"http://www.videolan.org\">VideoLAN</a>\n"
         "</body>\n"
         "</html>\n", errname, code, errname,
-        (url ? " (" : ""), (url ?: ""), (url ? ")" : ""));
+        (url ? " (" : ""), (url ? url : ""), (url ? ")" : ""));
 
     if (res == -1)
     {
@@ -560,9 +561,14 @@ httpd_HandlerCallBack( httpd_callback_sys_t *p_sys, httpd_client_t *cl,
 
         if( p != NULL )
         {
+            httpd_message_t *p_msg;
             p[4] = '\0';
-            answer->i_body = strlen((char*)answer->p_body) + 1;
-            answer->p_body = realloc( answer->p_body, answer->i_body );
+            p_msg = realloc( answer->p_body, strlen((char*)answer->p_body) + 1 );
+            if( p_msg )
+            {
+                answer->i_body = strlen((char*)answer->p_body) + 1;
+                answer->p_body = p_msg;
+            }
         }
     }
 
@@ -963,7 +969,7 @@ void httpd_StreamDelete( httpd_stream_t *stream )
 /*****************************************************************************
  * Low level
  *****************************************************************************/
-static void* httpd_HostThread( vlc_object_t * );
+static void* httpd_HostThread( void * );
 
 /* create a new host */
 httpd_host_t *httpd_HostNew( vlc_object_t *p_this, const char *psz_host,
@@ -974,6 +980,7 @@ httpd_host_t *httpd_HostNew( vlc_object_t *p_this, const char *psz_host,
 }
 
 static const char psz_object_type[] = "http server";
+static vlc_mutex_t httpd_mutex = VLC_STATIC_MUTEX;
 
 httpd_host_t *httpd_TLSHostNew( vlc_object_t *p_this, const char *psz_hostname,
                                 int i_port,
@@ -984,7 +991,7 @@ httpd_host_t *httpd_TLSHostNew( vlc_object_t *p_this, const char *psz_hostname,
     httpd_host_t *host;
     tls_server_t *p_tls;
     char *psz_host;
-    vlc_value_t  lockval, ptrval;
+    vlc_value_t  ptrval;
     int i;
 
     if( psz_hostname == NULL )
@@ -995,9 +1002,7 @@ httpd_host_t *httpd_TLSHostNew( vlc_object_t *p_this, const char *psz_hostname,
         return NULL;
 
     /* to be sure to avoid multiple creation */
-    var_Create( p_this->p_libvlc, "httpd_mutex", VLC_VAR_MUTEX );
-    var_Get( p_this->p_libvlc, "httpd_mutex", &lockval );
-    vlc_mutex_lock( lockval.p_address );
+    vlc_mutex_lock( &httpd_mutex );
     httpd = libvlc_priv (p_this->p_libvlc)->p_httpd;
 
     if( httpd == NULL )
@@ -1008,7 +1013,7 @@ httpd_host_t *httpd_TLSHostNew( vlc_object_t *p_this, const char *psz_hostname,
                                               psz_object_type );
         if( httpd == NULL )
         {
-            vlc_mutex_unlock( lockval.p_address );
+            vlc_mutex_unlock( &httpd_mutex );
             free( psz_host );
             return NULL;
         }
@@ -1018,7 +1023,6 @@ httpd_host_t *httpd_TLSHostNew( vlc_object_t *p_this, const char *psz_hostname,
 
         ptrval.p_address = httpd;
         libvlc_priv (p_this->p_libvlc)->p_httpd = httpd;
-        vlc_object_hold( httpd );
         vlc_object_attach( httpd, p_this->p_libvlc );
     }
 
@@ -1041,7 +1045,7 @@ httpd_host_t *httpd_TLSHostNew( vlc_object_t *p_this, const char *psz_hostname,
         host->i_ref++;
         vlc_mutex_unlock( &host->lock );
 
-        vlc_mutex_unlock( lockval.p_address );
+        vlc_mutex_unlock( &httpd_mutex );
         return host;
     }
 
@@ -1109,8 +1113,8 @@ httpd_host_t *httpd_TLSHostNew( vlc_object_t *p_this, const char *psz_hostname,
     host->p_tls = p_tls;
 
     /* create the thread */
-    if( vlc_thread_create( host, "httpd host thread", httpd_HostThread,
-                           VLC_THREAD_PRIORITY_LOW ) )
+    if( vlc_clone( &host->thread, httpd_HostThread, host,
+                   VLC_THREAD_PRIORITY_LOW ) )
     {
         msg_Err( p_this, "cannot spawn http host thread" );
         goto error;
@@ -1118,7 +1122,7 @@ httpd_host_t *httpd_TLSHostNew( vlc_object_t *p_this, const char *psz_hostname,
 
     /* now add it to httpd */
     TAB_APPEND( httpd->i_host, httpd->host, host );
-    vlc_mutex_unlock( lockval.p_address );
+    vlc_mutex_unlock( &httpd_mutex );
 
     return host;
 
@@ -1127,11 +1131,10 @@ error:
     if( httpd->i_host <= 0 )
     {
         libvlc_priv (httpd->p_libvlc)->p_httpd = NULL;
-        vlc_object_release( httpd );
         vlc_object_detach( httpd );
         vlc_object_release( httpd );
     }
-    vlc_mutex_unlock( lockval.p_address );
+    vlc_mutex_unlock( &httpd_mutex );
 
     if( host != NULL )
     {
@@ -1151,11 +1154,9 @@ error:
 void httpd_HostDelete( httpd_host_t *host )
 {
     httpd_t *httpd = host->httpd;
-    vlc_value_t lockval;
     int i;
 
-    var_Get( httpd->p_libvlc, "httpd_mutex", &lockval );
-    vlc_mutex_lock( lockval.p_address );
+    vlc_mutex_lock( &httpd_mutex );
 
     vlc_mutex_lock( &host->lock );
     host->i_ref--;
@@ -1165,14 +1166,14 @@ void httpd_HostDelete( httpd_host_t *host )
     if( host->i_ref > 0 )
     {
         /* still used */
-        vlc_mutex_unlock( lockval.p_address );
-        msg_Dbg( host, "httpd_HostDelete: host still used" );
+        vlc_mutex_unlock( &httpd_mutex );
+        msg_Dbg( host, "httpd_HostDelete: host still in use" );
         return;
     }
     TAB_REMOVE( httpd->i_host, httpd->host, host );
 
     vlc_object_kill( host );
-    vlc_thread_join( host );
+    vlc_join( host->thread, NULL );
 
     msg_Dbg( host, "HTTP host removed" );
 
@@ -1201,17 +1202,15 @@ void httpd_HostDelete( httpd_host_t *host )
     vlc_mutex_destroy( &host->lock );
     vlc_object_release( host );
 
-    vlc_object_release( httpd );
     if( httpd->i_host <= 0 )
     {
-        msg_Dbg( httpd, "no host left, stopping httpd" );
+        msg_Dbg( httpd, "no hosts left, stopping httpd" );
 
         libvlc_priv (httpd->p_libvlc)->p_httpd = NULL;
         vlc_object_detach( httpd );
         vlc_object_release( httpd );
-
     }
-    vlc_mutex_unlock( lockval.p_address );
+    vlc_mutex_unlock( &httpd_mutex );
 }
 
 /* register a new url */
@@ -2037,13 +2036,12 @@ static void httpd_ClientTlsHsOut( httpd_client_t *cl )
     }
 }
 
-static void* httpd_HostThread( vlc_object_t *p_this )
+static void* httpd_HostThread( void *data )
 {
-    httpd_host_t *host = (httpd_host_t *)p_this;
+    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_active_counter = stats_CounterCreate( host, VLC_VAR_INTEGER, STATS_COUNTER );
-    int canc = vlc_savecancel ();
     int evfd = vlc_object_waitpipe( VLC_OBJECT( host ) );
 
     for( ;; )
@@ -2572,6 +2570,5 @@ static void* httpd_HostThread( vlc_object_t *p_this )
         stats_CounterClean( p_total_counter );
     if( p_active_counter )
         stats_CounterClean( p_active_counter );
-    vlc_restorecancel (canc);
     return NULL;
 }