summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm>2026-03-19 20:13:55 +0100
committerJulian Andres Klode <jak@debian.org>2026-05-01 16:12:00 +0000
commitdcc690d7e08f6d54fc10ee372510875a41ec9a3b (patch)
treef3aa3be72868832a2e9fb69806421fc3741f9943
parent98cfa47c7437da0cf3fbb89aec9f38ea70d0a5de (diff)
pkgAcqMetaClearSig: Abort transaction when pkgAcquire::Run has been cancelled
Ongoing Run can be cancelled by returning false from ::Pulse(). In this case the items would still be called pkgAcquire::Item::Finished() as usual, causing pkgAcqMetaClearSig to commit the incomplete transaction anyway as at that point it's still Started and has no errors. Add a pkgAcquire::Item::Cancelled() method and use it in pkgAcqMetaClearSig to abort the transaction. Closes: #1078608
-rw-r--r--apt-pkg/acquire-item.cc10
-rw-r--r--apt-pkg/acquire-item.h4
-rw-r--r--apt-pkg/acquire.cc4
3 files changed, 18 insertions, 0 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc
index ca649a4b8..458868bec 100644
--- a/apt-pkg/acquire-item.cc
+++ b/apt-pkg/acquire-item.cc
@@ -870,6 +870,10 @@ std::string pkgAcquire::Item::ShortDesc() const /*{{{*/
return DescURI();
}
/*}}}*/
+void pkgAcquire::Item::Cancelled() /*{{{*/
+{
+}
+ /*}}}*/
void pkgAcquire::Item::Finished() /*{{{*/
{
}
@@ -2006,6 +2010,12 @@ string pkgAcqMetaClearSig::Custom600Headers() const
return Header;
}
/*}}}*/
+void pkgAcqMetaClearSig::Cancelled() /*{{{*/
+{
+ if (TransactionManager->State == TransactionStarted)
+ TransactionManager->AbortTransaction();
+}
+ /*}}}*/
void pkgAcqMetaClearSig::Finished() /*{{{*/
{
if(_config->FindB("Debug::Acquire::Transaction", false) == true)
diff --git a/apt-pkg/acquire-item.h b/apt-pkg/acquire-item.h
index 5861d48be..1182e415e 100644
--- a/apt-pkg/acquire-item.h
+++ b/apt-pkg/acquire-item.h
@@ -253,6 +253,9 @@ class APT_PUBLIC pkgAcquire::Item : public WeakPointable /*{{{*/
*/
virtual std::string ShortDesc() const;
+ /** \brief Invoked by the worker when the download is cancelled before completion. */
+ virtual void Cancelled();
+
/** \brief Invoked by the worker when the download is completely done. */
virtual void Finished();
@@ -575,6 +578,7 @@ class APT_HIDDEN pkgAcqMetaClearSig final : public pkgAcqMetaIndex
bool VerifyDone(std::string const &Message, pkgAcquire::MethodConfig const *Cnf) override;
void Done(std::string const &Message, HashStringList const &Hashes,
pkgAcquire::MethodConfig const *Cnf) override;
+ void Cancelled() override;
void Finished() override;
/** \brief Starts downloading the individual index files.
diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc
index 95b6391cd..62d477f95 100644
--- a/apt-pkg/acquire.cc
+++ b/apt-pkg/acquire.cc
@@ -794,6 +794,10 @@ stop:
for (Queue *I = Queues; I != 0; I = I->Next)
I->Shutdown(false);
+ if (WasCancelled)
+ for (ItemIterator I = Items.begin(); I != Items.end(); ++I)
+ (*I)->Cancelled();
+
// Shut down the items
for (auto &Item : Items)
Item->Finished();