--- ./lib/psm.c.orig 2009-12-07 14:36:49.000000000 +0000 +++ ./lib/psm.c 2010-03-25 14:42:52.000000000 +0000 @@ -455,6 +455,8 @@ static rpmRC runLuaScript(rpmpsm psm, He #ifdef WITH_LUA char *sname = NULL; int rootFd = -1; + int chroot_done; + const char *rootDir; int xx; rpmlua lua = NULL; /* Global state. */ rpmluav var; @@ -463,6 +465,22 @@ static rpmRC runLuaScript(rpmpsm psm, He rpmlog(RPMLOG_DEBUG, "%s: %s running scriptlet.\n", psm->stepName, sname); + chroot_done = rpmtsChrootDone(ts); + rootDir = rpmtsRootDir(ts); + if (!chroot_done) { + if (rootDir != NULL && strcmp(rootDir, "/") && *rootDir == '/') { + xx = chdir("/"); + rootFd = open(".", O_RDONLY, 0); + if (rootFd >= 0) { + xx = chroot(rootDir); + xx = rpmtsSetChrootDone(ts, 1); + } + } + } else { + rootFd = open(".", O_RDONLY, 0); + } + xx = chdir("/"); + if (!rpmtsChrootDone(ts)) { const char *rootDir = rpmtsRootDir(ts); xx = chdir("/"); @@ -505,12 +523,17 @@ static rpmRC runLuaScript(rpmpsm psm, He rpmluaDelVar(lua, "arg"); if (rootFd >= 0) { - const char *rootDir = rpmtsRootDir(ts); xx = fchdir(rootFd); xx = close(rootFd); - if (rootDir != NULL && !rstreq(rootDir, "/") && *rootDir == '/') + if (!chroot_done) { xx = chroot("."); - xx = rpmtsSetChrootDone(ts, 0); + xx = rpmtsSetChrootDone(ts, 0); + } + } + if (!chroot_done) { + const char *currDir = rpmtsCurrDir(ts); + if (currDir != NULL) + xx = chdir(currDir); } free(sname); #else