Просмотр исходного кода

* apt-pkg/acquire-worker.cc:
- show error details of failed methods
* apt-pkg/contrib/fileutl.cc:
- if a process aborts with signal, show signal number
* methods/http.cc:
- ignore SIGPIPE, we deal with EPIPE from write in
HttpMethod::ServerDie() (LP: #385144)

Michael Vogt лет назад: 17
Родитель
Сommit
217d575b57
4 измененных файлов с 24 добавлено и 7 удалено
  1. 2 5
      apt-pkg/acquire-worker.cc
  2. 5 2
      apt-pkg/contrib/fileutl.cc
  3. 12 0
      debian/changelog
  4. 5 0
      methods/http_main.cc

+ 2 - 5
apt-pkg/acquire-worker.cc

@@ -527,10 +527,6 @@ bool pkgAcquire::Worker::OutFdReady()
    
    if (Res <= 0)
       return MethodFailure();
-
-   // Hmm.. this should never happen.
-   if (Res < 0)
-      return true;
    
    OutQueue.erase(0,Res);
    if (OutQueue.empty() == true)
@@ -558,7 +554,8 @@ bool pkgAcquire::Worker::MethodFailure()
 {
    _error->Error("Method %s has died unexpectedly!",Access.c_str());
    
-   ExecWait(Process,Access.c_str(),true);
+   // do not reap the child here to show meaningfull error to the user
+   ExecWait(Process,Access.c_str(),false);
    Process = -1;
    close(InFd);
    close(OutFd);

+ 5 - 2
apt-pkg/contrib/fileutl.cc

@@ -450,8 +450,11 @@ bool ExecWait(pid_t Pid,const char *Name,bool Reap)
    {
       if (Reap == true)
 	 return false;
-      if (WIFSIGNALED(Status) != 0 && WTERMSIG(Status) == SIGSEGV)
-	 return _error->Error(_("Sub-process %s received a segmentation fault."),Name);
+      if (WIFSIGNALED(Status) != 0)
+	 if( WTERMSIG(Status) == SIGSEGV)
+	    return _error->Error(_("Sub-process %s received a segmentation fault."),Name);
+	 else 
+	    return _error->Error(_("Sub-process %s received signal %u."),Name, WTERMSIG(Status));
 
       if (WIFEXITED(Status) != 0)
 	 return _error->Error(_("Sub-process %s returned an error code (%u)"),Name,WEXITSTATUS(Status));

+ 12 - 0
debian/changelog

@@ -1,3 +1,15 @@
+apt (0.7.21ubuntu2~ppa1) karmic; urgency=low
+
+  * apt-pkg/acquire-worker.cc:
+    - show error details of failed methods
+  * apt-pkg/contrib/fileutl.cc:
+    - if a process aborts with signal, show signal number
+  * methods/http.cc:
+    - ignore SIGPIPE, we deal with EPIPE from write in 
+      HttpMethod::ServerDie() (LP: #385144)
+
+ -- Michael Vogt <michael.vogt@ubuntu.com>  Thu, 02 Jul 2009 14:11:35 +0200
+
 apt (0.7.21ubuntu1) karmic; urgency=low
 
   * merged from the debian-sid bzr branch

+ 5 - 0
methods/http_main.cc

@@ -1,5 +1,6 @@
 #include <apt-pkg/fileutl.h>
 #include <apt-pkg/acquire-method.h>
+#include <signal.h>
 
 #include "connect.h"
 #include "rfc2553emu.h"
@@ -10,6 +11,10 @@ int main()
 {
    setlocale(LC_ALL, "");
 
+   // ignore SIGPIPE, this can happen on write() if the socket
+   // closes the connection (this is dealt with via ServerDie())
+   signal(SIGPIPE, SIG_IGN);
+
    HttpMethod Mth;
    return Mth.Loop();
 }