From 71e080a79c1984f59527bfef8c3d490fc492a755 Mon Sep 17 00:00:00 2001 From: Thierry Vignaud Date: Sat, 9 Jan 2016 02:22:40 +0100 Subject: [PATCH 1/3] (runImmedFileTriggersInChroot) introduce it unlike runImmedFileTriggers(), it explicitely chroot() if needed. This is needed for transaction filetriggers --- lib/rpmtriggers.c | 10 ++++++++++ lib/rpmtriggers.h | 16 ++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/lib/rpmtriggers.c b/lib/rpmtriggers.c index 211e62f05f..f4e7f2e793 100644 --- a/lib/rpmtriggers.c +++ b/lib/rpmtriggers.c @@ -599,3 +599,13 @@ rpmRC runImmedFileTriggers(rpmts ts, rpmte te, rpmsenseFlags sense, return (nerrors == 0) ? RPMRC_OK : RPMRC_FAIL; } + +rpmRC runImmedFileTriggersInChroot(rpmts ts, rpmte te, rpmsenseFlags sense, + rpmscriptTriggerModes tm, int priorityClass) +{ + if (rpmChrootIn() == 0) { + runImmedFileTriggers(ts, te, sense, tm, priorityClass); + /* XXX an error here would require a full abort */ + (void) rpmChrootOut(); + } +} diff --git a/lib/rpmtriggers.h b/lib/rpmtriggers.h index bca79b8fed..299f9d1162 100644 --- a/lib/rpmtriggers.h +++ b/lib/rpmtriggers.h @@ -76,6 +76,22 @@ rpmRC runFileTriggers(rpmts ts, rpmte te, rpmsenseFlags sense, */ rpmRC runImmedFileTriggers(rpmts ts, rpmte te, rpmsenseFlags sense, rpmscriptTriggerModes tm, int upper); + +/* Run file triggers in this te other package(s) set off (but goes in chroot first). + * This is used for transaction file triggers. + * @param ts transaction set + * @param te transaction entry + * @param sense defines which triggers should be set off (triggerin, + * triggerun, triggerpostun) + * @param triggerClass 1 to run triggers that should be executed before + * standard scriptlets + * 2 to run triggers that should be executed after + * standard scriptlets + * 0 to run all triggers + * @param tm trigger mode, (filetrigger/transfiletrigger) + */ +rpmRC runImmedFileTriggersInChroot(rpmts ts, rpmte te, rpmsenseFlags sense, + rpmscriptTriggerModes tm, int upper); #ifdef __cplusplus } #endif From 7b65d926888fb10ac0ecfc6786fc8f1a7463c5ad Mon Sep 17 00:00:00 2001 From: Thierry Vignaud Date: Sat, 9 Jan 2016 02:23:24 +0100 Subject: [PATCH 2/3] fix %transfiletrigger[iu]n file triggers previously those filetriggers would call tools out of the chroot, which breaks installers such as DrakX or Anaconda. See https://bugs.mageia.org/show_bug.cgi?id=17217 --- lib/psm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/psm.c b/lib/psm.c index 154237e5b8..3c5cbb6390 100644 --- a/lib/psm.c +++ b/lib/psm.c @@ -841,11 +841,11 @@ rpmRC rpmpsmRun(rpmts ts, rpmte te, pkgGoal goal) rc = runInstScript(psm, goal); break; case PKG_TRANSFILETRIGGERIN: - rc = runImmedFileTriggers(ts, te, RPMSENSE_TRIGGERIN, + rc = runImmedFileTriggersInChroot(ts, te, RPMSENSE_TRIGGERIN, RPMSCRIPT_TRANSFILETRIGGER, 0); break; case PKG_TRANSFILETRIGGERUN: - rc = runImmedFileTriggers(ts, te, RPMSENSE_TRIGGERUN, + rc = runImmedFileTriggersInChroot(ts, te, RPMSENSE_TRIGGERUN, RPMSCRIPT_TRANSFILETRIGGER, 0); break; default: From 9511d2c6d06227825800d11973c323e965ec1263 Mon Sep 17 00:00:00 2001 From: Thierry Vignaud Date: Sat, 9 Jan 2016 02:44:02 +0100 Subject: [PATCH 3/3] fix transaction filetriggers in other package(s) ...this package sets off. previously those filetriggers would call tools out of the chroot, which breaks installers such as DrakX or Anaconda. See https://bugs.mageia.org/show_bug.cgi?id=17217 --- lib/rpmtriggers.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/rpmtriggers.c b/lib/rpmtriggers.c index f4e7f2e793..1ef0647460 100644 --- a/lib/rpmtriggers.c +++ b/lib/rpmtriggers.c @@ -530,6 +530,9 @@ rpmRC runFileTriggers(rpmts ts, rpmte te, rpmsenseFlags sense, /* Sort triggers by priority, offset, trigger index */ rpmtriggersSortAndUniq(triggers); + if (rpmChrootIn() != 0) + return RPMRC_FAIL; + /* Handle stored triggers */ for (i = 0; i < triggers->count; i++) { if (priorityClass == 1) { @@ -550,6 +553,8 @@ rpmRC runFileTriggers(rpmts ts, rpmte te, rpmsenseFlags sense, headerFree(trigH); } rpmtriggersFree(triggers); + /* XXX an error here would require a full abort */ + (void) rpmChrootOut(); return (nerrors == 0) ? RPMRC_OK : RPMRC_FAIL; }