1*4882a593SmuzhiyunFrom 1ed066fc6fa7d7afffe3545c4e3ea937529e6c49 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Changqing Li <changqing.li@windriver.com>
3*4882a593SmuzhiyunDate: Thu, 7 May 2020 17:40:58 +0800
4*4882a593SmuzhiyunSubject: [PATCH] lib/transaction.c: fix file conflicts for MIPS64 N32
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunThis patch is from:
7*4882a593Smuzhiyunhttps://github.com/rpm-software-management/rpm/issues/193
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunError: Transaction check error:
10*4882a593Smuzhiyun  file /sbin/ldconfig conflicts between attempted installs of
11*4882a593Smuzhiyunldconfig-2.31+git0+71f2b249a2-r0.mips64_n32 and
12*4882a593Smuzhiyunlib32-ldconfig-2.31+git0+71f2b249a2-r0.mips32r2
13*4882a593Smuzhiyun...
14*4882a593Smuzhiyun
15*4882a593SmuzhiyunThis was because:
16*4882a593Smuzhiyuntransactions_color = 001 (ELF32) & 010 (ELF64) & 100 (ELF32 N32 MIPS64)
17*4882a593SmuzhiyunFColor = Current file color (001) & transaction_color (111)
18*4882a593SmuzhiyunoFcolor = Previous file color (100) & transaction_color (111)
19*4882a593Smuzhiyun
20*4882a593SmuzhiyunIn handleColorConflict, it only deal with conditons "new preferred" or
21*4882a593Smuzhiyun"old preferred". But not deal with the situation where neither is the
22*4882a593Smuzhiyunpreferred type. so for tri-lib system, like mips64/mips64 n32/mips(32),
23*4882a593Smuzhiyun"Transaction check error" occurred.
24*4882a593Smuzhiyun
25*4882a593SmuzhiyunFixed by performing a 'last-in-wins' resolution when "neither is preferred".
26*4882a593Smuzhiyun
27*4882a593SmuzhiyunUpstream-Status: Submitted <https://github.com/rpm-software-management/rpm/issues/193>
28*4882a593Smuzhiyun
29*4882a593SmuzhiyunSigned-off-by: Changqing Li <changqing.li@windriver.com>
30*4882a593Smuzhiyun---
31*4882a593Smuzhiyun lib/transaction.c | 13 ++++++++++++-
32*4882a593Smuzhiyun 1 file changed, 12 insertions(+), 1 deletion(-)
33*4882a593Smuzhiyun
34*4882a593Smuzhiyundiff --git a/lib/transaction.c b/lib/transaction.c
35*4882a593Smuzhiyunindex 67b9db5..82386b8 100644
36*4882a593Smuzhiyun--- a/lib/transaction.c
37*4882a593Smuzhiyun+++ b/lib/transaction.c
38*4882a593Smuzhiyun@@ -391,7 +391,18 @@ static int handleColorConflict(rpmts ts,
39*4882a593Smuzhiyun 		    rpmfsSetAction(ofs, ofx, FA_CREATE);
40*4882a593Smuzhiyun 		rpmfsSetAction(fs, fx, FA_SKIPCOLOR);
41*4882a593Smuzhiyun 		rConflicts = 0;
42*4882a593Smuzhiyun-	    }
43*4882a593Smuzhiyun+	    }else {
44*4882a593Smuzhiyun+                /*
45*4882a593Smuzhiyun+                 * If neither is already skipped, we skip the old one, and
46*4882a593Smuzhiyun+                 * install the new one (last in wins).
47*4882a593Smuzhiyun+                 */
48*4882a593Smuzhiyun+                if (ofs && !XFA_SKIPPING(rpmfsGetAction(ofs, ofx)) &&
49*4882a593Smuzhiyun+                    fs && !XFA_SKIPPING(rpmfsGetAction(fs, fx))) {
50*4882a593Smuzhiyun+                    rpmfsSetAction(ofs, ofx, FA_SKIPCOLOR);
51*4882a593Smuzhiyun+                    rpmfsSetAction(fs, fx, FA_CREATE);
52*4882a593Smuzhiyun+                }
53*4882a593Smuzhiyun+                rConflicts = 0;
54*4882a593Smuzhiyun+            }
55*4882a593Smuzhiyun 	}
56*4882a593Smuzhiyun     }
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun--
59*4882a593Smuzhiyun2.7.4
60*4882a593Smuzhiyun
61