rpm/luaroot.diff

76 lines
2.0 KiB
Diff

Index: lib/psm.c
===================================================================
--- lib/psm.c.orig
+++ lib/psm.c
@@ -506,6 +506,8 @@ static rpmRC runLuaScript(rpmpsm psm, He
{
const rpmts ts = psm->ts;
int rootFd = -1;
+ int chroot_done;
+ const char *rootDir;
const char *n, *v, *r;
rpmRC rc = RPMRC_OK;
int i;
@@ -515,20 +517,27 @@ static rpmRC runLuaScript(rpmpsm psm, He
xx = headerNVR(h, &n, &v, &r);
- if (!rpmtsChrootDone(ts)) {
- const char *rootDir = rpmtsRootDir(ts);
- xx = chdir("/");
+ chroot_done = rpmtsChrootDone(ts);
+ rootDir = rpmtsRootDir(ts);
+ if (!chroot_done) {
+ if (rootDir != NULL && strcmp(rootDir, "/") && *rootDir == '/') {
+ xx = chdir("/");
/*@-nullpass@*/
- rootFd = open(".", O_RDONLY, 0);
+ rootFd = open(".", O_RDONLY, 0);
/*@=nullpass@*/
- if (rootFd >= 0) {
- /*@-superuser -noeffect @*/
- if (rootDir != NULL && strcmp(rootDir, "/") && *rootDir == '/')
+ if (rootFd >= 0) {
+ /*@-superuser -noeffect @*/
xx = chroot(rootDir);
- /*@=superuser =noeffect @*/
- xx = rpmtsSetChrootDone(ts, 1);
+ /*@=superuser =noeffect @*/
+ xx = rpmtsSetChrootDone(ts, 1);
+ }
}
+ } else {
+/*@-nullpass@*/
+ rootFd = open(".", O_RDONLY, 0);
+/*@=nullpass@*/
}
+ xx = chdir("/");
/* Create arg variable */
rpmluaPushTable(lua, "arg");
@@ -565,14 +574,19 @@ static rpmRC runLuaScript(rpmpsm psm, He
rpmluaDelVar(lua, "arg");
if (rootFd >= 0) {
- const char *rootDir = rpmtsRootDir(ts);
xx = fchdir(rootFd);
xx = close(rootFd);
- /*@-superuser -noeffect @*/
- if (rootDir != NULL && strcmp(rootDir, "/") && *rootDir == '/')
+ if (!chroot_done) {
+ /*@-superuser -noeffect @*/
xx = chroot(".");
- /*@=superuser =noeffect @*/
- xx = rpmtsSetChrootDone(ts, 0);
+ /*@=superuser =noeffect @*/
+ xx = rpmtsSetChrootDone(ts, 0);
+ }
+ }
+ if (!chroot_done) {
+ const char *currDir = rpmtsCurrDir(ts);
+ if (currDir != NULL)
+ xx = chdir(currDir);
}
return rc;