Hexchat: ядро выгружено на Arch Linux с lua

Созданный на 2 апр. 2021  ·  14Комментарии  ·  Источник: hexchat/hexchat

В последней версии Arch Linux с установленным пакетом lua hexchat не запускается, а вылетает со следующей ошибкой:

PANIC: unprotected error in call to Lua API (attempt to call a nil value)
Aborted (core dumped)

Обратная трассировка:

(gdb) bt
#0  0x00007ffff6fc9ef5 in raise () at /usr/lib/libc.so.6
#1  0x00007ffff6fb3862 in abort () at /usr/lib/libc.so.6
#2  0x00007fffe4c9e026 in  () at /usr/lib/liblua.so.5.4
#3  0x00007fffe4ca52ca in  () at /usr/lib/liblua.so.5.4
#4  0x00007fffe4ca53e4 in  () at /usr/lib/liblua.so.5.4
#5  0x00007fffe4ca5461 in  () at /usr/lib/liblua.so.5.4
#6  0x00007fffe4ca5542 in  () at /usr/lib/liblua.so.5.4
#7  0x00007fffe4ca61bb in  () at /usr/lib/liblua.so.5.4
#8  0x00007fffe4ca6632 in  () at /usr/lib/liblua.so.5.4
#9  0x00007fffe4ca6a17 in  () at /usr/lib/liblua.so.5.4
#10 0x00007fffe4ca7b45 in  () at /usr/lib/liblua.so.5.4
#11 0x00007fffe4c9e58d in lua_settop () at /usr/lib/liblua.so.5.4
#12 0x00007fffe4d0ad49 in patch_clibs (L=0x555556852208) at ../hexchat/plugins/lua/lua.c:1194
#13 prepare_state (L=0x555556852208, info=0x5555567cc1f0) at ../hexchat/plugins/lua/lua.c:1258
#14 0x00007fffe4d0b5ad in create_interpreter () at ../hexchat/plugins/lua/lua.c:1480
#15 0x00007fffe4d0d36b in hexchat_plugin_init (arg=0x0, version=0x5555556f3f70, description=0x5555556f3f68, name=0x5555556f3f60, plugin_handle=0x5555556f3e00) at ../hexchat/plugins/lua/lua.c:1731
#16 hexchat_plugin_init (plugin_handle=plugin_handle@entry=0x5555556f3e00, name=name@entry=0x5555556f3f60, description=description@entry=0x5555556f3f68, version=version@entry=0x5555556f3f70, arg=arg@entry=0x0)
    at ../hexchat/plugins/lua/lua.c:1701
#17 0x00005555555e1780 in plugin_add (sess=0x555555771000, filename=<optimized out>, handle=0x555556738a00, init_func=0x7fffe4d0d210 <hexchat_plugin_init>, deinit_func=0x7fffe4d0d4b0 <hexchat_plugin_deinit>, arg=0x0, fake=0)
    at ../hexchat/src/common/plugin.c:296
#18 0x00005555555e188a in plugin_load (sess=0x555555771000, filename=0x5555567faf70 "/usr/lib/hexchat/plugins/lua.so", arg=0x0) at ../hexchat/src/common/plugin.c:411
#19 0x00005555555e1aeb in plugin_auto_load_cb (filename=0x5555567faf70 "/usr/lib/hexchat/plugins/lua.so") at ../hexchat/src/common/plugin.c:423
#20 0x00005555555e92fe in for_files (dirname=0x555555607c01 "/usr/lib/hexchat/plugins", mask=0x555555607c29 "*.so", callback=0x5555555e1ad0 <plugin_auto_load_cb>) at ../hexchat/src/common/util.c:653
#21 0x00005555555e21ee in plugin_auto_load (sess=<optimized out>) at ../hexchat/src/common/plugin.c:467
#22 0x00005555555ccf29 in irc_init (sess=0x555555771000) at ../hexchat/src/common/hexchat.c:446
#23 new_ircwindow (serv=0x555555758300, serv@entry=0x0, name=name@entry=0x0, type=type@entry=1, focus=focus@entry=0) at ../hexchat/src/common/hexchat.c:547
#24 0x0000555555581823 in xchat_init () at ../hexchat/src/common/hexchat.c:977
#25 main (argc=<optimized out>, argv=0x7fffffffcf30) at ../hexchat/src/common/hexchat.c:1139

