From ca76844b9ed9d899662a29583df085e0a8ce8bbd Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 25 Jun 2024 15:31:54 +0100 Subject: [PATCH] [Minor] Accept `rspamd_text` as long as Lua native strings --- src/lua/lua_cryptobox.c | 37 ++++++++++++------------------------- src/lua/lua_parsers.c | 32 ++++++++++---------------------- src/lua/lua_regexp.c | 21 ++++++++++----------- src/lua/lua_task.c | 20 +++++++++----------- 4 files changed, 41 insertions(+), 69 deletions(-) diff --git a/src/lua/lua_cryptobox.c b/src/lua/lua_cryptobox.c index bad7d7024..0cc9245f7 100644 --- a/src/lua/lua_cryptobox.c +++ b/src/lua/lua_cryptobox.c @@ -1,11 +1,11 @@ -/*- - * Copyright 2016 Vsevolod Stakhov +/* + * Copyright 2024 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, @@ -341,12 +341,13 @@ lua_cryptobox_pubkey_create(lua_State *L) { LUA_TRACE_POINT; struct rspamd_cryptobox_pubkey *pkey = NULL, **ppkey; - const char *buf, *arg; - gsize len; + const char *arg; int type = RSPAMD_KEYPAIR_SIGN; int alg = RSPAMD_CRYPTOBOX_MODE_25519; - buf = luaL_checklstring(L, 1, &len); + struct rspamd_lua_text *buf; + + buf = lua_check_text_or_string(L, 1); if (buf != NULL) { if (lua_type(L, 2) == LUA_TSTRING) { /* keypair type */ @@ -371,7 +372,7 @@ lua_cryptobox_pubkey_create(lua_State *L) } } - pkey = rspamd_pubkey_from_base32(buf, len, type, alg); + pkey = rspamd_pubkey_from_base32(buf->start, buf->len, type, alg); if (pkey == NULL) { msg_err("cannot load pubkey from string"); @@ -803,26 +804,12 @@ lua_cryptobox_signature_create(lua_State *L) LUA_TRACE_POINT; rspamd_fstring_t *sig, **psig; struct rspamd_lua_text *t; - const char *data; - gsize dlen; - - if (lua_isuserdata(L, 1)) { - t = lua_check_text(L, 1); - if (!t) { - return luaL_error(L, "invalid arguments"); - } - - data = t->start; - dlen = t->len; - } - else { - data = luaL_checklstring(L, 1, &dlen); - } + t = lua_check_text_or_string(L, 1); - if (data != NULL) { - if (dlen == rspamd_cryptobox_signature_bytes(RSPAMD_CRYPTOBOX_MODE_25519)) { - sig = rspamd_fstring_new_init(data, dlen); + if (t != NULL) { + if (t->len == rspamd_cryptobox_signature_bytes(RSPAMD_CRYPTOBOX_MODE_25519)) { + sig = rspamd_fstring_new_init(t->start, t->len); psig = lua_newuserdata(L, sizeof(rspamd_fstring_t *)); rspamd_lua_setclass(L, rspamd_cryptobox_signature_classname, -1); *psig = sig; diff --git a/src/lua/lua_parsers.c b/src/lua/lua_parsers.c index f77b36952..babc955be 100644 --- a/src/lua/lua_parsers.c +++ b/src/lua/lua_parsers.c @@ -1,11 +1,11 @@ -/*- - * Copyright 2020 Vsevolod Stakhov +/* + * Copyright 2024 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, @@ -102,8 +102,7 @@ static const struct luaL_reg parserslib_f[] = { int lua_parsers_tokenize_text(lua_State *L) { LUA_TRACE_POINT; - const char *in = NULL; - gsize len = 0, pos, ex_len, i; + gsize pos, ex_len, i; GList *exceptions = NULL, *cur; struct rspamd_lua_text *t; struct rspamd_process_exception *ex; @@ -111,21 +110,10 @@ int lua_parsers_tokenize_text(lua_State *L) GArray *res; rspamd_stat_token_t *w; - if (lua_type(L, 1) == LUA_TSTRING) { - in = luaL_checklstring(L, 1, &len); - } - else if (lua_type(L, 1) == LUA_TUSERDATA) { - t = lua_check_text(L, 1); - - if (t) { - in = t->start; - len = t->len; - } - } + t = lua_check_text_or_string(L, 1); - if (in == NULL) { - lua_pushnil(L); - return 1; + if (t == NULL) { + return luaL_error(L, "invalid arguments"); } if (lua_gettop(L) > 1 && lua_type(L, 2) == LUA_TTABLE) { @@ -161,11 +149,11 @@ int lua_parsers_tokenize_text(lua_State *L) UErrorCode uc_err = U_ZERO_ERROR; utext_openUTF8(&utxt, - in, - len, + t->start, + t->len, &uc_err); - res = rspamd_tokenize_text((char *) in, len, + res = rspamd_tokenize_text((char *) t->start, t->len, &utxt, RSPAMD_TOKENIZE_UTF, NULL, exceptions, diff --git a/src/lua/lua_regexp.c b/src/lua/lua_regexp.c index 4a209057e..ad45a594f 100644 --- a/src/lua/lua_regexp.c +++ b/src/lua/lua_regexp.c @@ -147,27 +147,26 @@ lua_regexp_import_glob(lua_State *L) LUA_TRACE_POINT; rspamd_regexp_t *re; struct rspamd_lua_regexp *new, **pnew; - const char *string, *flags_str = NULL; + const char *flags_str = NULL; char *escaped; - gsize pat_len; GError *err = NULL; - string = luaL_checklstring(L, 1, &pat_len); - - if (lua_gettop(L) == 2) { - flags_str = luaL_checkstring(L, 2); - } + struct rspamd_lua_text *t = lua_check_text(L, 1); - if (string) { - escaped = rspamd_str_regexp_escape(string, pat_len, NULL, + if (t) { + if (lua_gettop(L) == 2) { + flags_str = luaL_checkstring(L, 2); + } + escaped = rspamd_str_regexp_escape(t->start, t->len, NULL, RSPAMD_REGEXP_ESCAPE_GLOB | RSPAMD_REGEXP_ESCAPE_UTF); re = rspamd_regexp_new(escaped, flags_str, &err); if (re == NULL) { lua_pushnil(L); - msg_info("cannot parse regexp: %s, error: %s", - string, + msg_info("cannot parse regexp: %*s, error: %s", + (int) t->len, + t->start, err == NULL ? "undefined" : err->message); g_error_free(err); g_free(escaped); diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c index dc41d4ab7..ae045e458 100644 --- a/src/lua/lua_task.c +++ b/src/lua/lua_task.c @@ -1809,13 +1809,11 @@ lua_task_load_from_string(lua_State *L) { LUA_TRACE_POINT; struct rspamd_task *task = NULL, **ptask; - const char *str_message; - gsize message_len; struct rspamd_config *cfg = NULL; - str_message = luaL_checklstring(L, 1, &message_len); + struct rspamd_lua_text *t = lua_check_text_or_string(L, 1); - if (str_message) { + if (t) { if (lua_type(L, 2) == LUA_TUSERDATA) { gpointer p; @@ -1827,9 +1825,9 @@ lua_task_load_from_string(lua_State *L) } task = rspamd_task_new(NULL, cfg, NULL, NULL, NULL, FALSE); - task->msg.begin = g_malloc(message_len); - memcpy((char *) task->msg.begin, str_message, message_len); - task->msg.len = message_len; + task->msg.begin = g_malloc(t->len); + memcpy((char *) task->msg.begin, t->start, t->len); + task->msg.len = t->len; rspamd_mempool_add_destructor(task->task_pool, lua_task_free_dtor, (gpointer) task->msg.begin); } @@ -2642,7 +2640,7 @@ struct rspamd_url_query_to_inject_cbd { static gboolean inject_url_query_callback(struct rspamd_url *url, gsize start_offset, - gsize end_offset, gpointer ud) + gsize end_offset, gpointer ud) { struct rspamd_url_query_to_inject_cbd *cbd = (struct rspamd_url_query_to_inject_cbd *) ud; @@ -2661,7 +2659,7 @@ inject_url_query_callback(struct rspamd_url *url, gsize start_offset, static void inject_url_query(struct rspamd_task *task, struct rspamd_url *url, - GPtrArray *part_urls) + GPtrArray *part_urls) { if (url->querylen > 0) { struct rspamd_url_query_to_inject_cbd cbd; @@ -2692,11 +2690,11 @@ lua_task_inject_url(lua_State *L) if (lua_isuserdata(L, 3)) { /* We also have a mime part there */ mpart = *((struct rspamd_mime_part **) - rspamd_lua_check_udata_maybe(L, 3, rspamd_mimepart_classname)); + rspamd_lua_check_udata_maybe(L, 3, rspamd_mimepart_classname)); } if (task && task->message && url && url->url) { if (rspamd_url_set_add_or_increase(MESSAGE_FIELD(task, urls), url->url, false)) { - if(mpart && mpart->urls) { + if (mpart && mpart->urls) { inject_url_query(task, url->url, mpart->urls); } } -- 2.39.5