rpm: Fix lua 'print' statement capture

The print statement should capture the output and send it to the script
processing engine, and not display it directly to the screen.

Note, this is only a bug if 'lua' support has been enabled in the RPM
recipe's PACKAGECONFIG.

This patch is from: http://rpm5.org/cvs/patchset?cn=17671

(From OE-Core rev: 6bc0e8207d0e7b1d6f2eac8ed1b75a3fd9fab87b)

(From OE-Core rev: 7d4230b7eb7aa09087a6267dd6e686f713ac6f72)

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Mark Hatle
2015-06-17 12:04:40 -05:00
committed by Richard Purdie
parent e4f3e5440b
commit 919c7bf5c6
2 changed files with 105 additions and 0 deletions

View File

@@ -0,0 +1,104 @@
Lua 'print' statement is not working properly inside of RPM 5
The print statement should capture the output and send it to the script
processing engine, and not display it directly to the screen.
This patch is from: http://rpm5.org/cvs/patchset?cn=17671
Upstream-Status: backport (patchset 17671 from rpm5.org)
Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
Index: rpm-5.4.14/CHANGES
===================================================================
--- rpm-5.4.14.orig/CHANGES
+++ rpm-5.4.14/CHANGES
@@ -1,3 +1,4 @@
+ - jbj: lua: fix: resurrect output capture with lua-5.2.
- jbj: verify: fix: broken logic for %ghost avoidance (Mark Hatle).
5.4.13 -> 5.4.14:
Index: rpm-5.4.14/rpmio/rpmlua.c
===================================================================
--- rpm-5.4.14.orig/rpmio/rpmlua.c
+++ rpm-5.4.14/rpmio/rpmlua.c
@@ -175,7 +175,7 @@ rpmlua rpmluaNew(void)
};
/*@=readonlytrans =nullassign @*/
/*@observer@*/ /*@unchecked@*/
- const luaL_Reg *lib = lualibs;
+ const luaL_Reg *lib;
char *path_buf;
char *path_next;
char *path;
@@ -190,31 +190,34 @@ rpmlua rpmluaNew(void)
luaL_openlibs(L);
- for (; lib->name; lib++) {
+ for (lib = lualibs; lib->name; lib++) {
luaL_requiref(L, lib->name, lib->func, 1);
+ lua_pop(L, 1);
}
{ const char * _lua_path = rpmGetPath(rpmluaPath, NULL);
if (_lua_path != NULL) {
+#if defined(LUA_GLOBALSINDEX)
lua_pushliteral(L, "LUA_PATH");
lua_pushstring(L, _lua_path);
+ lua_rawset(L, LUA_GLOBALSINDEX);
+#else
+ lua_pushstring(L, _lua_path);
+ lua_setglobal(L, "LUA_PATH");
+#endif
_lua_path = _free(_lua_path);
}
}
#if defined(LUA_GLOBALSINDEX)
- lua_rawset(L, LUA_GLOBALSINDEX);
-#else
- lua_pushglobaltable(L);
-#endif
lua_pushliteral(L, "print");
lua_pushcfunction(L, rpm_print);
-
-#if defined(LUA_GLOBALSINDEX)
lua_rawset(L, LUA_GLOBALSINDEX);
#else
- lua_pushglobaltable(L);
+ lua_pushcfunction(L, rpm_print);
+ lua_setglobal(L, "print");
#endif
+
rpmluaSetData(lua, "lua", lua);
/* load all standard RPM Lua script files */
@@ -351,6 +354,9 @@ void rpmluaSetVar(rpmlua _lua, rpmluav v
#if defined(LUA_GLOBALSINDEX)
if (lua->pushsize == 0)
lua_pushvalue(L, LUA_GLOBALSINDEX);
+#else
+ if (lua->pushsize == 0)
+ lua_pushglobaltable(L);
#endif
if (pushvar(L, var->keyType, &var->key) != -1) {
if (pushvar(L, var->valueType, &var->value) != -1)
@@ -1039,14 +1045,15 @@ static int rpm_print (lua_State *L)
lua_getglobal(L, "tostring");
for (i = 1; i <= n; i++) {
const char *s;
+ size_t l;
lua_pushvalue(L, -1); /* function to be called */
lua_pushvalue(L, i); /* value to print */
lua_call(L, 1, 1);
- s = lua_tostring(L, -1); /* get result */
+ s = lua_tolstring(L, -1, &l); /* get result */
if (s == NULL)
return luaL_error(L, "`tostring' must return a string to `print'");
if (lua->storeprint) {
- size_t sl = lua_rawlen(L, -1);
+ size_t sl = l;
if ((size_t)(lua->printbufused+sl+1) > lua->printbufsize) {
lua->printbufsize += sl+512;
lua->printbuf = (char *) xrealloc(lua->printbuf, lua->printbufsize);

View File

@@ -96,6 +96,7 @@ SRC_URI = "http://www.rpm5.org/files/rpm/rpm-5.4/rpm-5.4.14-0.20131024.src.rpm;e
file://rpm-realpath.patch \
file://0001-using-poptParseArgvString-to-parse-the-_gpg_check_pa.patch \
file://no-ldflags-in-pkgconfig.patch \
file://rpm-lua-fix-print.patch \
"
# Uncomment the following line to enable platform score debugging