* @return
*/
struct rspamd_lua_text *lua_check_text_or_string (lua_State *L, gint pos);
-/* Creates and *pushes* new rspamd text, data is copied if RSPAMD_TEXT_FLAG_OWN is in flags*/
+/**
+ * Create new text object
+ * @param L
+ * @param start
+ * @param len
+ * @param own
+ * @return
+ */
struct rspamd_lua_text *lua_new_text (lua_State *L, const gchar *start,
gsize len, gboolean own);
+/**
+ * Create new text object from task pool if allocation is needed
+ * @param task
+ * @param L
+ * @param start
+ * @param len
+ * @param own
+ * @return
+ */
+struct rspamd_lua_text * lua_new_text_task(lua_State *L, struct rspamd_task *task,
+ const gchar *start, gsize len, gboolean own);
/**
* Checks if a text has binary characters (non ascii and non-utf8 characters)
* @param t
if (task) {
if (task->message != NULL) {
- t = lua_newuserdata (L, sizeof (*t));
- rspamd_lua_setclass (L, "rspamd{text}", -1);
+
if (MESSAGE_FIELD (task, raw_headers_content).len > 0) {
g_assert (MESSAGE_FIELD (task, raw_headers_content).len <= task->msg.len);
- t->start = task->msg.begin + MESSAGE_FIELD (task, raw_headers_content).len;
- t->len = task->msg.len - MESSAGE_FIELD (task, raw_headers_content).len;
+ t = lua_new_text_task (L, task, task->msg.begin + MESSAGE_FIELD (task, raw_headers_content).len,
+ task->msg.len - MESSAGE_FIELD (task, raw_headers_content).len, FALSE);
}
else {
- t->len = task->msg.len;
- t->start = task->msg.begin;
+ t = lua_new_text_task (L, task, task->msg.begin,
+ task->msg.len, FALSE);
}
t->flags = 0;
else {
/* Push body it it is there */
if (task->msg.len > 0 && task->msg.begin != NULL) {
- lua_new_text (L, task->msg.begin, task->msg.len, FALSE);
+ lua_new_text_task (L, task->msg.begin, task->msg.len, FALSE);
}
else {
lua_pushnil (L);
return t;
}
+struct rspamd_lua_text *
+lua_new_text_task (lua_State *L, struct rspamd_task *task,
+ const gchar *start, gsize len, gboolean own)
+{
+ struct rspamd_lua_text *t;
+
+ t = lua_newuserdata (L, sizeof (*t));
+ t->flags = 0;
+
+ if (own) {
+ gchar *storage;
+
+ if (len > 0) {
+ storage = rspamd_mempool_alloc (task->task_pool, len);
+
+ if (start != NULL) {
+ memcpy (storage, start, len);
+ }
+
+ t->start = storage;
+ }
+ else {
+ t->start = "";
+ }
+ }
+ else {
+ t->start = start;
+ }
+
+ t->len = len;
+ rspamd_lua_setclass (L, "rspamd{text}", -1);
+
+ return t;
+}
+
bool
lua_is_text_binary(struct rspamd_lua_text *t)
{