Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package lua-luv for openSUSE:Factory checked in at 2023-12-06 23:47:44 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/lua-luv (Old) and /work/SRC/openSUSE:Factory/.lua-luv.new.25432 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "lua-luv" Wed Dec 6 23:47:44 2023 rev:14 rq:1131025 version:MACRO Changes: -------- --- /work/SRC/openSUSE:Factory/lua-luv/lua-luv.changes 2022-02-13 19:51:41.570316606 +0100 +++ /work/SRC/openSUSE:Factory/.lua-luv.new.25432/lua-luv.changes 2023-12-06 23:48:04.438924794 +0100 @@ -1,0 +2,28 @@ +Mon Dec 4 10:05:58 UTC 2023 - Noah Dörr <archecra...@gmail.com> + +- Update to version 1.45.0-0: + * Add access(2) constants to the constants table + * thread_setaffinity: Allow affinity param to have a length less + than cpumask_size() + * avoid thread be released before it done + * fix thread arguments limit + * fix segfault in luv_check_handle/luv_check_stream + * add uv.errno table contains all uv errno value + * segfault on new_thread and worker.queue + * segfault on luv_check_handle + * uv.spawn example code in docs is broken + * pthread_create possible leak +- Update to version 1.44.2-1: + * Removed output to stderr from poll callback +- Update to version 1.44.2-0: + * Adds new function uv.available_parallelism + * uv.os_get_passwd: Better handling of gid/uid + * uv.fs_opendir and friends: Fix race condition when uv_dir_t + pointer doesn't change between allocations + * Fix leak from fs_scandir whenever it wasn't fully iterated via + fs_scandir_next + * Fix two possible fs_scandir segfaults +- Add luv-fix-segfault-from-gc.patch fixing segfaults + (gh#luvit/luv#599 and gh#luvit/luv#644) + +------------------------------------------------------------------- Old: ---- luv-1.43.0-0.tar.gz New: ---- luv-1.45.0-0.tar.gz luv-fix-segfault-from-gc.patch BETA DEBUG BEGIN: New: * Fix two possible fs_scandir segfaults - Add luv-fix-segfault-from-gc.patch fixing segfaults (gh#luvit/luv#599 and gh#luvit/luv#644) BETA DEBUG END: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ lua-luv.spec ++++++ --- /var/tmp/diff_new_pack.HbSc54/_old 2023-12-06 23:48:05.722972131 +0100 +++ /var/tmp/diff_new_pack.HbSc54/_new 2023-12-06 23:48:05.726972279 +0100 @@ -1,7 +1,7 @@ # -# spec file for package lua-luv +# spec file # -# Copyright (c) 2021 SUSE LLC +# Copyright (c) 2023 SUSE LLC # Copyright (c) 2012 Togan Muftuoglu tog...@opensuse.org # # All modifications and additions to the file contributed by third parties @@ -16,11 +16,12 @@ # Please submit bugfixes or comments via https://bugs.opensuse.org/ # + %if %{lua_version_nodots} == 51 %define lua_default 1 %endif %define mod_name luv -%define upver 1.43.0-0 +%define upver 1.45.0-0 %define fixver %(echo %{upver}|sed 's|-|~|g') %define libluv_sover 1 %define flavor @BUILD_FLAVOR@%{nil} @@ -39,12 +40,17 @@ Source0: https://github.com/luvit/%{mod_name}/releases/download/%{upver}/%{mod_name}-%{upver}.tar.gz Patch0: lua-link.patch Patch1: luv-module-install.patch +# PATCH-FIX-UPSTREAM luv-fix-segfault-from-gc.patch gh#luvit/luv#599 mc...@suse.com +# merged https://github.com/luvit/luv/commit/ff5e90249e08 and +# https://github.com/luvit/luv/commit/ecf3988c0be9 +# Also closes gh#luvit/luv#644 +Patch2: luv-fix-segfault-from-gc.patch +BuildRequires: %{flavor}-compat-5.3 +BuildRequires: %{flavor}-devel +BuildRequires: %{flavor}-luafilesystem BuildRequires: cmake BuildRequires: libuv-devel BuildRequires: lua-macros -BuildRequires: %{flavor}-devel -BuildRequires: %{flavor}-luafilesystem -BuildRequires: %{flavor}-compat-5.3 Requires: %{flavor} %lua_provides %if "%{flavor}" == "lua" ++++++ luv-1.43.0-0.tar.gz -> luv-1.45.0-0.tar.gz ++++++ ++++ 33402 lines of diff (skipped) ++++++ luv-fix-segfault-from-gc.patch ++++++ diff --git a/src/handle.c b/src/handle.c index 9180da34..0977a565 100644 --- a/src/handle.c +++ b/src/handle.c @@ -88,13 +88,19 @@ static int luv_is_closing(lua_State* L) { return 1; } +static void luv_handle_free(uv_handle_t* handle); + static void luv_close_cb(uv_handle_t* handle) { lua_State* L; luv_handle_t* data = (luv_handle_t*)handle->data; if (!data) return; L = data->ctx->L; - luv_call_callback(L, data, LUV_CLOSED, 0); - luv_unref_handle(L, data); + if(data->ref > 0) { + luv_call_callback(L, data, LUV_CLOSED, 0); + luv_unref_handle(L, data); + } else { + luv_handle_free(handle); + } } static int luv_close(lua_State* L) { @@ -127,12 +133,13 @@ static void luv_gc_cb(uv_handle_t* handle) { static int luv_handle_gc(lua_State* L) { uv_handle_t** udata = (uv_handle_t**)lua_touserdata(L, 1); uv_handle_t* handle = *udata; + luv_handle_t* data = (luv_handle_t*)handle->data; // Only cleanup if the handle hasn't been cleaned up yet. - if (handle) { + if (data->ref == LUA_NOREF) { if (!uv_is_closing(handle)) { // If the handle is not closed yet, close it first before freeing memory. - uv_close(handle, luv_gc_cb); + uv_close(handle, luv_handle_free); } else { // Otherwise, free the memory right away. @@ -140,6 +147,10 @@ static int luv_handle_gc(lua_State* L) { } // Mark as cleaned up by wiping the dangling pointer. *udata = NULL; + } else { + // os.exit maybe cause gc before close_cb + // use LUA_REFNIL to tell close_cb to free memory. + data->ref = LUA_REFNIL; } return 0; diff --git a/src/lhandle.c b/src/lhandle.c index 92b725a9..1c4cc800 100644 --- a/src/lhandle.c +++ b/src/lhandle.c @@ -104,6 +104,7 @@ static void luv_call_callback(lua_State* L, luv_handle_t* data, luv_callback_id static void luv_unref_handle(lua_State* L, luv_handle_t* data) { luaL_unref(L, LUA_REGISTRYINDEX, data->ref); + data->ref = LUA_NOREF; luaL_unref(L, LUA_REGISTRYINDEX, data->callbacks[0]); luaL_unref(L, LUA_REGISTRYINDEX, data->callbacks[1]); } diff --git a/src/fs.c b/src/fs.c index 8ef36145..af59caa9 100644 --- a/src/fs.c +++ b/src/fs.c @@ -363,6 +363,9 @@ static int push_fs_result(lua_State* L, uv_fs_t* req) { return 1; } case UV_FS_READDIR: { + luaL_unref(L, LUA_REGISTRYINDEX, data->data_ref); + data->data_ref = LUA_NOREF; + if(req->result > 0) { size_t i; uv_dir_t *dir = (uv_dir_t*)req->ptr; @@ -938,6 +941,11 @@ static int luv_fs_readdir(lua_State* L) { req = (uv_fs_t*)lua_newuserdata(L, uv_req_size(UV_FS)); req->data = luv_setup_req(L, ctx, ref); + + // ref the luv_dir_t so it doesn't get garbage collected before the readdir cb + lua_pushvalue(L, 1); + ((luv_req_t*)req->data)->data_ref = luaL_ref(L, LUA_REGISTRYINDEX); + FS_CALL(uv_fs_readdir, req, dir->handle); } p(stat)