Package: apt Version: 0.9.13 Severity: grave Justification: breaks d-i Tags: patch User: ubuntu-de...@lists.ubuntu.com Usertags: origin-ubuntu ubuntu-patch trusty
This bug originated as: https://bugs.launchpad.net/bugs/1254696 The ExecFork refactoring in 0.9.13~exp1 broke d-i, because APT::Keep-Fds is no longer respected when invoking dpkg. Here's a patch, although perhaps you want this laid out in some way that duplicates less code; however I couldn't readily see how to do that without just undoing the refactoring. I spent a couple of hours trying to write an integration test that exercises the whole debconf-apt-progress path. I failed because that requires actually executing the postinst in a test package, which requires chrooting because we use dpkg --root, and I couldn't get fakechroot to do the right thing. Suggestions gratefully appreciated if you think this is important. * Fix two subprocess calls to continue to honour APT::Keep-Fds (LP: #1254696). diff -Nru apt-0.9.13~exp1ubuntu1/apt-pkg/deb/dpkgpm.cc apt-0.9.13~exp1ubuntu2/apt-pkg/deb/dpkgpm.cc --- apt-0.9.13~exp1ubuntu1/apt-pkg/deb/dpkgpm.cc 2013-11-23 08:18:03.000000000 +0000 +++ apt-0.9.13~exp1ubuntu2/apt-pkg/deb/dpkgpm.cc 2013-11-25 13:18:34.000000000 +0000 @@ -416,6 +416,18 @@ // Create the pipes std::set<int> KeepFDs; + Configuration::Item const *KeepFDsOpts = _config->Tree("APT::Keep-Fds"); + if (KeepFDsOpts != 0 && KeepFDsOpts->Child != 0) + { + KeepFDsOpts = KeepFDsOpts->Child; + for (; KeepFDsOpts != 0; KeepFDsOpts = KeepFDsOpts->Next) + { + if (KeepFDsOpts->Value.empty() == true) + continue; + int fd = atoi(KeepFDsOpts->Value.c_str()); + KeepFDs.insert(fd); + } + } int Pipes[2]; if (pipe(Pipes) != 0) return _error->Errno("pipe","Failed to create IPC pipe to subprocess"); @@ -1378,6 +1390,18 @@ // now run dpkg d->progress->StartDpkg(); std::set<int> KeepFDs; + Configuration::Item const *KeepFDsOpts = _config->Tree("APT::Keep-Fds"); + if (KeepFDsOpts != 0 && KeepFDsOpts->Child != 0) + { + KeepFDsOpts = KeepFDsOpts->Child; + for (; KeepFDsOpts != 0; KeepFDsOpts = KeepFDsOpts->Next) + { + if (KeepFDsOpts->Value.empty() == true) + continue; + int fd = atoi(KeepFDsOpts->Value.c_str()); + KeepFDs.insert(fd); + } + } KeepFDs.insert(fd[1]); pid_t Child = ExecFork(KeepFDs); if (Child == 0) Thanks, -- Colin Watson [cjwat...@ubuntu.com] -- To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org