From eb6f412f8f2002b16f25dadf0464b4cde5797d7d Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 18 Aug 2023 13:15:20 +0100 Subject: [PATCH] [Minor] Allow rspamd_lua_require_function to work without function --- src/libutil/cxx/hash_util.hxx | 9 ++++--- src/lua/lua_common.c | 48 ++++++++++++++++++++++------------- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/libutil/cxx/hash_util.hxx b/src/libutil/cxx/hash_util.hxx index 972165850..05f3d97ae 100644 --- a/src/libutil/cxx/hash_util.hxx +++ b/src/libutil/cxx/hash_util.hxx @@ -1,11 +1,11 @@ -/*- - * Copyright 2021 Vsevolod Stakhov +/* + * Copyright 2023 Vsevolod Stakhov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -59,6 +59,7 @@ struct smart_ptr_equal { template struct smart_ptr_hash { using is_transparent = void; /* We want to find values in a set of shared_ptr by reference */ + using is_avalanching = void; auto operator()(const std::shared_ptr &a) const { return std::hash()(*a); @@ -92,7 +93,7 @@ struct smart_str_equal { struct smart_str_hash { using is_transparent = void; - using is_avalanching = typename ankerl::unordered_dense::hash::is_avalanching; + using is_avalanching = void; auto operator()(const std::string &a) const { return ankerl::unordered_dense::hash()(a); diff --git a/src/lua/lua_common.c b/src/lua/lua_common.c index d41e69822..5991af656 100644 --- a/src/lua/lua_common.c +++ b/src/lua/lua_common.c @@ -2251,33 +2251,45 @@ rspamd_lua_require_function(lua_State *L, const gchar *modname, lua_remove(L, err_pos); /* Now we should have a table with results */ - if (!lua_istable(L, -1)) { - msg_warn("require of %s.%s failed: not a table but %s", modname, - funcname, lua_typename(L, lua_type(L, -1))); + if (funcname) { + if (!lua_istable(L, -1)) { + msg_warn("require of %s.%s failed: not a table but %s", modname, + funcname, lua_typename(L, lua_type(L, -1))); - lua_pop(L, 1); + lua_pop(L, 1); - return FALSE; - } + return FALSE; + } - table_pos = lua_gettop(L); - lua_pushstring(L, funcname); - lua_gettable(L, -2); + table_pos = lua_gettop(L); + lua_pushstring(L, funcname); + lua_gettable(L, -2); + + if (lua_type(L, -1) == LUA_TFUNCTION) { + /* Remove table, preserve just a function */ + lua_remove(L, table_pos); + + return TRUE; + } + else { + msg_warn("require of %s.%s failed: not a function but %s", modname, + funcname, lua_typename(L, lua_type(L, -1))); + } - if (lua_type(L, -1) == LUA_TFUNCTION) { - /* Remove table, preserve just a function */ - lua_remove(L, table_pos); + lua_pop(L, 2); + return FALSE; + } + else if (lua_isfunction(L, -1)) { return TRUE; } else { - msg_warn("require of %s.%s failed: not a function but %s", modname, - funcname, lua_typename(L, lua_type(L, -1))); - } - - lua_pop(L, 2); + msg_warn("require of %s failed: not a function but %s", modname, + lua_typename(L, lua_type(L, -1))); + lua_pop(L, 1); - return FALSE; + return FALSE; + } } gint rspamd_lua_function_ref_from_str(lua_State *L, const gchar *str, gsize slen, -- 2.39.5