2006-12-19 00:17:44 +01:00
|
|
|
Index: lib/psm.c
|
|
|
|
===================================================================
|
|
|
|
--- lib/psm.c.orig
|
|
|
|
+++ lib/psm.c
|
2009-08-28 15:54:03 +02:00
|
|
|
@@ -441,6 +441,8 @@ static rpmRC runLuaScript(rpmpsm psm, He
|
|
|
|
#ifdef WITH_LUA
|
|
|
|
char *sname = NULL;
|
2006-12-19 00:17:44 +01:00
|
|
|
int rootFd = -1;
|
|
|
|
+ int chroot_done;
|
|
|
|
+ const char *rootDir;
|
2009-08-28 15:54:03 +02:00
|
|
|
int xx;
|
|
|
|
rpmlua lua = NULL; /* Global state. */
|
|
|
|
rpmluav var;
|
|
|
|
@@ -449,16 +451,21 @@ static rpmRC runLuaScript(rpmpsm psm, He
|
2006-12-19 00:17:44 +01:00
|
|
|
|
2009-08-28 15:54:03 +02:00
|
|
|
rpmlog(RPMLOG_DEBUG, "%s: %s running <lua> scriptlet.\n",
|
|
|
|
psm->stepName, sname);
|
2006-12-19 00:17:44 +01:00
|
|
|
- if (!rpmtsChrootDone(ts)) {
|
|
|
|
- const char *rootDir = rpmtsRootDir(ts);
|
|
|
|
- xx = chdir("/");
|
2009-08-28 15:54:03 +02:00
|
|
|
- rootFd = open(".", O_RDONLY, 0);
|
|
|
|
- if (rootFd >= 0) {
|
|
|
|
- if (rootDir != NULL && strcmp(rootDir, "/") && *rootDir == '/')
|
2006-12-19 00:17:44 +01:00
|
|
|
+ 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);
|
|
|
|
+ xx = rpmtsSetChrootDone(ts, 1);
|
|
|
|
+ }
|
|
|
|
}
|
|
|
|
+ } else {
|
|
|
|
+ rootFd = open(".", O_RDONLY, 0);
|
|
|
|
}
|
|
|
|
+ xx = chdir("/");
|
|
|
|
|
|
|
|
/* Create arg variable */
|
|
|
|
rpmluaPushTable(lua, "arg");
|
2009-08-28 15:54:03 +02:00
|
|
|
@@ -491,12 +498,17 @@ static rpmRC runLuaScript(rpmpsm psm, He
|
2006-12-19 00:17:44 +01:00
|
|
|
rpmluaDelVar(lua, "arg");
|
|
|
|
|
|
|
|
if (rootFd >= 0) {
|
|
|
|
- const char *rootDir = rpmtsRootDir(ts);
|
|
|
|
xx = fchdir(rootFd);
|
|
|
|
xx = close(rootFd);
|
|
|
|
- if (rootDir != NULL && strcmp(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);
|
|
|
|
}
|
2009-08-28 15:54:03 +02:00
|
|
|
free(sname);
|
|
|
|
#else
|