Версия Lua:

$ lua -v
Lua 5.4.3  Copyright (C) 1994-2021 Lua.org, PUC-Rio

Версия Hexchat:

$ hexchat -v
hexchat 2.14.3

Что интересно, тестирование в Docker вроде работает:

docker run -it --rm archlinux sh -c 'pacman -Sy --noconfirm hexchat lua && hexchat-text'

Все 14 Комментарий

Обратите внимание, что Lua 5.4.3 является частью репозитория тестирования Arch. И именно в этом вы видите проблему.

В стабильном репозитории Arch по-прежнему используется lua 5.4.2.

Действительно, вроде с lua 5.4.2 все работает нормально, с lua 5.4.3 вылетает.

Кстати, помогает ли перекомпиляция hexchat для нового lua?

Нет, я пробовал, и это не помогло. Кроме того, просто понижение версии lua на моей машине заставляет его работать, поэтому я подозреваю ошибку в lua.

Я пробовал разделить это пополам, но потерпел неудачу, перестроение lua на Arch из исходных текстов вместо архива выпуска мучительно: разочаровано:

Вот информация о дампе, созданная с помощью библиотеки lua без очистки:

Stack trace of thread 119974:
#0  0x00007f038bbd3ef5 raise (libc.so.6 + 0x3cef5)
#1  0x00007f038bbbd862 abort (libc.so.6 + 0x26862)
#2  0x00007f0388b73026 luaD_throw.cold (liblua.so.5.4 + 0x8026)
#3  0x00007f0388b7a2ca luaG_errormsg (liblua.so.5.4 + 0xf2ca)
#4  0x00007f0388b7a3e4 luaG_runerror (liblua.so.5.4 + 0xf3e4)
#5  0x00007f0388b7a461 luaG_typeerror (liblua.so.5.4 + 0xf461)
#6  0x00007f0388b7a542 luaG_callerror (liblua.so.5.4 + 0xf542)
#7  0x00007f0388b7b1bb luaD_tryfuncTM (liblua.so.5.4 + 0x101bb)
#8  0x00007f0388b7b632 luaD_precall (liblua.so.5.4 + 0x10632)
#9  0x00007f0388b7ba17 luaD_callnoyield (liblua.so.5.4 + 0x10a17)
#10 0x00007f0388b7cb45 luaF_close (liblua.so.5.4 + 0x11b45)
#11 0x00007f0388b7358d lua_settop (liblua.so.5.4 + 0x858d)
#12 0x00007f0388cb0d49 n/a (lua.so + 0x4d49)
#13 0x00007f0388cb336b hexchat_plugin_init (lua.so + 0x736b)
#14 0x0000559f75d1f8c0 plugin_add (hexchat + 0x8d8c0)
#15 0x0000559f75d1f9ca plugin_load (hexchat + 0x8d9ca)
#16 0x0000559f75d1fc2b n/a (hexchat + 0x8dc2b)
#17 0x0000559f75d2743e for_files (hexchat + 0x9543e)
#18 0x0000559f75d2032e plugin_auto_load (hexchat + 0x8e32e)
#19 0x0000559f75d0b069 new_ircwindow (hexchat + 0x79069)
#20 0x0000559f75d2965b servlist_connect (hexchat + 0x9765b)
#21 0x0000559f75ced893 n/a (hexchat + 0x5b893)
#22 0x00007f038c97dddf g_closure_invoke (libgobject-2.0.so.0 + 0x12ddf)
#23 0x00007f038c9a6fbd n/a (libgobject-2.0.so.0 + 0x3bfbd)
#24 0x00007f038c99acad g_signal_emit_valist (libgobject-2.0.so.0 + 0x2fcad)
#25 0x00007f038c99b210 g_signal_emit (libgobject-2.0.so.0 + 0x30210)
#26 0x00007f038c45d596 n/a (libgtk-x11-2.0.so.0 + 0x88596)
#27 0x00007f038c97dddf g_closure_invoke (libgobject-2.0.so.0 + 0x12ddf)
#28 0x00007f038c9a6c2c n/a (libgobject-2.0.so.0 + 0x3bc2c)
#29 0x00007f038c99acad g_signal_emit_valist (libgobject-2.0.so.0 + 0x2fcad)
#30 0x00007f038c99b210 g_signal_emit (libgobject-2.0.so.0 + 0x30210)
#31 0x00007f038c45c46a n/a (libgtk-x11-2.0.so.0 + 0x8746a)
#32 0x00007f038c50b0a8 n/a (libgtk-x11-2.0.so.0 + 0x1360a8)
#33 0x00007f038c97dddf g_closure_invoke (libgobject-2.0.so.0 + 0x12ddf)
#34 0x00007f038c9a69cb n/a (libgobject-2.0.so.0 + 0x3b9cb)
#35 0x00007f038c99a2db g_signal_emit_valist (libgobject-2.0.so.0 + 0x2f2db)
#36 0x00007f038c99b210 g_signal_emit (libgobject-2.0.so.0 + 0x30210)
#37 0x00007f038c630275 n/a (libgtk-x11-2.0.so.0 + 0x25b275)
#38 0x00007f038c5096d6 gtk_propagate_event (libgtk-x11-2.0.so.0 + 0x1346d6)
#39 0x00007f038c509b4b gtk_main_do_event (libgtk-x11-2.0.so.0 + 0x134b4b)
#40 0x00007f038c3783be n/a (libgdk-x11-2.0.so.0 + 0x5e3be)
#41 0x00007f038c889f9c g_main_context_dispatch (libglib-2.0.so.0 + 0x53f9c)
#42 0x00007f038c8dda49 n/a (libglib-2.0.so.0 + 0xa7a49)
#43 0x00007f038c889503 g_main_loop_run (libglib-2.0.so.0 + 0x53503)
#44 0x00007f038c5089fe gtk_main (libgtk-x11-2.0.so.0 + 0x1339fe)
#45 0x0000559f75ccd4da fe_main (hexchat + 0x3b4da)
#46 0x0000559f75cbf828 main (hexchat + 0x2d828)
#47 0x00007f038bbbeb25 __libc_start_main (libc.so.6 + 0x27b25)
#48 0x0000559f75cbf99e _start (hexchat + 0x2d99e)

