From 82e6d1ad126df88c58120a31fc025691039db7f3 Mon Sep 17 00:00:00 2001 From: Alexander Kanavin Date: Tue, 17 Jan 2017 14:07:17 +0200 Subject: [PATCH] When cross-installing, execute package scriptlets without chrooting into destination rootfs This is triggered only when RPM_NO_CHROOT_FOR_SCRIPTS environment variable is defined. Otherwise they will trigger an explosion of failures, obviously. Amended 2018-07-03 by Olof Johansson : Remove leaking temporary scriptlet files Since we tell dnf to run rpm with debug output, this will result in rpm not cleaning up written temporary scriptlet files (same flag controls both behaviors). This wouldn't have been a problem since we normally would use the target sysroot also for temporary files, but we need to chroot out to be able to actually run the rpm scriptlets (purpose of this patch), so the temporary files are written to the host's /var/tmp/ directory, causing a gradual resource leakage on the host system for every RPM based do_rootfs task executed. Signed-off-by: Olof Johansson Upstream-Status: Inappropriate [oe-core specific] Signed-off-by: Alexander Kanavin --- lib/rpmscript.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/rpmscript.c b/lib/rpmscript.c index b18f851a3..36e37cf77 100644 --- a/lib/rpmscript.c +++ b/lib/rpmscript.c @@ -448,8 +448,7 @@ exit: Fclose(out); /* XXX dup'd STDOUT_FILENO */ if (fn) { - if (!rpmIsDebug()) - unlink(fn); + unlink(fn); free(fn); } free(mline); @@ -483,7 +482,13 @@ rpmRC rpmScriptRun(rpmScript script, int arg1, int arg2, FD_t scriptFd, if (rc != RPMRC_FAIL) { if (script_type & RPMSCRIPTLET_EXEC) { - rc = runExtScript(plugins, prefixes, script->descr, lvl, scriptFd, &args, script->body, arg1, arg2, script->nextFileFunc); + if (getenv("RPM_NO_CHROOT_FOR_SCRIPTS") != NULL) { + rpmChrootOut(); + rc = runExtScript(plugins, prefixes, script->descr, lvl, scriptFd, &args, script->body, arg1, arg2, script->nextFileFunc); + rpmChrootIn(); + } else { + rc = runExtScript(plugins, prefixes, script->descr, lvl, scriptFd, &args, script->body, arg1, arg2, script->nextFileFunc); + } } else { rc = runLuaScript(plugins, prefixes, script->descr, lvl, scriptFd, &args, script->body, arg1, arg2, script->nextFileFunc); }