]> git.sesse.net Git - vlc/commitdiff
* modules/access/http.c: don't crash, but complain on non http/1.x streams.
authorGildas Bazin <gbazin@videolan.org>
Thu, 7 Nov 2002 16:54:39 +0000 (16:54 +0000)
committerGildas Bazin <gbazin@videolan.org>
Thu, 7 Nov 2002 16:54:39 +0000 (16:54 +0000)
modules/access/http.c

index a4f07e6b00ff994a35e353a307d5f67dc668040e..197ececd5ad86287d2bf6c197939dd8ca0128854 100644 (file)
@@ -2,7 +2,7 @@
  * http.c: HTTP access plug-in
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: http.c,v 1.5 2002/10/07 21:58:40 massiot Exp $
+ * $Id: http.c,v 1.6 2002/11/07 16:54:39 gbazin Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -96,7 +96,7 @@ static int HTTPConnect( input_thread_t * p_input, off_t i_tell )
     module_t *          p_network;
     char                psz_buffer[256];
     byte_t *            psz_parser;
-    int                 i_returncode, i;
+    int                 i_returncode, i, i_size;
     char *              psz_return_alpha;
 
     /* Find an appropriate network module */
@@ -160,24 +160,33 @@ static int HTTPConnect( input_thread_t * p_input, off_t i_tell )
 #define MAX_LINE 1024
 
     /* get the returncode */
-    if( input_Peek( p_input, &psz_parser, MAX_LINE ) <= 0 )
+    if( (i_size = input_Peek( p_input, &psz_parser, MAX_LINE )) <= 0 )
     {
         msg_Err( p_input, "not enough data" );
         input_FDNetworkClose( p_input );
         return( -1 );
     }
 
-    if( !strncmp( psz_parser, "HTTP/1.",
-                  strlen("HTTP/1.") ) )
+    if( (i_size >= sizeof("HTTP/1.") + 1 ) &&
+       !strncmp( psz_parser, "HTTP/1.", sizeof("HTTP/1.") - 1 ) )
     {
-        psz_parser += strlen("HTTP 1.") + 2;
+        psz_parser += sizeof("HTTP/1.") + 1;
         i_returncode = atoi( (char*)psz_parser );
         msg_Dbg( p_input, "HTTP server replied: %i", i_returncode );
         psz_parser += 4;
-        for ( i = 0; psz_parser[i] != '\r' || psz_parser[i+1] != '\n'; i++ )
+       i_size -= (sizeof("HTTP/1.") + 5);
+        for ( i = 0; (i < i_size -1) && ((psz_parser[i] != '\r') ||
+             (psz_parser[i+1] != '\n')); i++ )
         {
             ;
         }
+        /* check we actually parsed something */
+        if ( (i == i_size - 1) && (psz_parser[i+1] != '\n') )
+        {
+            msg_Err( p_input, "stream not compliant with HTTP/1.x" );
+            return -1;
+        }
+
         psz_return_alpha = malloc( i + 1 );
         memcpy( psz_return_alpha, psz_parser, i );
         psz_return_alpha[i] = '\0';
@@ -187,7 +196,7 @@ static int HTTPConnect( input_thread_t * p_input, off_t i_tell )
         msg_Err( p_input, "invalid http reply" );
         return -1;
     }
-    
+
     if ( i_returncode >= 400 ) /* something is wrong */
     {
         msg_Err( p_input, "%i %s", i_returncode,