commit 070192c: [Minor] Lua_cdb: Allow to use more data types as cdb keys/values
Vsevolod Stakhov
vsevolod at highsecure.ru
Wed Oct 20 10:35:08 UTC 2021
Author: Vsevolod Stakhov
Date: 2021-10-20 11:08:05 +0100
URL: https://github.com/rspamd/rspamd/commit/070192c87bd1618812ab4577256a2501e6bf88a5
[Minor] Lua_cdb: Allow to use more data types as cdb keys/values
---
src/lua/lua_cdb.c | 45 ++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 42 insertions(+), 3 deletions(-)
diff --git a/src/lua/lua_cdb.c b/src/lua/lua_cdb.c
index e0b9d9439..8fe271dd5 100644
--- a/src/lua/lua_cdb.c
+++ b/src/lua/lua_cdb.c
@@ -122,6 +122,45 @@ lua_check_cdb_builder (lua_State * L, int pos)
return ud ? ((struct cdb_make *)ud) : NULL;
}
+static const char *
+lua_cdb_get_input (lua_State *L, int pos, gsize *olen)
+{
+ int t = lua_type (L, pos);
+
+ switch (t) {
+ case LUA_TSTRING:
+ return lua_tolstring (L, pos, olen);
+ case LUA_TNUMBER: {
+ static char numbuf[sizeof(lua_Number)];
+ lua_Number n = lua_tonumber(L, pos);
+ memcpy(numbuf, &n, sizeof(numbuf));
+ *olen = sizeof(n);
+ return numbuf;
+ }
+ case LUA_TUSERDATA: {
+ void *p = rspamd_lua_check_udata_maybe (L, pos, "rspamd{text}");
+ if (p) {
+ struct rspamd_lua_text *t = (struct rspamd_lua_text *)p;
+ *olen = t->len;
+ return t->start;
+ }
+
+ p = rspamd_lua_check_udata_maybe (L, pos, "rspamd{int64}");
+ if (p) {
+ static char numbuf[sizeof(gint64)];
+
+ memcpy(numbuf, p, sizeof(numbuf));
+ *olen = sizeof(numbuf);
+ return numbuf;
+ }
+ }
+ default:
+ break;
+ }
+
+ return NULL;
+}
+
static gint
lua_cdb_create (lua_State *L)
{
@@ -200,7 +239,7 @@ lua_cdb_lookup (lua_State *L)
{
struct cdb *cdb = lua_check_cdb (L, 1);
gsize klen;
- const gchar *what = luaL_checklstring(L, 2, &klen);
+ const gchar *what = lua_cdb_get_input(L, 2, &klen);
if (!cdb || what == NULL) {
return lua_error (L);
@@ -275,8 +314,8 @@ lua_cdb_builder_add (lua_State *L)
{
struct cdb_make *cdbm = lua_check_cdb_builder(L, 1);
gsize data_sz, key_sz;
- const char *key = lua_tolstring (L, 2, &key_sz);
- const char *data = lua_tolstring (L, 3, &data_sz);
+ const char *key = lua_cdb_get_input (L, 2, &key_sz);
+ const char *data = lua_cdb_get_input (L, 3, &data_sz);
if (cdbm == NULL || key == NULL || data == NULL || cdbm->cdb_fd == -1) {
return luaL_error(L, "invalid arguments");
More information about the Commits
mailing list