diff options
| author | Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm> | 2026-03-19 20:13:55 +0100 |
|---|---|---|
| committer | Julian Andres Klode <jak@debian.org> | 2026-05-01 16:12:00 +0000 |
| commit | dcc690d7e08f6d54fc10ee372510875a41ec9a3b (patch) | |
| tree | f3aa3be72868832a2e9fb69806421fc3741f9943 | |
| parent | 98cfa47c7437da0cf3fbb89aec9f38ea70d0a5de (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.cc | 10 | ||||
| -rw-r--r-- | apt-pkg/acquire-item.h | 4 | ||||
| -rw-r--r-- | apt-pkg/acquire.cc | 4 |
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(); |