Мой lua делит пополам этот коммит lua как корень сбоя https://github.com/lua/lua/commit/511d53a826760dd11cd82947184583e2d094e2d2

Одна вещь, которая произошла в этом коммите, заключается в том, что lua начал принудительно применять режим совместимости 5.4.0, и следующее поведение совместимости было отброшено . Интересно, нужно ли что-то отрегулировать на стороне hexchat.

For compatibility reasons,
this function may close slots marked as to-be-closed @see{lua_toclose},
and therefore it can run arbitrary code.
You should not rely on this behavior:
Instead, always close to-be-closed slots explicitly,
with @Lid{lua_closeslot}, before removing them from the stack.

cc @culb, у кого есть идеи, как это изменение влияет на плагин hexchat.

@invidian Lua makefile не позволяет создавать * .so (используется в Arch), поэтому для деления пополам мне пришлось создать * .so вручную. Вот как я провел свое деление пополам:

cd lua-sources
# loop
git clean -xdf
make MYCFLAGS="-fPIC" -j
cc -shared -ldl -o liblua.so.5.4.3 lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o \
        lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o \
        ltm.o lundump.o lvm.o lzio.o ltests.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o lstrlib.o \
        lutf8lib.o loadlib.o lcorolib.o linit.o lauxlib.o
sudo mv liblua.so.5.4.3 /usr/lib/liblua.so.5.4.3
# test hexchat here
git bisect (good|bad)
# goto beginning of the loop

Вот мой журнал пополам

