rspamd_inet_addr_t *addr;
};
+#define RSPAMD_TEXT_FLAG_OWN (1 << 0)
+#define RSPAMD_TEXT_FLAG_MMAPED (1 << 1)
struct rspamd_lua_text {
const gchar *start;
guint len;
- gboolean own;
+ guint flags;
};
struct rspamd_lua_url {
t = lua_newuserdata (L, sizeof (*t));
t->start = bl->style.start;
t->len = bl->style.len;
- t->own = FALSE;
+ t->flags = 0;
lua_settable (L, -3);
}
}
rspamd_lua_setclass (L, "rspamd{text}", -1);
t->start = tag->content;
t->len = tag->content_length;
- t->own = FALSE;
+ t->flags = 0;
}
else {
lua_pushnil (L);
rspamd_lua_setclass (L, "rspamd{text}", -1);
t->start = part->content->data;
t->len = part->content->len;
- t->own = FALSE;
+ t->flags = 0;
return 1;
}
rspamd_lua_setclass (L, "rspamd{text}", -1);
t->start = part->orig->data;
t->len = part->orig->len;
- t->own = FALSE;
+ t->flags = 0;
return 1;
}
rspamd_lua_setclass (L, "rspamd{text}", -1);
t->start = part->stripped_content->data;
t->len = part->stripped_content->len;
- t->own = FALSE;
+ t->flags = 0;
return 1;
}
rspamd_lua_setclass (L, "rspamd{text}", -1);
t->start = part->content->data;
t->len = part->content->len;
- t->own = FALSE;
+ t->flags = 0;
return 1;
}
rspamd_lua_setclass (L, "rspamd{text}", -1);
t->start = old_start;
t->len = start - old_start;
- t->own = FALSE;
+ t->flags = 0;
}
lua_rawseti (L, -2, ++i);
rspamd_lua_setclass (L, "rspamd{text}", -1);
t->start = end;
t->len = (data + len) - end;
- t->own = FALSE;
+ t->flags = 0;
}
lua_rawseti (L, -2, ++i);
#include "email_addr.h"
#include "utlist.h"
#include "cryptobox.h"
+#include "unix-std.h"
/***
* @module rspamd_task
rspamd_lua_setclass (L, "rspamd{text}", -1);
t->len = task->msg.len;
t->start = task->msg.begin;
- t->own = FALSE;
+ t->flags = 0;
}
else {
return luaL_error (L, "invalid arguments");
t->start = task->msg.begin;
}
- t->own = FALSE;
+ t->flags = 0;
}
else {
return luaL_error (L, "invalid arguments");
rspamd_lua_setclass (L, "rspamd{text}", -1);
t->start = hdr->begin;
t->len = hdr->len;
- t->own = FALSE;
+ t->flags = 0;
return 1;
}
rspamd_lua_setclass (L, "rspamd{text}", -1);
t->start = task->raw_headers_content.begin;
t->len = task->raw_headers_content.len;
- t->own = FALSE;
+ t->flags = 0;
}
else {
return luaL_error (L, "invalid arguments");
{
struct rspamd_lua_text *t = lua_check_text (L, 1);
- if (t != NULL && t->own) {
- g_free ((gpointer)t->start);
+ if (t != NULL) {
+ if (t->flags & RSPAMD_TEXT_FLAG_OWN) {
+ if (t->flags & RSPAMD_TEXT_FLAG_MMAPED) {
+ munmap ((gpointer)t->start, t->len);
+ }
+ else {
+ g_free ((gpointer)t->start);
+ }
+ }
+
}
return 0;
rspamd_lua_setclass (cbd->L, "rspamd{text}", -1);
t->start = (const gchar *)str;
t->len = len;
- t->own = FALSE;
+ t->flags = 0;
/* Connection */
pcbd = lua_newuserdata (cbd->L, sizeof (*pcbd));
*pcbd = cbd;
vec->iov_base = (void *)t->start;
vec->iov_len = t->len;
- if (t->own) {
+ if (t->flags & RSPAMD_TEXT_FLAG_OWN) {
/* Steal ownership */
- t->own = FALSE;
+ t->flags = 0;
rspamd_mempool_add_destructor (pool, g_free, (void *)t->start);
}
}
t->start = out;
t->len = outlen;
/* Need destruction */
- t->own = TRUE;
+ t->flags = RSPAMD_TEXT_FLAG_OWN;
}
else {
lua_pushnil (L);
s = t->start;
inlen = t->len;
zero_copy = TRUE;
- if (t->own) {
- t->own = FALSE;
+ if (t->flags & RSPAMD_TEXT_FLAG_OWN) {
+ t->flags = 0;
grab_own = TRUE;
}
}
rspamd_lua_setclass (L, "rspamd{text}", -1);
t->start = s;
t->len = outlen;
- t->own = grab_own;
+
+ if (grab_own) {
+ t->flags |= RSPAMD_TEXT_FLAG_OWN;
+ }
+ else {
+ t->flags = 0;
+ }
}
else {
t = lua_newuserdata (L, sizeof (*t));
outlen = g_base64_decode_step (s, inlen, (guchar *)t->start,
&state, &save);
t->len = outlen;
- t->own = TRUE;
+ t->flags = RSPAMD_TEXT_FLAG_OWN;
}
}
else {
t->start = out;
t->len = outlen;
/* Need destruction */
- t->own = TRUE;
+ t->flags = RSPAMD_TEXT_FLAG_OWN;
}
else {
lua_pushnil (L);
rspamd_lua_setclass (L, "rspamd{text}", -1);
t->start = rspamd_decode_base32 (s, inlen, &outlen);
t->len = outlen;
- t->own = TRUE;
+ t->flags = RSPAMD_TEXT_FLAG_OWN;
}
else {
lua_pushnil (L);
t->start = g_malloc (inlen);
memcpy ((char *)t->start, s, inlen);
t->len = rspamd_decode_url ((char *)t->start, s, inlen);
- t->own = TRUE;
+ t->flags = RSPAMD_TEXT_FLAG_OWN;
}
else {
lua_pushnil (L);
rspamd_lua_setclass (L, "rspamd{text}", -1);
t->start = res->data;
t->len = res->len;
- t->own = TRUE;
+ t->flags = RSPAMD_TEXT_FLAG_OWN;
g_byte_array_free (res, FALSE);
g_byte_array_free (in, TRUE);