From 3312607159410eda3c634a0c6fe3c2b1a4fd3cc3 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Tue, 9 Mar 2021 11:40:59 +0100 Subject: Use RAII to clean up tmp dir for dpkg recursive install One less thing to remember to do in all branches. --- apt-pkg/deb/dpkgpm.cc | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) (limited to 'apt-pkg') diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index eb549023f..ba5c3a11a 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -1826,7 +1826,7 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress) break; } - char * tmpdir_to_free = nullptr; + std::unique_ptr tmpdir_for_dpkg_recursive{nullptr, &cleanUpTmpDir}; // Write in the file or package names if (I->Op == Item::Install) @@ -1836,9 +1836,9 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress) { std::string tmpdir; strprintf(tmpdir, "%s/apt-dpkg-install-XXXXXX", GetTempDir().c_str()); - tmpdir_to_free = strndup(tmpdir.data(), tmpdir.length()); - if (mkdtemp(tmpdir_to_free) == nullptr) - return _error->Errno("DPkg::Go", "mkdtemp of %s failed in preparation of calling dpkg unpack", tmpdir_to_free); + tmpdir_for_dpkg_recursive.reset(strndup(tmpdir.data(), tmpdir.length())); + if (mkdtemp(tmpdir_for_dpkg_recursive.get()) == nullptr) + return _error->Errno("DPkg::Go", "mkdtemp of %s failed in preparation of calling dpkg unpack", tmpdir_for_dpkg_recursive.get()); char p = 1; for (auto c = installsToDo - 1; (c = c/10) != 0; ++p); @@ -1851,14 +1851,14 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress) file.append(".deb"); std::string linkpath; if (dpkg_recursive_install_numbered) - strprintf(linkpath, "%s/%.*lu-%s", tmpdir_to_free, p, n, file.c_str()); + strprintf(linkpath, "%s/%.*lu-%s", tmpdir_for_dpkg_recursive.get(), p, n, file.c_str()); else - strprintf(linkpath, "%s/%s", tmpdir_to_free, file.c_str()); + strprintf(linkpath, "%s/%s", tmpdir_for_dpkg_recursive.get(), file.c_str()); if (symlink(I->File.c_str(), linkpath.c_str()) != 0) return _error->Errno("DPkg::Go", "Symlinking %s to %s failed!", I->File.c_str(), linkpath.c_str()); } AddArg("--recursive"); - AddArg(tmpdir_to_free); + AddArg(tmpdir_for_dpkg_recursive.get()); } else { @@ -1957,7 +1957,6 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress) Packages.clear(); close(fd[0]); close(fd[1]); - cleanUpTmpDir(tmpdir_to_free); continue; } Args.push_back(NULL); @@ -2111,8 +2110,6 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress) signal(SIGINT,old_SIGINT); signal(SIGHUP,old_SIGHUP); - cleanUpTmpDir(tmpdir_to_free); - if (waitpid_failure == true) { strprintf(d->dpkg_error, "Sub-process %s couldn't be waited for.",Args[0]); -- cgit v1.2.3-70-g09d2