git bisect start
# bad: [eadd8c7178c79c814ecca9652973a9b9dd4cc71b] Added option LUA_NOBUILTIN
git bisect bad eadd8c7178c79c814ecca9652973a9b9dd4cc71b
# good: [9d067ab73b6befa0a5418f1df35c711f6c6918b3] Optimization for 'n^2'
git bisect good 9d067ab73b6befa0a5418f1df35c711f6c6918b3
# good: [1f81baffadad9d955b030a1a29b9b06042a66552] Janitorial work
git bisect good 1f81baffadad9d955b030a1a29b9b06042a66552
# good: [5205f073c57ae4b69e90d35c02e3a1a1cca44eb4] Don't use tointegerns when luaV_tointegerns will do
git bisect good 5205f073c57ae4b69e90d35c02e3a1a1cca44eb4
# good: [b7eb21c1efbd33affb87479fc6055914fe9ab009] Normalization of metamethod typography in the manual
git bisect good b7eb21c1efbd33affb87479fc6055914fe9ab009
# bad: [a7b8b27dd39f45b9464ffc4226b0616c3ffe5ad7] Uses of "likely" in macros active to all users
git bisect bad a7b8b27dd39f45b9464ffc4226b0616c3ffe5ad7
# good: [f5df7f91f70234850484d26caf24e71e001e5304] Wrong assertion in 'getbaseline'
git bisect good f5df7f91f70234850484d26caf24e71e001e5304
# bad: [511d53a826760dd11cd82947184583e2d094e2d2] lua_settop/lua_pop closes to-be-closed variables
git bisect bad 511d53a826760dd11cd82947184583e2d094e2d2
# first bad commit: [511d53a826760dd11cd82947184583e2d094e2d2] lua_settop/lua_pop closes to-be-closed variables

Кросс-публикация https://bugs.archlinux.org/task/70213 ответ на @invidian

Я бы не назвал это «регрессией lua». Из моих выводов выше Lua 5.4.3 отказался от поведения совместимости с lua 5.3. А разработчики Lua известны своей агрессивной эволюцией языка, не уделяя слишком много внимания обратной совместимости.

Итак, если будет подтверждено, что причиной этого сбоя является нарушение совместимости, есть 2 варианта:

Возможно, стоит проконсультироваться с вышестоящим Lua об этом изменении, чтобы узнать, как пользователи ожидают справиться с этим нарушением совместимости.

Кажется, что следующий патч работает как с lua 5.4.2, так и с 5.4.3:

diff --git plugins/lua/lua.c plugins/lua/lua.c
index d73fbb23..681576cd 100644
--- plugins/lua/lua.c
+++ plugins/lua/lua.c
@@ -1193,7 +1193,6 @@ static void patch_clibs(lua_State *L)
                }
                lua_pop(L, 1);
        }
-       lua_pop(L, 1);
 }

 static GPtrArray *scripts;

Мне не удалось запустить блок if(lua_type(L, -2) == LUA_TLIGHTUSERDATA && lua_type(L, -1) == LUA_TTABLE) чтобы узнать, нужно ли вызывать lua_pop перед break .

На самом деле, кажется, слишком много попсовиков. Это должна быть правильная реализация:

static void patch_clibs(lua_State *L)
{
    lua_pushnil(L); /* push nil key to start iteration */
    while(lua_next(L, LUA_REGISTRYINDEX)) /* pop key. push key and value if ret != 0 */
    {
        if(lua_type(L, -2) == LUA_TLIGHTUSERDATA && lua_type(L, -1) == LUA_TTABLE)
        {
            lua_setfield(L, LUA_REGISTRYINDEX, "_CLIBS"); /* pop value */
                lua_pop(L, 1); /* pop key */
            break;
        }
        lua_pop(L, 1); /* pop value */
    }
}

Создано # 2559, насколько я понимаю, это ошибка последней версии Lua, которую необходимо исправить.

@anatol интересно. Мое деление пополам указывало на lua / lua @ 81c6021fb40a254d9a586b0cb53453bba8973d80, и кажется, что возврат либо этой фиксации, либо lua / lua @ 511d53a, на который вы указали, устраняет проблему.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги