From 9fdcaee218505710495fea35f3b8538bebeaa1f9 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Thu, 15 Aug 2019 09:39:00 +0200 Subject: Fix segfault in pkgAcquire::Enqueue() with Acquire::Queue-Mode=access In commit 79b1a8298, QueueName() was changed, amongst other things, to exit early when the queue mode was single access, as single access does not need any fancy queue name. The exit became too early though, as Config was not initialized anymore, but the caller was relying on it. Fix QueueName() to always initialize Config and in Enqueue() initialize Config with a nullptr, so if this regresses it's guaranteed to fail harder. Also add a test case - this is very simple, but the first and only test case for access queue mode. Regression-Of: 79b1a82983e737e74359bc306d9edb357c5bdd46 LP: #1839714 --- apt-pkg/acquire.cc | 10 ++++++---- test/integration/test-apt-update-simple | 3 +++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc index 6cf8b4c83..776c82b3b 100644 --- a/apt-pkg/acquire.cc +++ b/apt-pkg/acquire.cc @@ -307,7 +307,7 @@ static bool CheckForBadItemAndFailIt(pkgAcquire::Item * const Item, void pkgAcquire::Enqueue(ItemDesc &Item) { // Determine which queue to put the item in - const MethodConfig *Config; + const MethodConfig *Config = nullptr; string Name = QueueName(Item.URI,Config); if (Name.empty() == true) { @@ -387,14 +387,16 @@ string pkgAcquire::QueueName(string Uri,MethodConfig const *&Config) { constexpr int DEFAULT_HOST_LIMIT = 10; URI U(Uri); - // Access mode forces all methods to be Single-Instance - if (QueueMode == QueueAccess) - return U.Access; + // Note that this gets written through the reference to the caller. Config = GetConfig(U.Access); if (Config == nullptr) return {}; + // Access mode forces all methods to be Single-Instance + if (QueueMode == QueueAccess) + return U.Access; + // Single-Instance methods get exactly one queue per URI if (Config->SingleInstance == true) return U.Access; diff --git a/test/integration/test-apt-update-simple b/test/integration/test-apt-update-simple index ccf719790..ff1d3758b 100755 --- a/test/integration/test-apt-update-simple +++ b/test/integration/test-apt-update-simple @@ -31,3 +31,6 @@ main/binary-amd64/Packages main/binary-all/Packages main/i18n/Translation-en main/i18n/Translation-de' aptget indextargets --format '$(METAKEY)' + +find rootdir/var/lib/apt/lists/ -type f -delete +testsuccess aptget update -o Acquire::Queue-Mode=access -- cgit v1.2.3