]> sjero.net Git - wget/commitdiff
fix segfault in ftp.c (ftp_loop_internal)
authorTim Ruehsen <tim.ruehsen@gmx.de>
Wed, 19 Jun 2013 08:02:20 +0000 (10:02 +0200)
committerGiuseppe Scrivano <gscrivano@gnu.org>
Sat, 22 Jun 2013 11:22:24 +0000 (13:22 +0200)
src/ChangeLog
src/connect.c
src/ftp.c

index 4021d9cc86de8cdcee776371044cd212d34e1470..4299ac5c5ae5fd36093f16a1c54c9f75ed57d8e7 100644 (file)
@@ -1,3 +1,9 @@
+2013-06-19  Tim Ruehsen  <tim.ruehsen@gmx.de>
+
+       * connect.c (socket_ip_address): zero out ip address structure to
+       avoid access to uninitialized values by inet_ntop().
+       * ftp.c (ftp_loop_internal): fix segfault caused by warc_tmp NULL pointer.
+
 2013-05-21  Ray Satiro  <raysatiro@yahoo.com>
 
        * url.c (url_file_name): Use MAX_PATH in Windows.
index 6d7cc97594158fc49e0a7e3ee968f35d979b9cf7..bfb079b78b544b242ae68302edd18a2db093fcbb 100644 (file)
@@ -559,6 +559,7 @@ socket_ip_address (int sock, ip_address *ip, int endpoint)
   if (ret < 0)
     return false;
 
+  memset(ip, 0, sizeof(ip_address));
   ip->family = sockaddr->sa_family;
   switch (sockaddr->sa_family)
     {
index 0ad4b326b820e8aea3e7c8f6742ce881ce8b23fb..9b3d81c85f3cfdb11ca7fefd2d14ec6459a24f6b 100644 (file)
--- a/src/ftp.c
+++ b/src/ftp.c
@@ -1449,21 +1449,6 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con, char **local_fi
 
   orig_lp = con->cmd & LEAVE_PENDING ? 1 : 0;
 
-  /* For file RETR requests, we can write a WARC record.
-     We record the file contents to a temporary file. */
-  if (warc_enabled && (con->cmd & DO_RETR))
-    {
-      warc_tmp = warc_tempfile ();
-      if (warc_tmp == NULL)
-        return WARC_TMP_FOPENERR;
-
-      if (!con->proxy && con->csock != -1)
-        {
-          warc_ip = (ip_address *) alloca (sizeof (ip_address));
-          socket_ip_address (con->csock, warc_ip, ENDPOINT_PEER);
-        }
-    }
-
   /* THE loop.  */
   do
     {
@@ -1491,6 +1476,21 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con, char **local_fi
             con->cmd |= DO_CWD;
         }
 
+      /* For file RETR requests, we can write a WARC record.
+         We record the file contents to a temporary file. */
+      if (warc_enabled && (con->cmd & DO_RETR) && warc_tmp == NULL)
+        {
+          warc_tmp = warc_tempfile ();
+          if (warc_tmp == NULL)
+            return WARC_TMP_FOPENERR;
+
+          if (!con->proxy && con->csock != -1)
+            {
+              warc_ip = (ip_address *) alloca (sizeof (ip_address));
+              socket_ip_address (con->csock, warc_ip, ENDPOINT_PEER);
+            }
+        }
+
       /* Decide whether or not to restart.  */
       if (con->cmd & DO_LIST)
         restval = 0;