Don't attempt to read more than content-length amount of data

Hrvoje Niksic <[email protected]> Tue, 09 Aug 2005 00:50:48 +0200
Newsgroups gmane.comp.web.wget.patches
Message-ID <[email protected]>
This patch fixes the bug described at http://tinyurl.com/8tv59/, in
pretty much the manner described there.  Since it makes the
"kill_longer" wgetrc command unnecessary, it is removed as well.

I will apply the corresponding fix on the 1.10 branch as well.


2005-08-09  Hrvoje Niksic  <[email protected]>

	* http.c (gethttp): Don't read more than the amount of data
	specified by the content-length header.

Index: src/options.h
===================================================================
--- src/options.h	(revision 2008)
+++ src/options.h	(working copy)
@@ -35,9 +35,6 @@
   int ntry;			/* Number of tries per URL */
   bool retry_connrefused;	/* Treat CONNREFUSED as non-fatal. */
   bool background;		/* Whether we should work in background. */
-  bool kill_longer;		/* Do we reject messages with *more*
-				   data than specified in
-				   content-length? */
   bool ignore_length;		/* Do we heed content-length at all?  */
   bool recursive;		/* Are we recursive? */
   bool spanhost;			/* Do we span across hosts in
Index: src/init.c
===================================================================
--- src/init.c	(revision 2009)
+++ src/init.c	(working copy)
@@ -173,7 +173,6 @@
 #endif
   { "input",		&opt.input_filename,	cmd_file },
   { "keepsessioncookies", &opt.keep_session_cookies, cmd_boolean },
-  { "killlonger",	&opt.kill_longer,	cmd_boolean },
   { "limitrate",	&opt.limit_rate,	cmd_bytes },
   { "loadcookies",	&opt.cookies_input,	cmd_file },
   { "logfile",		&opt.lfilename,		cmd_file },
Index: src/http.c
===================================================================
--- src/http.c	(revision 2008)
+++ src/http.c	(working copy)
@@ -1950,7 +1950,10 @@
 
   /* Download the request body.  */
   flags = 0;
-  if (keep_alive)
+  if (contlen != -1)
+    /* If content-length is present, read that much; otherwise, read
+       until EOF.  The HTTP spec doesn't require the server to
+       actually close the connection when it's done sending data. */
     flags |= rb_read_exactly;
   if (hs->restval > 0 && contrange == 0)
     /* If the server ignored our range request, instruct fd_read_body
@@ -2352,9 +2355,7 @@
       if ((tmr != (time_t) (-1))
 	  && !opt.spider
 	  && ((hstat.len == hstat.contlen) ||
-	      ((hstat.res == 0) &&
-	       ((hstat.contlen == -1) ||
-		(hstat.len >= hstat.contlen && !opt.kill_longer)))))
+	      ((hstat.res == 0) && (hstat.contlen == -1))))
 	{
 	  /* #### This code repeats in http.c and ftp.c.  Move it to a
              function!  */
@@ -2450,43 +2451,10 @@
 	      free_hstat (&hstat);
 	      continue;
 	    }
-	  else if (!opt.kill_longer) /* meaning we got more than expected */
-	    {
-	      logprintf (LOG_VERBOSE,
-			 _("%s (%s) - `%s' saved [%s/%s]\n\n"),
-			 tms, tmrate, locf,
-			 number_to_static_string (hstat.len),
-			 number_to_static_string (hstat.contlen));
-	      logprintf (LOG_NONVERBOSE,
-			 "%s URL:%s [%s/%s] -> \"%s\" [%d]\n",
-			 tms, u->url,
-			 number_to_static_string (hstat.len),
-			 number_to_static_string (hstat.contlen),
-			 locf, count);
-	      ++opt.numurls;
-	      total_downloaded_bytes += hstat.len;
-
-	      /* Remember that we downloaded the file for later ".orig" code. */
-	      if (*dt & ADDED_HTML_EXTENSION)
-		downloaded_file(FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, locf);
-	      else
-		downloaded_file(FILE_DOWNLOADED_NORMALLY, locf);
-	      
-	      free_hstat (&hstat);
-	      xfree_null (dummy);
-	      return RETROK;
-	    }
-	  else			/* the same, but not accepted */
-	    {
-	      logprintf (LOG_VERBOSE,
-			 _("%s (%s) - Connection closed at byte %s/%s. "),
-			 tms, tmrate,
-			 number_to_static_string (hstat.len),
-			 number_to_static_string (hstat.contlen));
-	      printwhat (count, opt.ntry);
-	      free_hstat (&hstat);
-	      continue;
-	    }
+	  else
+	    /* Getting here would mean reading more data than
+	       requested with content-length, which we never do.  */
+	    abort ();
 	}
       else			/* now hstat.res can only be -1 */
 	{
Index: doc/wget.texi
===================================================================
--- doc/wget.texi	(revision 2008)
+++ doc/wget.texi	(working copy)
@@ -2664,12 +2664,6 @@
 @item input = @var{file}
 Read the @sc{url}s from @var{string}, like @samp{-i @var{file}}.
 
-@item kill_longer = on/off
-Consider data longer than specified in content-length header as invalid
-(and retry getting it).  The default behavior is to save as much data
-as there is, provided there is more than or equal to the value in
-@code{Content-Length}.
-
 @item limit_rate = @var{rate}
 Limit the download speed to no more than @var{rate} bytes per second.
 The same as @samp{--limit-rate=@var{rate}}.