]> git.saurik.com Git - apt.git/commitdiff
* methods/http.cc:
authorMichael Vogt <michael.vogt@ubuntu.com>
Mon, 22 Nov 2010 09:40:54 +0000 (10:40 +0100)
committerMichael Vogt <michael.vogt@ubuntu.com>
Mon, 22 Nov 2010 09:40:54 +0000 (10:40 +0100)
  - do not hang if Acquire::http::ProxyAutoDetect can not be
    executed or returns no data (LP: #654393)

debian/changelog
methods/http.cc

index df4fc1a29d4eee9247a209d478696e3511ad5d67..545476459eaca336e0eb919c7f5401d1d34671fd 100644 (file)
@@ -1,3 +1,11 @@
+apt (0.8.10) unstable; urgency=low
+
+  * methods/http.cc:
+    - do not hang if Acquire::http::ProxyAutoDetect can not be
+      executed or returns no data (LP: #654393)
+
+ -- Michael Vogt <michael.vogt@ubuntu.com>  Mon, 22 Nov 2010 10:40:45 +0100
+
 apt (0.8.9) unstable; urgency=low
 
   [ Christian Perrier ]
index 25e31de9a3126becc17db843f4e4e59a2a1837c5..dfc1619e3c4994c9dda537c2728c6722e9b8fd82 100644 (file)
@@ -1349,9 +1349,10 @@ bool HttpMethod::AutoDetectProxy()
    pid_t Process = ExecFork();
    if (Process == 0)
    {
+      close(Pipes[0]);
       dup2(Pipes[1],STDOUT_FILENO);
       SetCloseExec(STDOUT_FILENO,false);
-      
+
       const char *Args[2];
       Args[0] = AutoDetectProxyCmd.c_str();
       Args[1] = 0;
@@ -1361,10 +1362,18 @@ bool HttpMethod::AutoDetectProxy()
    }
    char buf[512];
    int InFd = Pipes[0];
-   if (read(InFd, buf, sizeof(buf)) < 0)
+   close(Pipes[1]);
+   int res = read(InFd, buf, sizeof(buf));
+   ExecWait(Process, "ProxyAutoDetect", true);
+
+   if (res < 0)
       return _error->Errno("read", "Failed to read");
-   ExecWait(Process, "ProxyAutoDetect");
-   
+   if (res == 0)
+      return _error->Warning("ProxyAutoDetect returned no data");
+
+   // add trailing \0
+   buf[res] = 0;
+
    if (Debug)
       clog << "auto detect command returned: '" << buf << "'" << endl;