]> git.saurik.com Git - apt.git/commitdiff
Deal with killed acquire methods properly instead of hanging
authorMichael Vogt <mvo@ubuntu.com>
Fri, 27 Nov 2015 11:07:48 +0000 (12:07 +0100)
committerMichael Vogt <mvo@ubuntu.com>
Fri, 27 Nov 2015 11:10:57 +0000 (12:10 +0100)
This fixes a regression caussed by commit
95278287f4e1eeaf5d96749d6fc9bfc53fb400d0
that moved the error detection of RunFds() later into the loop.
However this broke detecting issues like dead acquire methods.
Instead of relying on the global error state (which is bad)
we now pass a boolean value back from RunFds() and break on
false.

Closes: #806406
apt-pkg/acquire.cc
apt-pkg/acquire.h

index e61f4192d6c30745de7d91316f0d9e5d28f20a81..a86bcef1aba1c8dde630014d337a99cf8234b3b6 100644 (file)
@@ -428,20 +428,30 @@ void pkgAcquire::SetFds(int &Fd,fd_set *RSet,fd_set *WSet)
    }
 }
                                                                        /*}}}*/
-// Acquire::RunFds - Deal with active FDs                              /*{{{*/
+// Acquire::RunFds - compatibility remove on next abi/api break                /*{{{*/
+void pkgAcquire::RunFds(fd_set *RSet,fd_set *WSet)
+{
+   RunFdsSane(RSet, WSet);
+};
+                                                                       /*}}}*/
+// Acquire::RunFdsSane - Deal with active FDs                          /*{{{*/
 // ---------------------------------------------------------------------
 /* Dispatch active FDs over to the proper workers. It is very important
    that a worker never be erased while this is running! The queue class
    should never erase a worker except during shutdown processing. */
-void pkgAcquire::RunFds(fd_set *RSet,fd_set *WSet)
+bool pkgAcquire::RunFdsSane(fd_set *RSet,fd_set *WSet)
 {
+   bool Res = true;
+
    for (Worker *I = Workers; I != 0; I = I->NextAcquire)
    {
       if (I->InFd >= 0 && FD_ISSET(I->InFd,RSet) != 0)
-        I->InFdReady();
+        Res &= I->InFdReady();
       if (I->OutFd >= 0 && FD_ISSET(I->OutFd,WSet) != 0)
-        I->OutFdReady();
+        Res &= I->OutFdReady();
    }
+
+   return Res;
 }
                                                                        /*}}}*/
 // Acquire::Run - Run the fetch sequence                               /*{{{*/
@@ -604,7 +614,8 @@ pkgAcquire::RunResult pkgAcquire::Run(int PulseIntervall)
         break;
       }
 
-      RunFds(&RFds,&WFds);
+      if(RunFdsSane(&RFds,&WFds) == false)
+         break;
 
       // Timeout, notify the log class
       if (Res == 0 || (Log != 0 && Log->Update == true))
index 3e5ca41cdb88eb1aed67e17b04a8cd0424300a92..f4019d556000a5d60410b16d8a313a10a1b46397 100644 (file)
@@ -236,8 +236,15 @@ class pkgAcquire
     *
     *  \param WSet The set of file descriptors that are ready for
     *  output.
+    *
+    * \return false if there is an error condition on one of the fds
     */
-   virtual void RunFds(fd_set *RSet,fd_set *WSet);   
+   bool RunFdsSane(fd_set *RSet,fd_set *WSet);
+
+   // just here for compatbility, needs to be removed on the next
+   // ABI/API break. RunFdsSane() is what should be used as it
+   // returns if there is an error condition on one of the fds
+   virtual void RunFds(fd_set *RSet,fd_set *WSet);
 
    /** \brief Check for idle queues with ready-to-fetch items.
     *