Skip to content

Commit 08d5d6d

Browse files
jan-kolarikppisar
authored andcommitted
MergedTransaction: Fix invalid memory access when dropping items
Upstream commit: 90d2ffa When an item is dropped from the merged transaction, the `ItemPair` reference becomes invalid and should no longer be used. Resolves: https://issues.redhat.com/browse/RHEL-68770
1 parent 2923c99 commit 08d5d6d

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

Diff for: libdnf/transaction/MergedTransaction.cpp

+11-7
Original file line numberDiff line numberDiff line change
@@ -264,14 +264,15 @@ getItemIdentifier(ItemPtr item)
264264

265265
/**
266266
* Resolve the difference between RPMs in the first and second transaction item
267-
* and create a ItemPair of Upgrade, Downgrade or drop the item from the merged
268-
* transaction set in case of both packages are of the same version.
269-
* Method is called when original package is being removed and than installed again.
267+
* and create a ItemPair of Upgrade, Downgrade or remove the item from the merged
268+
* transaction set in case of both packages are the same.
269+
* Method is called when original package is being removed and then installed again.
270270
* \param itemPairMap merged transaction set
271271
* \param previousItemPair original item pair
272272
* \param mTransItem new transaction item
273+
* \return true if the original and new transaction item differ
273274
*/
274-
void
275+
bool
275276
MergedTransaction::resolveRPMDifference(ItemPairMap &itemPairMap,
276277
ItemPair &previousItemPair,
277278
TransactionItemBasePtr mTransItem)
@@ -287,7 +288,7 @@ MergedTransaction::resolveRPMDifference(ItemPairMap &itemPairMap,
287288
firstRPM->getRelease() == secondRPM->getRelease()) {
288289
// Drop the item from merged transaction
289290
itemPairMap.erase(getItemIdentifier(firstItem));
290-
return;
291+
return false;
291292
} else if ((*firstRPM) < (*secondRPM)) {
292293
// Upgrade to secondRPM
293294
previousItemPair.first->setAction(TransactionItemAction::UPGRADED);
@@ -298,6 +299,7 @@ MergedTransaction::resolveRPMDifference(ItemPairMap &itemPairMap,
298299
mTransItem->setAction(TransactionItemAction::DOWNGRADE);
299300
}
300301
previousItemPair.second = mTransItem;
302+
return true;
301303
}
302304

303305
void
@@ -308,12 +310,14 @@ MergedTransaction::resolveErase(ItemPairMap &itemPairMap,
308310
/*
309311
* The original item has been removed - it has to be installed now unless the rpmdb
310312
* has changed. Resolve the difference between packages and mark it as Upgrade,
311-
* Reinstall or Downgrade
313+
* Downgrade or remove it from the transaction
312314
*/
313315
if (mTransItem->getAction() == TransactionItemAction::INSTALL) {
314316
if (mTransItem->getItem()->getItemType() == ItemType::RPM) {
315317
// resolve the difference between RPM packages
316-
resolveRPMDifference(itemPairMap, previousItemPair, mTransItem);
318+
if (!resolveRPMDifference(itemPairMap, previousItemPair, mTransItem)) {
319+
return;
320+
}
317321
} else {
318322
// difference between comps can't be resolved
319323
mTransItem->setAction(TransactionItemAction::REINSTALL);

Diff for: libdnf/transaction/MergedTransaction.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class MergedTransaction {
7676
typedef std::map< std::string, ItemPair > ItemPairMap;
7777

7878
void mergeItem(ItemPairMap &itemPairMap, TransactionItemBasePtr transItem);
79-
void resolveRPMDifference(ItemPairMap &itemPairMap, ItemPair &previousItemPair, TransactionItemBasePtr mTransItem);
79+
bool resolveRPMDifference(ItemPairMap &itemPairMap, ItemPair &previousItemPair, TransactionItemBasePtr mTransItem);
8080
void resolveErase(ItemPairMap &itemPairMap, ItemPair &previousItemPair, TransactionItemBasePtr mTransItem);
8181
void resolveAltered(ItemPairMap &itemPairMap, ItemPair &previousItemPair, TransactionItemBasePtr mTransItem);
8282
};

0 commit comments

Comments
 (0)