]> git.saurik.com Git - apt.git/commitdiff
Handle interrupt when running Pre-Install hooks
authorJulian Andres Klode <jak@debian.org>
Sat, 6 Aug 2016 22:45:25 +0000 (00:45 +0200)
committerJulian Andres Klode <jak@debian.org>
Sat, 6 Aug 2016 22:45:25 +0000 (00:45 +0200)
If we receive an interrupt, set a flag and do not abort
immediately without waiting for the child. Once the child
exited, exit with an error if the interrupted flag is set.

Closes: #832593
apt-pkg/deb/dpkgpm.cc

index c1b9a28f4ad1ecd3f363e313c94408db8d871a4a..6aa1ce42687d885fd0e9eb86a35de73e61b9fabf 100644 (file)
@@ -403,6 +403,7 @@ bool pkgDPkgPM::SendPkgsInfo(FILE * const F, unsigned int const &Version)
 bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf)
 {
    bool result = true;
+   static bool interrupted = false;
 
    Configuration::Item const *Opts = _config->Tree(Cnf);
    if (Opts == 0 || Opts->Child == 0)
@@ -410,6 +411,9 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf)
    Opts = Opts->Child;
 
    sighandler_t old_sigpipe = signal(SIGPIPE, SIG_IGN);
+   sighandler_t old_sigint = signal(SIGINT, [](int signum){
+        interrupted = true;
+   });
 
    unsigned int Count = 1;
    for (; Opts != 0; Opts = Opts->Next, Count++)
@@ -508,8 +512,12 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf)
          break;
       }
    }
+   signal(SIGINT, old_sigint);
    signal(SIGPIPE, old_sigpipe);
 
+   if (interrupted)
+      result = _error->Error("Interrupted");
+
    return result;
 }
                                                                        /*}}}*/