bug-wget
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug-wget] Memory leaks when issue HEAD


From: Xin Zou
Subject: [Bug-wget] Memory leaks when issue HEAD
Date: Sun, 11 Jan 2009 17:18:31 +0800

Hi micah & devs,

I found memory leaks in wget, I have posted it on
https://savannah.gnu.org/bugs/?25298

For example
wget --no-proxy --timestamping http://www.google.com

Wget will issue HEAD first, but when returned from gethttp( in http.c), it
didn't free "char *head" allocated by "read_http_response_head (sock)". So
wget will leak at least 512bytes memory for each url.

Besides, there are several other potential memory leaks in http.c.

Below is patch
------------------------
diff -ru wget.orig/src/http.c wget/src/http.c
--- wget.orig/src/http.c        2008-12-31 12:39:03.000000000 +0800
+++ wget/src/http.c     2009-01-11 16:26:46.000000000 +0800
@@ -1885,6 +1885,9 @@
                   register_basic_auth_host (u->host);
                 }
               xfree (pth);
+              xfree_null (message);
+              resp_free (resp);
+              xfree (head);
               goto retry_with_auth;
             }
           else
@@ -1895,6 +1898,9 @@
         }
       logputs (LOG_NOTQUIET, _("Authorization failed.\n"));
       request_free (req);
+      xfree_null (message);
+      resp_free (resp);
+      xfree (head);
       return AUTHFAILED;
     }
   else /* statcode != HTTP_STATUS_UNAUTHORIZED */
@@ -1938,6 +1944,8 @@
           if (has_html_suffix_p (hs->local_file))
             *dt |= TEXTHTML;

+          xfree (head);
+          xfree_null (message);
           return RETRUNNEEDED;
         }
       else if (!ALLOW_CLOBBER)
@@ -2116,6 +2124,7 @@
           else
             CLOSE_INVALIDATE (sock);
           xfree_null (type);
+          xfree (head);
           return NEWLOCATION;
         }
     }
@@ -2171,6 +2180,7 @@
       xfree_null (type);
       CLOSE_INVALIDATE (sock);        /* would be CLOSE_FINISH, but there
                                    might be more bytes in the body. */
+      xfree (head);
       return RETRUNNEEDED;
     }
   if ((contrange != 0 && contrange != hs->restval)
@@ -2180,6 +2190,7 @@
          Bail out.  */
       xfree_null (type);
       CLOSE_INVALIDATE (sock);
+      xfree (head);
       return RANGEERR;
     }
   if (contlen == -1)
@@ -2243,6 +2254,7 @@
         CLOSE_FINISH (sock);
       else
         CLOSE_INVALIDATE (sock);
+      xfree (head);
       return RETRFINISHED;
     }

@@ -2269,6 +2281,7 @@
                          _("%s has sprung into existence.\n"),
                          hs->local_file);
               CLOSE_INVALIDATE (sock);
+              xfree (head);
               return FOPEN_EXCL_ERR;
             }
         }
@@ -2276,6 +2289,7 @@
         {
           logprintf (LOG_NOTQUIET, "%s: %s\n", hs->local_file,
strerror (errno));
           CLOSE_INVALIDATE (sock);
+          xfree (head);
           return FOPENERR;
         }
     }
@@ -2347,6 +2361,7 @@
   struct http_stat hstat;        /* HTTP status */
   struct_stat st;
   bool send_head_first = true;
+  char *file_name;

   /* Assert that no value for *LOCAL_FILE was passed. */
   assert (local_file == NULL || *local_file == NULL);
@@ -2419,10 +2434,12 @@

   /* Send preliminary HEAD request if -N is given and we have an existing
    * destination file. */
+  file_name = url_file_name (u);
   if (opt.timestamping
       && !opt.content_disposition
-      && file_exists_p (url_file_name (u)))
+      && file_exists_p (file_name))
     send_head_first = true;
+  xfree (file_name);

   /* THE loop */
   do




reply via email to

[Prev in Thread] Current Thread [Next in Thread]