summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-10-06 17:45:28 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-10-06 17:45:28 +0100
commit4e7e96c138779a2db2cdc8e688ec291abfac36df (patch)
tree4ec32e714ad86aa5d59523d16304ae15ff419cac
parent763ab77075df986497e7b6937d33d5f487ba7fc6 (diff)
parentc1d4aa8b69c43a057695ea69a098b87200121e85 (diff)
downloadrspamd-4e7e96c138779a2db2cdc8e688ec291abfac36df.tar.gz
rspamd-4e7e96c138779a2db2cdc8e688ec291abfac36df.zip
Merge branch 'strings-rework'
-rw-r--r--src/client/rspamc.c5
-rw-r--r--src/controller.c27
-rw-r--r--src/libmime/message.c26
-rw-r--r--src/libmime/mime_expressions.c14
-rw-r--r--src/libmime/mime_expressions.h11
-rw-r--r--src/libmime/smtp_proto.c34
-rw-r--r--src/libmime/smtp_proto.h31
-rw-r--r--src/libmime/smtp_utils.c5
-rw-r--r--src/libserver/buffer.c60
-rw-r--r--src/libserver/buffer.h25
-rw-r--r--src/libserver/dkim.c4
-rw-r--r--src/libserver/html.c14
-rw-r--r--src/libserver/protocol.c4
-rw-r--r--src/libserver/task.c12
-rw-r--r--src/libserver/task.h7
-rw-r--r--src/libstat/learn_cache/sqlite3_cache.c4
-rw-r--r--src/libstat/stat_process.c4
-rw-r--r--src/libstat/tokenizers/osb.c4
-rw-r--r--src/libstat/tokenizers/tokenizers.c27
-rw-r--r--src/libstat/tokenizers/tokenizers.h2
-rw-r--r--src/libutil/fstring.c407
-rw-r--r--src/libutil/fstring.h145
-rw-r--r--src/libutil/mem_pool.c18
-rw-r--r--src/libutil/mem_pool.h13
-rw-r--r--src/libutil/printf.c41
-rw-r--r--src/libutil/printf.h8
-rw-r--r--src/libutil/shingles.c4
-rw-r--r--src/libutil/str_util.c9
-rw-r--r--src/libutil/str_util.h4
-rw-r--r--src/lua/lua_buffer.c2
-rw-r--r--src/lua/lua_rsa.c53
-rw-r--r--src/lua/lua_task.c6
-rw-r--r--src/lua/lua_trie.c2
-rw-r--r--src/lua/lua_util.c8
-rw-r--r--src/plugins/fuzzy_check.c6
-rw-r--r--src/plugins/surbl.c25
-rw-r--r--src/smtp_proxy.c8
-rw-r--r--test/rspamd_shingles_test.c24
38 files changed, 435 insertions, 668 deletions
diff --git a/src/client/rspamc.c b/src/client/rspamc.c
index 8c2878ced..150c780a1 100644
--- a/src/client/rspamc.c
+++ b/src/client/rspamc.c
@@ -941,7 +941,7 @@ rspamc_mime_output (FILE *out, ucl_object_t *result, GString *input,
folded_symbuf = rspamd_header_value_fold ("X-Spam-Symbols",
symbuf->str,
0);
- rspamd_printf_gstring (added_headers, "X-Spam-Symbols: %V\r\n",
+ rspamd_printf_gstring (added_headers, "X-Spam-Symbols: %v\r\n",
folded_symbuf);
g_string_free (folded_symbuf, TRUE);
g_string_free (symbuf, TRUE);
@@ -978,7 +978,8 @@ rspamc_mime_output (FILE *out, ucl_object_t *result, GString *input,
/* Write message */
if (rspamd_fprintf (out, "%*s", (gint)headers_pos, input->str)
== headers_pos) {
- if (rspamd_fprintf (out, "%V", added_headers) == (gint)added_headers->len) {
+ if (rspamd_fprintf (out, "%v", added_headers)
+ == (gint)added_headers->len) {
rspamd_fprintf (out, "%s", input->str + headers_pos);
}
}
diff --git a/src/controller.c b/src/controller.c
index 6bee8cf57..c68cd1bdc 100644
--- a/src/controller.c
+++ b/src/controller.c
@@ -139,8 +139,8 @@ struct rspamd_controller_worker_ctx {
/* Privilleged password */
gchar *enable_password;
/* Cached versions of the passwords */
- rspamd_fstring_t cached_password;
- rspamd_fstring_t cached_enable_password;
+ rspamd_ftok_t cached_password;
+ rspamd_ftok_t cached_enable_password;
/* HTTP server */
struct rspamd_http_connection_router *http;
/* Server's start time */
@@ -261,7 +261,8 @@ rspamd_check_encrypted_password (struct rspamd_controller_worker_ctx *ctx,
gsize salt_len, key_len;
gboolean ret = TRUE;
guchar *local_key;
- rspamd_fstring_t *cache;
+ rspamd_ftok_t *cache;
+ gpointer m;
/* First of all check cached versions to save resources */
if (is_enable && ctx->cached_enable_password.len != 0) {
@@ -332,11 +333,12 @@ rspamd_check_encrypted_password (struct rspamd_controller_worker_ctx *ctx,
if (cache->len == 0) {
/* Mmap region */
- cache->begin = mmap (NULL, password->len, PROT_WRITE,
+ m = mmap (NULL, password->len, PROT_WRITE,
MAP_PRIVATE | MAP_ANON, -1, 0);
- memcpy (cache->begin, password->str, password->len);
- (void)mprotect (cache->begin, password->len, PROT_READ);
- (void)mlock (cache->begin, password->len);
+ memcpy (m, password->str, password->len);
+ (void)mprotect (m, password->len, PROT_READ);
+ (void)mlock (m, password->len);
+ cache->begin = m;
cache->len = password->len;
}
}
@@ -1668,7 +1670,7 @@ rspamd_controller_handle_savemap (struct rspamd_http_connection_entry *conn_ent,
id = strtoul (idstr->str, &errstr, 10);
if (*errstr != '\0' && !g_ascii_isspace (*errstr)) {
- msg_info_session ("invalid map id: %V", idstr);
+ msg_info_session ("invalid map id: %v", idstr);
rspamd_controller_send_error (conn_ent, 400, "Map id is invalid");
return 0;
}
@@ -1981,7 +1983,7 @@ rspamd_controller_handle_custom (struct rspamd_http_connection_entry *conn_ent,
cmd = g_hash_table_lookup (session->ctx->custom_commands, msg->url->str);
if (cmd == NULL || cmd->handler == NULL) {
- msg_err_session ("custom command %V has not been found", msg->url);
+ msg_err_session ("custom command %v has not been found", msg->url);
rspamd_controller_send_error (conn_ent, 404, "No command associated");
return 0;
}
@@ -2386,6 +2388,7 @@ start_controller_worker (struct rspamd_worker *worker)
gpointer key, value;
struct rspamd_keypair_cache *cache;
gchar *secure_ip;
+ gpointer m;
ctx->ev_base = rspamd_prepare_worker (worker,
"controller",
@@ -2556,11 +2559,13 @@ start_controller_worker (struct rspamd_worker *worker)
}
if (ctx->cached_password.len > 0) {
- munmap (ctx->cached_password.begin, ctx->cached_password.len);
+ m = (gpointer)ctx->cached_password.begin;
+ munmap (m, ctx->cached_password.len);
}
if (ctx->cached_enable_password.len > 0) {
- munmap (ctx->cached_enable_password.begin, ctx->cached_enable_password.len);
+ m = (gpointer) ctx->cached_enable_password.begin;
+ munmap (m, ctx->cached_enable_password.len);
}
exit (EXIT_SUCCESS);
diff --git a/src/libmime/message.c b/src/libmime/message.c
index 3537f70c0..183b9bcee 100644
--- a/src/libmime/message.c
+++ b/src/libmime/message.c
@@ -112,8 +112,7 @@ parse_recv_header (rspamd_mempool_t * pool,
RSPAMD_RECV_STATE_PARSE_IP,
RSPAMD_RECV_STATE_SKIP_SPACES,
RSPAMD_RECV_STATE_ERROR
- } state = RSPAMD_RECV_STATE_INIT,
- next_state = RSPAMD_RECV_STATE_INIT;
+ } state = RSPAMD_RECV_STATE_INIT, next_state = RSPAMD_RECV_STATE_INIT;
gboolean is_exim = FALSE;
line = rh->decoded;
@@ -949,7 +948,7 @@ rspamd_normalize_text_part (struct rspamd_task *task,
struct mime_text_part *part)
{
struct sb_stemmer *stem = NULL;
- rspamd_fstring_t *w;
+ rspamd_ftok_t *w;
const guchar *r;
gchar *temp_word;
guint i, nlen;
@@ -971,7 +970,7 @@ rspamd_normalize_text_part (struct rspamd_task *task,
if (tmp) {
for (i = 0; i < tmp->len; i ++) {
- w = &g_array_index (tmp, rspamd_fstring_t, i);
+ w = &g_array_index (tmp, rspamd_ftok_t, i);
if (stem) {
r = sb_stemmer_stem (stem, w->begin, w->len);
}
@@ -980,21 +979,23 @@ rspamd_normalize_text_part (struct rspamd_task *task,
if (stem != NULL && r != NULL) {
nlen = strlen (r);
nlen = MIN (nlen, w->len);
- w->begin = rspamd_mempool_alloc (task->task_pool, nlen);
- memcpy (w->begin, r, nlen);
+ temp_word = rspamd_mempool_alloc (task->task_pool, nlen);
+ memcpy (temp_word, r, nlen);
+ w->begin = temp_word;
w->len = nlen;
}
else {
- temp_word = w->begin;
- w->begin = rspamd_mempool_alloc (task->task_pool, w->len);
- memcpy (w->begin, temp_word, w->len);
+ temp_word = rspamd_mempool_alloc (task->task_pool, w->len);
+ memcpy (temp_word, w->begin, w->len);
if (IS_PART_UTF (part)) {
- rspamd_str_lc_utf8 (w->begin, w->len);
+ rspamd_str_lc_utf8 (temp_word, w->len);
}
else {
- rspamd_str_lc (w->begin, w->len);
+ rspamd_str_lc (temp_word, w->len);
}
+
+ w->begin = temp_word;
}
}
}
@@ -1463,8 +1464,9 @@ rspamd_message_parse (struct rspamd_task *task)
guint tw, dw;
tmp = rspamd_mempool_alloc (task->task_pool, sizeof (GByteArray));
- p = task->msg.start;
+ p = task->msg.begin;
len = task->msg.len;
+
/* Skip any space characters to avoid some bad messages to be unparsed */
while (g_ascii_isspace (*p) && len > 0) {
p ++;
diff --git a/src/libmime/mime_expressions.c b/src/libmime/mime_expressions.c
index 6581b7362..d5b38437d 100644
--- a/src/libmime/mime_expressions.c
+++ b/src/libmime/mime_expressions.c
@@ -125,6 +125,12 @@ struct rspamd_function_atom {
GArray *args; /**< its args */
};
+enum rspamd_mime_atom_type {
+ MIME_ATOM_REGEXP = 0,
+ MIME_ATOM_INTERNAL_FUNCTION,
+ MIME_ATOM_LUA_FUNCTION
+};
+
struct rspamd_mime_atom {
gchar *str;
union {
@@ -132,11 +138,7 @@ struct rspamd_mime_atom {
struct rspamd_function_atom *func;
const gchar *lua_function;
} d;
- enum {
- MIME_ATOM_REGEXP = 0,
- MIME_ATOM_INTERNAL_FUNCTION,
- MIME_ATOM_LUA_FUNCTION
- } type;
+ enum rspamd_mime_atom_type type;
};
/*
@@ -923,7 +925,7 @@ rspamd_mime_expr_process_regexp (struct rspamd_regexp_atom *re,
break;
case REGEXP_MESSAGE:
raw = TRUE;
- ct = (guint8 *)task->msg.start;
+ ct = (guint8 *)task->msg.begin;
clen = task->msg.len;
ret = rspamd_mime_regexp_element_process (task, re, ct, clen, raw);
diff --git a/src/libmime/mime_expressions.h b/src/libmime/mime_expressions.h
index 41e8b33ac..834f1983f 100644
--- a/src/libmime/mime_expressions.h
+++ b/src/libmime/mime_expressions.h
@@ -16,12 +16,13 @@ extern const struct rspamd_atom_subr mime_expr_subr;
/**
* Function's argument
*/
+enum rspamd_expression_type {
+ EXPRESSION_ARGUMENT_NORMAL = 0,
+ EXPRESSION_ARGUMENT_BOOL,
+ EXPRESSION_ARGUMENT_REGEXP
+};
struct expression_argument {
- enum {
- EXPRESSION_ARGUMENT_NORMAL = 0,
- EXPRESSION_ARGUMENT_BOOL,
- EXPRESSION_ARGUMENT_REGEXP
- } type; /**< type of argument (text or other function) */
+ enum rspamd_expression_type type; /**< type of argument (text or other function) */
void *data; /**< pointer to its data */
};
diff --git a/src/libmime/smtp_proto.c b/src/libmime/smtp_proto.c
index 988bd37af..05d5c43d5 100644
--- a/src/libmime/smtp_proto.c
+++ b/src/libmime/smtp_proto.c
@@ -57,7 +57,7 @@ make_smtp_error (rspamd_mempool_t *pool,
gboolean
parse_smtp_command (struct smtp_session *session,
- rspamd_fstring_t *line,
+ rspamd_ftok_t *line,
struct smtp_command **cmd)
{
enum {
@@ -66,9 +66,10 @@ parse_smtp_command (struct smtp_session *session,
SMTP_PARSE_ARGUMENT,
SMTP_PARSE_DONE
} state;
- gchar *p, *c, ch, cmd_buf[4];
+ const gchar *p, *c;
+ gchar ch, cmd_buf[4];
guint i;
- rspamd_fstring_t *arg = NULL;
+ rspamd_ftok_t *arg = NULL;
struct smtp_command *pcmd;
if (line->len == 0) {
@@ -176,8 +177,9 @@ parse_smtp_command (struct smtp_session *session,
}
arg->len = p - c;
arg->begin = rspamd_mempool_alloc (session->pool, arg->len);
- memcpy (arg->begin, c, arg->len);
+ memcpy ((gchar *)arg->begin, c, arg->len);
pcmd->args = g_list_prepend (pcmd->args, arg);
+
if (ch == ' ' || ch == ':') {
state = SMTP_PARSE_SPACES;
}
@@ -209,10 +211,10 @@ end:
}
static gboolean
-check_smtp_path (rspamd_fstring_t *path)
+check_smtp_path (rspamd_ftok_t *path)
{
guint i;
- gchar *p;
+ const gchar *p;
p = path->begin;
if (*p != '<' || path->len < 2) {
@@ -230,7 +232,7 @@ check_smtp_path (rspamd_fstring_t *path)
gboolean
parse_smtp_helo (struct smtp_session *session, struct smtp_command *cmd)
{
- rspamd_fstring_t *arg;
+ rspamd_ftok_t *arg;
if (cmd->args == NULL) {
session->error = SMTP_ERROR_BAD_ARGUMENTS;
@@ -265,7 +267,7 @@ parse_smtp_helo (struct smtp_session *session, struct smtp_command *cmd)
gboolean
parse_smtp_from (struct smtp_session *session, struct smtp_command *cmd)
{
- rspamd_fstring_t *arg;
+ rspamd_ftok_t *arg;
GList *cur = cmd->args;
if (cmd->args == NULL) {
@@ -303,7 +305,7 @@ parse_smtp_from (struct smtp_session *session, struct smtp_command *cmd)
gboolean
parse_smtp_rcpt (struct smtp_session *session, struct smtp_command *cmd)
{
- rspamd_fstring_t *arg;
+ rspamd_ftok_t *arg;
GList *cur = cmd->args;
if (cmd->args == NULL) {
@@ -339,9 +341,9 @@ parse_smtp_rcpt (struct smtp_session *session, struct smtp_command *cmd)
/* Return -1 if there are some error, 1 if all is ok and 0 in case of incomplete reply */
static gint
-check_smtp_ustream_reply (rspamd_fstring_t *in, gchar success_code)
+check_smtp_ustream_reply (rspamd_ftok_t *in, gchar success_code)
{
- gchar *p;
+ const gchar *p;
/* Check for 250 at the begin of line */
if (in->len >= sizeof ("220 ") - 1) {
@@ -368,11 +370,11 @@ smtp_upstream_write_list (GList *args, gchar *buf, size_t buflen)
{
GList *cur = args;
size_t r = 0;
- rspamd_fstring_t *arg;
+ rspamd_ftok_t *arg;
while (cur && r < buflen - 3) {
arg = cur->data;
- r += rspamd_snprintf (buf + r, buflen - r, " %V", arg);
+ r += rspamd_snprintf (buf + r, buflen - r, " %T", arg);
cur = g_list_next (cur);
}
@@ -401,13 +403,13 @@ smtp_upstream_write_socket (void *arg)
}
gboolean
-smtp_upstream_read_socket (rspamd_fstring_t * in, void *arg)
+smtp_upstream_read_socket (rspamd_ftok_t * in, void *arg)
{
struct smtp_session *session = arg;
gchar outbuf[BUFSIZ];
gint r;
- msg_debug ("in: %V, state: %d", in, session->upstream_state);
+ msg_debug ("in: %T, state: %d", in, session->upstream_state);
switch (session->upstream_state) {
case SMTP_STATE_GREETING:
r = check_smtp_ustream_reply (in, '2');
@@ -713,7 +715,7 @@ smtp_upstream_read_socket (rspamd_fstring_t * in, void *arg)
return FALSE;
break;
default:
- msg_err ("got upstream reply at unexpected state: %d, reply: %V",
+ msg_err ("got upstream reply at unexpected state: %d, reply: %T",
session->upstream_state,
in);
session->state = SMTP_STATE_CRITICAL_ERROR;
diff --git a/src/libmime/smtp_proto.h b/src/libmime/smtp_proto.h
index a0f2ec5c2..7ede6f803 100644
--- a/src/libmime/smtp_proto.h
+++ b/src/libmime/smtp_proto.h
@@ -24,20 +24,21 @@
#define MAX_SMTP_UPSTREAMS 128
+enum smtp_command_type {
+ SMTP_COMMAND_HELO = 0,
+ SMTP_COMMAND_EHLO,
+ SMTP_COMMAND_QUIT,
+ SMTP_COMMAND_NOOP,
+ SMTP_COMMAND_MAIL,
+ SMTP_COMMAND_RCPT,
+ SMTP_COMMAND_RSET,
+ SMTP_COMMAND_DATA,
+ SMTP_COMMAND_VRFY,
+ SMTP_COMMAND_EXPN,
+ SMTP_COMMAND_HELP
+};
struct smtp_command {
- enum {
- SMTP_COMMAND_HELO,
- SMTP_COMMAND_EHLO,
- SMTP_COMMAND_QUIT,
- SMTP_COMMAND_NOOP,
- SMTP_COMMAND_MAIL,
- SMTP_COMMAND_RCPT,
- SMTP_COMMAND_RSET,
- SMTP_COMMAND_DATA,
- SMTP_COMMAND_VRFY,
- SMTP_COMMAND_EXPN,
- SMTP_COMMAND_HELP
- } command;
+ enum smtp_command_type command;
GList *args;
};
@@ -53,7 +54,7 @@ gchar * make_smtp_error (rspamd_mempool_t *pool,
* Parse a single SMTP command
*/
gboolean parse_smtp_command (struct smtp_session *session,
- rspamd_fstring_t *line,
+ rspamd_ftok_t *line,
struct smtp_command **cmd);
/*
@@ -79,7 +80,7 @@ gboolean parse_smtp_rcpt (struct smtp_session *session,
/*
* Read a line from SMTP upstream
*/
-gboolean smtp_upstream_read_socket (rspamd_fstring_t * in, void *arg);
+gboolean smtp_upstream_read_socket (rspamd_ftok_t * in, void *arg);
/*
* Write to SMTP upstream
diff --git a/src/libmime/smtp_utils.c b/src/libmime/smtp_utils.c
index edc7f3b14..df50abc65 100644
--- a/src/libmime/smtp_utils.c
+++ b/src/libmime/smtp_utils.c
@@ -35,8 +35,9 @@ free_smtp_session (gpointer arg)
if (session) {
if (session->task) {
rspamd_task_free (session->task, FALSE);
- if (session->task->msg.start) {
- munmap (session->task->msg.start, session->task->msg.len);
+ if (session->task->msg.begin) {
+ munmap ((gpointer)session->task->msg.begin,
+ session->task->msg.len);
}
}
if (session->rcpt) {
diff --git a/src/libserver/buffer.c b/src/libserver/buffer.c
index e4268863c..0875de300 100644
--- a/src/libserver/buffer.c
+++ b/src/libserver/buffer.c
@@ -310,14 +310,27 @@ write_buffers (gint fd, rspamd_io_dispatcher_t * d, gboolean is_delayed)
return TRUE;
}
+static struct rspamd_buffer_buf *
+allocate_buffer (rspamd_mempool_t *pool, gsize size)
+{
+ struct rspamd_buffer_buf *b;
+
+ b = rspamd_mempool_alloc_tmp (pool, sizeof (*b));
+ b->begin = rspamd_mempool_alloc_tmp (pool, size);
+ b->size = size;
+ b->len = 0;
+
+ return b;
+}
+
static void
read_buffers (gint fd, rspamd_io_dispatcher_t * d, gboolean skip_read)
{
ssize_t r;
GError *err = NULL;
- rspamd_fstring_t res;
- gchar *c, *b;
- gchar *end;
+ rspamd_ftok_t res;
+ guchar *c, *b;
+ guchar *end;
size_t len;
enum io_policy saved_policy;
@@ -330,10 +343,10 @@ read_buffers (gint fd, rspamd_io_dispatcher_t * d, gboolean skip_read)
d->in_buf =
rspamd_mempool_alloc_tmp (d->pool, sizeof (rspamd_buffer_t));
if (d->policy == BUFFER_LINE || d->policy == BUFFER_ANY) {
- d->in_buf->data = rspamd_fstralloc_tmp (d->pool, d->default_buf_size);
+ d->in_buf->data = allocate_buffer (d->pool, d->default_buf_size);
}
else {
- d->in_buf->data = rspamd_fstralloc_tmp (d->pool, d->nchars + 1);
+ d->in_buf->data = allocate_buffer (d->pool, d->nchars + 1);
}
d->in_buf->pos = d->in_buf->data->begin;
}
@@ -657,7 +670,7 @@ rspamd_set_dispatcher_policy (rspamd_io_dispatcher_t * d,
enum io_policy policy,
size_t nchars)
{
- rspamd_fstring_t *tmp;
+ struct rspamd_buffer_buf *tmp;
gint t;
if (d->policy != policy || nchars != d->nchars) {
@@ -666,7 +679,7 @@ rspamd_set_dispatcher_policy (rspamd_io_dispatcher_t * d,
/* Resize input buffer if needed */
if (policy == BUFFER_CHARACTER && nchars != 0) {
if (d->in_buf && d->in_buf->data->size < nchars) {
- tmp = rspamd_fstralloc_tmp (d->pool, d->nchars + 1);
+ tmp = allocate_buffer (d->pool, d->nchars + 1);
memcpy (tmp->begin, d->in_buf->data->begin,
d->in_buf->data->len);
t = d->in_buf->pos - d->in_buf->data->begin;
@@ -677,7 +690,7 @@ rspamd_set_dispatcher_policy (rspamd_io_dispatcher_t * d,
}
else if (policy == BUFFER_LINE || policy == BUFFER_ANY) {
if (d->in_buf && d->nchars < d->default_buf_size) {
- tmp = rspamd_fstralloc_tmp (d->pool, d->default_buf_size);
+ tmp = allocate_buffer (d->pool, d->default_buf_size);
memcpy (tmp->begin, d->in_buf->data->begin,
d->in_buf->data->len);
t = d->in_buf->pos - d->in_buf->data->begin;
@@ -732,33 +745,6 @@ rspamd_dispatcher_write (rspamd_io_dispatcher_t * d,
}
gboolean
-rspamd_dispatcher_write_string (rspamd_io_dispatcher_t *d,
- GString *str,
- gboolean delayed,
- gboolean free_on_write)
-{
- struct rspamd_out_buffer_s *newbuf;
-
- newbuf = g_slice_alloc (sizeof (struct rspamd_out_buffer_s));
- newbuf->data = str;
- newbuf->allocated = free_on_write;
-
- APPEND_OUT_BUFFER (d, newbuf);
-
- if (!delayed) {
- debug_ip ("plan write event");
- return write_buffers (d->fd, d, FALSE);
- }
- /* Otherwise plan write event */
- event_del (d->ev);
- event_set (d->ev, d->fd, EV_WRITE, dispatcher_cb, (void *)d);
- event_base_set (d->ev_base, d->ev);
- event_add (d->ev, d->tv);
-
- return TRUE;
-}
-
-gboolean
rspamd_dispatcher_sendfile (rspamd_io_dispatcher_t *d, gint fd, size_t len)
{
if (lseek (fd, 0, SEEK_SET) == -1) {
@@ -824,7 +810,3 @@ rspamd_dispacther_cleanup (rspamd_io_dispatcher_t *d)
}
#undef debug_ip
-
-/*
- * vi:ts=4
- */
diff --git a/src/libserver/buffer.h b/src/libserver/buffer.h
index 7fa799573..26c605484 100644
--- a/src/libserver/buffer.h
+++ b/src/libserver/buffer.h
@@ -10,7 +10,7 @@
#include "mem_pool.h"
#include "fstring.h"
-typedef gboolean (*dispatcher_read_callback_t)(rspamd_fstring_t *in, void *user_data);
+typedef gboolean (*dispatcher_read_callback_t)(rspamd_ftok_t *in, void *user_data);
typedef gboolean (*dispatcher_write_callback_t)(void *user_data);
typedef void (*dispatcher_err_callback_t)(GError *err, void *user_data);
@@ -26,9 +26,15 @@ enum io_policy {
/**
* Buffer structure
*/
+struct rspamd_buffer_buf {
+ gsize size;
+ gsize len;
+ guchar *begin;
+};
+
typedef struct rspamd_buffer_s {
- rspamd_fstring_t *data; /**< buffer logic */
- gchar *pos; /**< current position */
+ struct rspamd_buffer_buf *data;
+ guchar *pos; /**< current position */
} rspamd_buffer_t;
struct rspamd_out_buffer_s {
@@ -112,19 +118,6 @@ gboolean rspamd_dispatcher_write (rspamd_io_dispatcher_t *d,
gboolean allocated) G_GNUC_WARN_UNUSED_RESULT;
/**
- * Write a GString to dispatcher
- * @param d dipatcher object
- * @param str string to write
- * @param delayed delay write
- * @param free_on_write free string after writing to a socket
- * @return TRUE if write has been queued successfully
- */
-gboolean rspamd_dispatcher_write_string (rspamd_io_dispatcher_t *d,
- GString *str,
- gboolean delayed,
- gboolean free_on_write) G_GNUC_WARN_UNUSED_RESULT;
-
-/**
* Send specified descriptor to dispatcher
* @param d pointer to dispatcher's object
* @param fd descriptor of file
diff --git a/src/libserver/dkim.c b/src/libserver/dkim.c
index 2cfa184a3..3b8fc63b5 100644
--- a/src/libserver/dkim.c
+++ b/src/libserver/dkim.c
@@ -1630,9 +1630,9 @@ rspamd_dkim_check (rspamd_dkim_context_t *ctx,
g_return_val_if_fail (task->msg.len > 0, DKIM_ERROR);
/* First of all find place of body */
- p = task->msg.start;
+ p = task->msg.begin;
- end = task->msg.start + task->msg.len;
+ end = task->msg.begin + task->msg.len;
while (p <= end) {
/* Search for \r\n\r\n at the end of headers */
diff --git a/src/libserver/html.c b/src/libserver/html.c
index 520c49d39..887924bd2 100644
--- a/src/libserver/html.c
+++ b/src/libserver/html.c
@@ -1350,7 +1350,7 @@ rspamd_html_process_img_tag (rspamd_mempool_t *pool, struct html_tag *tag,
{
struct html_tag_component *comp;
struct html_image *img;
- rspamd_fstring_t fstr;
+ rspamd_ftok_t fstr;
GList *cur;
gulong val;
@@ -1363,7 +1363,7 @@ rspamd_html_process_img_tag (rspamd_mempool_t *pool, struct html_tag *tag,
if (comp->type == RSPAMD_HTML_COMPONENT_HREF && comp->len > 0) {
fstr.begin = (gchar *)comp->start;
fstr.len = comp->len;
- img->src = rspamd_mempool_fstrdup (pool, &fstr);
+ img->src = rspamd_mempool_ftokdup (pool, &fstr);
if (comp->len > sizeof ("cid:") - 1 && memcmp (comp->start,
"cid:", sizeof ("cid:") - 1) == 0) {
@@ -1427,7 +1427,7 @@ struct html_color_match {
static gint
rspamd_html_color_cmp (const void *key, const void *elt)
{
- const rspamd_fstring_t *fk = key;
+ const rspamd_ftok_t *fk = key;
const struct html_color_match *el = elt;
return g_ascii_strncasecmp (fk->begin, el->name, fk->len);
@@ -1438,7 +1438,7 @@ rspamd_html_process_color (const gchar *line, guint len, struct html_color *cl)
{
const gchar *p = line, *end = line + len;
char hexbuf[7];
- rspamd_fstring_t search;
+ rspamd_ftok_t search;
struct html_color_match *el;
memset (cl, 0, sizeof (*cl));
@@ -1452,7 +1452,7 @@ rspamd_html_process_color (const gchar *line, guint len, struct html_color *cl)
}
else {
/* Compare color by name */
- search.begin = (gchar *)line;
+ search.begin = line;
search.len = len;
el = bsearch (&search, html_colors, G_N_ELEMENTS (html_colors),
@@ -1558,7 +1558,7 @@ rspamd_html_process_block_tag (rspamd_mempool_t *pool, struct html_tag *tag,
{
struct html_tag_component *comp;
struct html_block *bl;
- rspamd_fstring_t fstr;
+ rspamd_ftok_t fstr;
GList *cur;
cur = tag->params;
@@ -1583,7 +1583,7 @@ rspamd_html_process_block_tag (rspamd_mempool_t *pool, struct html_tag *tag,
else if (comp->type == RSPAMD_HTML_COMPONENT_CLASS && comp->len > 0) {
fstr.begin = (gchar *)comp->start;
fstr.len = comp->len;
- bl->class = rspamd_mempool_fstrdup (pool, &fstr);
+ bl->class = rspamd_mempool_ftokdup (pool, &fstr);
msg_debug_pool ("got class: %s", bl->class);
}
diff --git a/src/libserver/protocol.c b/src/libserver/protocol.c
index 360239f34..221db1513 100644
--- a/src/libserver/protocol.c
+++ b/src/libserver/protocol.c
@@ -270,11 +270,11 @@ rspamd_protocol_handle_url (struct rspamd_task *task,
if (res == NULL) {
/* Treat the whole query as path */
- task->msg.start = msg->url->str + u.field_data[UF_QUERY].off;
+ task->msg.begin = msg->url->str + u.field_data[UF_QUERY].off;
task->msg.len = u.field_data[UF_QUERY].len;
}
else {
- task->msg.start = rspamd_mempool_strdup (task->task_pool, res->str);
+ task->msg.begin = rspamd_mempool_strdup (task->task_pool, res->str);
task->msg.len = res->len;
}
diff --git a/src/libserver/task.c b/src/libserver/task.c
index fc22f784f..6d0eca2a2 100644
--- a/src/libserver/task.c
+++ b/src/libserver/task.c
@@ -249,7 +249,7 @@ rspamd_task_unmapper (gpointer ud)
{
struct rspamd_task *task = ud;
- munmap ((void *)task->msg.start, task->msg.len);
+ munmap ((void *)task->msg.begin, task->msg.len);
}
gboolean
@@ -271,7 +271,7 @@ rspamd_task_load_message (struct rspamd_task *task,
if (task->flags & RSPAMD_TASK_FLAG_FILE) {
g_assert (task->msg.len > 0);
- r = rspamd_strlcpy (filepath, task->msg.start,
+ r = rspamd_strlcpy (filepath, task->msg.begin,
MIN (sizeof (filepath), task->msg.len + 1));
rspamd_decode_url (filepath, filepath, r + 1);
@@ -311,14 +311,14 @@ rspamd_task_load_message (struct rspamd_task *task,
}
close (fd);
- task->msg.start = map;
+ task->msg.begin = map;
task->msg.len = st.st_size;
rspamd_mempool_add_destructor (task->task_pool, rspamd_task_unmapper, task);
}
else {
debug_task ("got input of length %z", task->msg.len);
- task->msg.start = start;
+ task->msg.begin = start;
task->msg.len = len;
if (task->msg.len == 0) {
@@ -343,7 +343,7 @@ rspamd_task_load_message (struct rspamd_task *task,
if (control_len > 0) {
parser = ucl_parser_new (UCL_PARSER_KEY_LOWERCASE);
- if (!ucl_parser_add_chunk (parser, task->msg.start, control_len)) {
+ if (!ucl_parser_add_chunk (parser, task->msg.begin, control_len)) {
msg_warn_task ("processing of control chunk failed: %s",
ucl_parser_get_error (parser));
ucl_parser_free (parser);
@@ -355,7 +355,7 @@ rspamd_task_load_message (struct rspamd_task *task,
ucl_object_unref (control_obj);
}
- task->msg.start += control_len;
+ task->msg.begin += control_len;
task->msg.len -= control_len;
}
}
diff --git a/src/libserver/task.h b/src/libserver/task.h
index 16c3d4a70..02f6f9ea0 100644
--- a/src/libserver/task.h
+++ b/src/libserver/task.h
@@ -128,16 +128,13 @@ struct rspamd_task {
gchar *hostname; /**< hostname reported by MTA */
GHashTable *request_headers; /**< HTTP headers in a request */
GHashTable *reply_headers; /**< Custom reply headers */
- struct {
- const gchar *start;
- gsize len;
- } msg; /**< message buffer */
+ rspamd_ftok_t msg; /**< message buffer */
struct rspamd_http_connection *http_conn; /**< HTTP server connection */
struct rspamd_async_session * s; /**< async session object */
GMimeMessage *message; /**< message, parsed with GMime */
GPtrArray *parts; /**< list of parsed parts */
GPtrArray *text_parts; /**< list of text parts */
- rspamd_fstring_t raw_headers_content; /**< list of raw headers */
+ rspamd_ftok_t raw_headers_content; /**< list of raw headers */
GPtrArray *received; /**< list of received headers */
GHashTable *urls; /**< list of parsed urls */
GHashTable *emails; /**< list of parsed emails */
diff --git a/src/libstat/learn_cache/sqlite3_cache.c b/src/libstat/learn_cache/sqlite3_cache.c
index 6eabaefda..987f6cb0c 100644
--- a/src/libstat/learn_cache/sqlite3_cache.c
+++ b/src/libstat/learn_cache/sqlite3_cache.c
@@ -247,7 +247,7 @@ rspamd_stat_cache_sqlite3_process (struct rspamd_task *task,
struct rspamd_stat_sqlite3_ctx *ctx = (struct rspamd_stat_sqlite3_ctx *)c;
struct mime_text_part *part;
blake2b_state st;
- rspamd_fstring_t *word;
+ rspamd_ftok_t *word;
guchar out[BLAKE2B_OUTBYTES];
guint i, j;
@@ -259,7 +259,7 @@ rspamd_stat_cache_sqlite3_process (struct rspamd_task *task,
if (part->words != NULL) {
for (j = 0; j < part->words->len; j ++) {
- word = &g_array_index (part->words, rspamd_fstring_t, j);
+ word = &g_array_index (part->words, rspamd_ftok_t, j);
blake2b_update (&st, word->begin, word->len);
}
}
diff --git a/src/libstat/stat_process.c b/src/libstat/stat_process.c
index a6f5d31ae..a1cbe9c33 100644
--- a/src/libstat/stat_process.c
+++ b/src/libstat/stat_process.c
@@ -52,7 +52,7 @@ rspamd_stat_tokenize_header (struct rspamd_task *task,
const gchar *name, const gchar *prefix, GArray *ar)
{
struct raw_header *rh, *cur;
- rspamd_fstring_t str;
+ rspamd_ftok_t str;
rh = g_hash_table_lookup (task->raw_headers, name);
@@ -89,7 +89,7 @@ rspamd_stat_tokenize_parts_metadata (struct rspamd_task *task,
struct mime_text_part *tp;
GList *cur;
GArray *ar;
- rspamd_fstring_t elt;
+ rspamd_ftok_t elt;
guint i;
ar = g_array_sized_new (FALSE, FALSE, sizeof (elt), 4);
diff --git a/src/libstat/tokenizers/osb.c b/src/libstat/tokenizers/osb.c
index 690a7ab5b..7744e2883 100644
--- a/src/libstat/tokenizers/osb.c
+++ b/src/libstat/tokenizers/osb.c
@@ -232,7 +232,7 @@ rspamd_tokenizer_osb (struct rspamd_tokenizer_runtime *rt,
const gchar *prefix)
{
rspamd_token_t *new = NULL;
- rspamd_fstring_t *token;
+ rspamd_ftok_t *token;
struct rspamd_osb_tokenizer_config *osb_cf;
guint64 *hashpipe, cur, seed;
guint32 h1, h2;
@@ -259,7 +259,7 @@ rspamd_tokenizer_osb (struct rspamd_tokenizer_runtime *rt,
memset (hashpipe, 0xfe, window_size * sizeof (hashpipe[0]));
for (w = 0; w < input->len; w ++) {
- token = &g_array_index (input, rspamd_fstring_t, w);
+ token = &g_array_index (input, rspamd_ftok_t, w);
if (osb_cf->ht == RSPAMD_OSB_HASH_COMPAT) {
cur = rspamd_fstrhash_lc (token, is_utf);
diff --git a/src/libstat/tokenizers/tokenizers.c b/src/libstat/tokenizers/tokenizers.c
index 07e7a1f45..439c639a6 100644
--- a/src/libstat/tokenizers/tokenizers.c
+++ b/src/libstat/tokenizers/tokenizers.c
@@ -30,8 +30,8 @@
#include "tokenizers.h"
#include "stat_internal.h"
-typedef gboolean (*token_get_function) (rspamd_fstring_t * buf, gchar **pos,
- rspamd_fstring_t * token,
+typedef gboolean (*token_get_function) (rspamd_ftok_t * buf, gchar const **pos,
+ rspamd_ftok_t * token,
GList **exceptions, gboolean is_utf, gsize *rl, gboolean check_signature);
const gchar t_delimiters[255] = {
@@ -77,12 +77,12 @@ token_node_compare_func (gconstpointer a, gconstpointer b)
/* Get next word from specified f_str_t buf */
static gboolean
-rspamd_tokenizer_get_word_compat (rspamd_fstring_t * buf,
- gchar **cur, rspamd_fstring_t * token,
+rspamd_tokenizer_get_word_compat (rspamd_ftok_t * buf,
+ gchar const **cur, rspamd_ftok_t * token,
GList **exceptions, gboolean is_utf, gsize *rl, gboolean unused)
{
gsize remain, pos;
- guchar *p;
+ const gchar *p;
struct process_exception *ex = NULL;
if (buf == NULL) {
@@ -134,11 +134,11 @@ rspamd_tokenizer_get_word_compat (rspamd_fstring_t * buf,
pos++;
p++;
remain--;
- } while (remain > 0 && t_delimiters[*p]);
+ } while (remain > 0 && t_delimiters[(guchar)*p]);
token->begin = p;
- while (remain > 0 && !t_delimiters[*p]) {
+ while (remain > 0 && !t_delimiters[(guchar)*p]) {
if (ex != NULL && ex->pos == pos) {
*exceptions = g_list_next (*exceptions);
*cur = p + ex->len;
@@ -169,13 +169,13 @@ rspamd_tokenizer_get_word_compat (rspamd_fstring_t * buf,
}
static gboolean
-rspamd_tokenizer_get_word (rspamd_fstring_t * buf,
- gchar **cur, rspamd_fstring_t * token,
+rspamd_tokenizer_get_word (rspamd_ftok_t * buf,
+ gchar const **cur, rspamd_ftok_t * token,
GList **exceptions, gboolean is_utf, gsize *rl,
gboolean check_signature)
{
gsize remain, pos, siglen = 0;
- gchar *p, *next_p, *sig = NULL;
+ const gchar *p, *next_p, *sig = NULL;
gunichar uc;
guint processed = 0;
struct process_exception *ex = NULL;
@@ -292,8 +292,8 @@ rspamd_tokenize_text (gchar *text, gsize len, gboolean is_utf,
gsize min_len, GList *exceptions, gboolean compat,
gboolean check_signature)
{
- rspamd_fstring_t token, buf;
- gchar *pos = NULL;
+ rspamd_ftok_t token, buf;
+ const gchar *pos = NULL;
gsize l;
GArray *res;
GList *cur = exceptions;
@@ -305,7 +305,6 @@ rspamd_tokenize_text (gchar *text, gsize len, gboolean is_utf,
buf.begin = text;
buf.len = len;
- buf.size = buf.len;
token.begin = NULL;
token.len = 0;
@@ -316,7 +315,7 @@ rspamd_tokenize_text (gchar *text, gsize len, gboolean is_utf,
func = rspamd_tokenizer_get_word;
}
- res = g_array_sized_new (FALSE, FALSE, sizeof (rspamd_fstring_t), 128);
+ res = g_array_sized_new (FALSE, FALSE, sizeof (rspamd_ftok_t), 128);
while (func (&buf, &pos, &token, &cur, is_utf, &l, FALSE)) {
if (l == 0 || (min_len > 0 && l < min_len)) {
diff --git a/src/libstat/tokenizers/tokenizers.h b/src/libstat/tokenizers/tokenizers.h
index 7b01d9fe8..4689d1cc6 100644
--- a/src/libstat/tokenizers/tokenizers.h
+++ b/src/libstat/tokenizers/tokenizers.h
@@ -33,7 +33,7 @@ struct rspamd_stat_tokenizer {
gint token_node_compare_func (gconstpointer a, gconstpointer b);
-/* Tokenize text into array of words (rspamd_fstring_t type) */
+/* Tokenize text into array of words (rspamd_ftok_t type) */
GArray * rspamd_tokenize_text (gchar *text, gsize len, gboolean is_utf,
gsize min_len, GList *exceptions, gboolean compat,
gboolean check_signature);
diff --git a/src/libutil/fstring.c b/src/libutil/fstring.c
index 991cd3000..6a1304423 100644
--- a/src/libutil/fstring.c
+++ b/src/libutil/fstring.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009-2012, Vsevolod Stakhov
+ * Copyright (c) 2009-2015, Vsevolod Stakhov
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -24,316 +24,132 @@
#include "fstring.h"
-/*
- * Search first occurence of character in string
- */
-ssize_t
-rspamd_fstrchr (rspamd_fstring_t * src, gchar c)
-{
- register size_t cur = 0;
-
- while (cur < src->len) {
- if (*(src->begin + cur) == c) {
- return cur;
- }
- cur++;
- }
+static const gsize default_initial_size = 48;
+/* Maximum size when we double the size of new string */
+static const gsize max_grow = 1024 * 1024;
- return -1;
-}
+#define fstravail(s) ((s)->allocated - (s)->len)
+static rspamd_fstring_t * rspamd_fstring_grow (rspamd_fstring_t *str,
+ gsize needed_len) G_GNUC_WARN_UNUSED_RESULT;
-/*
- * Search last occurence of character in string
- */
-ssize_t
-rspamd_fstrrchr (rspamd_fstring_t * src, gchar c)
+rspamd_fstring_t *
+rspamd_fstring_new (void)
{
- register ssize_t cur = src->len;
+ rspamd_fstring_t *s;
- while (cur > 0) {
- if (*(src->begin + cur) == c) {
- return cur;
- }
- cur--;
- }
+ g_assert (posix_memalign ((void**)&s, 16, default_initial_size + sizeof (*s)) == 0);
+ s->len = 0;
+ s->allocated = default_initial_size;
- return -1;
+ return s;
}
-/*
- * Search for pattern in orig
- */
-ssize_t
-rspamd_fstrstr (rspamd_fstring_t * orig, rspamd_fstring_t * pattern)
-{
- register size_t cur = 0, pcur = 0;
-
- if (pattern->len > orig->len) {
- return -1;
- }
-
- while (cur < orig->len) {
- if (*(orig->begin + cur) == *pattern->begin) {
- pcur = 0;
- while (cur < orig->len && pcur < pattern->len) {
- if (*(orig->begin + cur) != *(pattern->begin + pcur)) {
- pcur = 0;
- break;
- }
- cur++;
- pcur++;
- }
- return cur - pattern->len;
- }
- cur++;
- }
-
- return -1;
-
-}
-
-/*
- * Search for pattern in orig ignoring case
- */
-ssize_t
-rspamd_fstrstri (rspamd_fstring_t * orig, rspamd_fstring_t * pattern)
+rspamd_fstring_t *
+rspamd_fstring_sized_new (gsize initial_size)
{
- register size_t cur = 0, pcur = 0;
+ rspamd_fstring_t *s;
+ gsize real_size = MAX (default_initial_size, initial_size);
- if (pattern->len > orig->len) {
- return -1;
- }
-
- while (cur < orig->len) {
- if (g_ascii_tolower (*(orig->begin + cur)) ==
- g_ascii_tolower (*pattern->begin)) {
- pcur = 0;
- while (cur < orig->len && pcur < pattern->len) {
- if (g_ascii_tolower (*(orig->begin + cur)) !=
- g_ascii_tolower (*(pattern->begin + pcur))) {
- pcur = 0;
- break;
- }
- cur++;
- pcur++;
- }
- return cur - pattern->len;
- }
- cur++;
- }
-
- return -1;
+ g_assert (posix_memalign ((void **)&s, 16, real_size + sizeof (*s)) == 0);
+ s->len = 0;
+ s->allocated = real_size;
+ return s;
}
-/*
- * Split string by tokens
- * word contains parsed word
- *
- * Return: -1 - no new words can be extracted
- * 1 - word was extracted and there are more words
- * 0 - last word extracted
- */
-gint
-rspamd_fstrtok (rspamd_fstring_t * text, const gchar *sep, rspamd_fstring_token_t * state)
+rspamd_fstring_t *
+rspamd_fstring_new_init (const gchar *init, gsize len)
{
- register size_t cur;
- const gchar *csep = sep;
-
- if (state->pos >= text->len) {
- return -1;
- }
-
- cur = state->pos;
-
- while (cur < text->len) {
- while (*csep) {
- if (*(text->begin + cur) == *csep) {
- state->word.begin = (text->begin + state->pos);
- state->word.len = cur - state->pos;
- state->pos = cur + 1;
- return 1;
- }
- csep++;
- }
- csep = sep;
- cur++;
- }
+ rspamd_fstring_t *s;
+ gsize real_size = MAX (default_initial_size, len);
- /* Last word */
- state->word.begin = (text->begin + state->pos);
- state->word.len = cur - state->pos;
- state->pos = cur;
+ g_assert (posix_memalign ((void **) &s, 16, real_size + sizeof (*s)) == 0);
+ s->len = len;
+ s->allocated = real_size;
+ memcpy (s->str, init, len);
- return 0;
+ return s;
}
-/*
- * Copy one string into other
- */
-size_t
-rspamd_fstrcpy (rspamd_fstring_t * dest, rspamd_fstring_t * src)
+void
+rspamd_fstring_free (rspamd_fstring_t *str)
{
- register size_t cur = 0;
-
- if (dest->size < src->len) {
- return 0;
- }
-
- while (cur < src->len && cur < dest->size) {
- *(dest->begin + cur) = *(src->begin + cur);
- cur++;
- }
-
- return cur;
+ free (str);
}
-/*
- * Concatenate two strings
- */
-size_t
-rspamd_fstrcat (rspamd_fstring_t * dest, rspamd_fstring_t * src)
+static rspamd_fstring_t *
+rspamd_fstring_grow (rspamd_fstring_t *str, gsize needed_len)
{
- register size_t cur = 0;
- gchar *p = dest->begin + dest->len;
+ gsize newlen;
+ gpointer nptr;
- if (dest->size < src->len + dest->len) {
- return 0;
- }
+ newlen = str->len + needed_len;
- while (cur < src->len) {
- *p = *(src->begin + cur);
- p++;
- cur++;
+ /*
+ * Stop exponential grow at some point, since it might be slow for the
+ * vast majority of cases
+ */
+ if (newlen < max_grow) {
+ newlen *= 2;
}
-
- dest->len += src->len;
-
- return cur;
-
-}
-
-/*
- * Make copy of string to 0-terminated string
- */
-gchar *
-rspamd_fstr_c_str (rspamd_fstring_t * str, rspamd_mempool_t * pool)
-{
- gchar *res;
- res = rspamd_mempool_alloc (pool, str->len + 1);
-
- /* Do not allow multiply \0 characters */
- memccpy (res, str->begin, '\0', str->len);
- res[str->len] = 0;
-
- return res;
-}
-
-/*
- * Push one character to fstr
- */
-gint
-rspamd_fstrappend_c (rspamd_fstring_t * dest, gchar c)
-{
- if (dest->size < dest->len) {
- /* Need to reallocate string */
- return 0;
+ else {
+ newlen += max_grow;
}
- *(dest->begin + dest->len) = c;
- dest->len++;
- return 1;
-}
+ nptr = realloc (str, newlen + sizeof (*str));
-/*
- * Push one character to fstr
- */
-gint
-rspamd_fstrappend_u (rspamd_fstring_t * dest, gunichar c)
-{
- int l;
- if (dest->size < dest->len) {
- /* Need to reallocate string */
- return 0;
+ if (nptr == NULL) {
+ /* Avoid memory leak */
+ free (str);
+ g_assert (nptr);
}
- l = g_unichar_to_utf8 (c, dest->begin + dest->len);
- dest->len += l;
- return l;
-}
-
-/*
- * Allocate memory for f_str_t
- */
-rspamd_fstring_t *
-rspamd_fstralloc (rspamd_mempool_t * pool, size_t len)
-{
- rspamd_fstring_t *res = rspamd_mempool_alloc (pool, sizeof (rspamd_fstring_t));
-
- res->begin = rspamd_mempool_alloc (pool, len);
+ str = nptr;
+ str->allocated = newlen;
- res->size = len;
- res->len = 0;
- return res;
+ return str;
}
-/*
- * Allocate memory for f_str_t from temporary pool
- */
-rspamd_fstring_t *
-rspamd_fstralloc_tmp (rspamd_mempool_t * pool, size_t len)
-{
- rspamd_fstring_t *res = rspamd_mempool_alloc_tmp (pool, sizeof (rspamd_fstring_t));
-
- res->begin = rspamd_mempool_alloc_tmp (pool, len);
-
- res->size = len;
- res->len = 0;
- return res;
-}
-
-/*
- * Truncate string to its len
- */
rspamd_fstring_t *
-rspamd_fstrtruncate (rspamd_mempool_t * pool, rspamd_fstring_t * orig)
+rspamd_fstring_append (rspamd_fstring_t *str, const char *in, gsize len)
{
- rspamd_fstring_t *res;
+ gsize avail = fstravail (str);
- if (orig == NULL || orig->len == 0 || orig->size <= orig->len) {
- return orig;
+ if (avail < len) {
+ str = rspamd_fstring_grow (str, len);
}
- res = rspamd_fstralloc (pool, orig->len);
- if (res == NULL) {
- return NULL;
- }
- rspamd_fstrcpy (res, orig);
+ memcpy (str->str + str->len, in, len);
+ str->len += len;
- return res;
+ return str;
}
-/*
- * Enlarge string to new size
- */
-rspamd_fstring_t *
-rspamd_fstrgrow (rspamd_mempool_t * pool, rspamd_fstring_t * orig, size_t newlen)
+void
+rspamd_fstring_erase (rspamd_fstring_t *str, gsize pos, gsize len)
{
- rspamd_fstring_t *res;
+ if (pos < str->len) {
+ if (pos + len > str->len) {
+ len = str->len - pos;
+ }
- if (orig == NULL || orig->len == 0 || orig->size >= newlen) {
- return orig;
+ if (len == str->len - pos) {
+ /* Fast path */
+ str->len = pos;
+ }
+ else {
+ memmove (str->str + pos, str->str + pos + len, str->len - pos);
+ str->len -= pos;
+ }
}
-
- res = rspamd_fstralloc (pool, newlen);
- if (res == NULL) {
- return NULL;
+ else {
+ /* Do nothing */
}
- rspamd_fstrcpy (res, orig);
-
- return res;
}
+char *rspamd_fstring_cstr (const rspamd_fstring_t *str);
+
+/* Compat code */
static guint32
fstrhash_c (gchar c, guint32 hval)
{
@@ -362,33 +178,12 @@ fstrhash_c (gchar c, guint32 hval)
return (hval << 3) + (hval >> 29);
}
-/*
- * Return hash value for a string
- */
-guint32
-rspamd_fstrhash (rspamd_fstring_t * str)
-{
- size_t i;
- guint32 hval;
- gchar *c;
-
- if (str == NULL) {
- return 0;
- }
- c = str->begin;
- hval = str->len;
-
- for (i = 0; i < str->len; i++, c++) {
- hval = fstrhash_c (*c, hval);
- }
- return hval;
-}
/*
* Return hash value for a string
*/
guint32
-rspamd_fstrhash_lc (rspamd_fstring_t * str, gboolean is_utf)
+rspamd_fstrhash_lc (const rspamd_ftok_t * str, gboolean is_utf)
{
gsize i;
guint32 j, hval;
@@ -431,42 +226,6 @@ rspamd_fstrhash_lc (rspamd_fstring_t * str, gboolean is_utf)
return hval;
}
-void
-rspamd_fstrstrip (rspamd_fstring_t * str)
-{
- gchar *p = str->begin;
- guint r = 0;
-
- while (r < str->len) {
- if (g_ascii_isspace (*p)) {
- p++;
- r++;
- }
- else {
- break;
- }
- }
-
- if (r > 0) {
- memmove (str->begin, p, str->len - r);
- str->len -= r;
- }
-
- r = str->len;
- p = str->begin + str->len;
- while (r > 0) {
- if (g_ascii_isspace (*p)) {
- p--;
- r--;
- }
- else {
- break;
- }
- }
-
- str->len = r;
-}
-
gboolean
rspamd_fstring_equal (const rspamd_fstring_t *s1,
const rspamd_fstring_t *s2)
@@ -474,7 +233,7 @@ rspamd_fstring_equal (const rspamd_fstring_t *s1,
g_assert (s1 != NULL && s2 != NULL);
if (s1->len == s2->len) {
- return (memcmp (s1->begin, s2->begin, s1->len) == 0);
+ return (memcmp (s1->str, s2->str, s1->len) == 0);
}
return FALSE;
diff --git a/src/libutil/fstring.h b/src/libutil/fstring.h
index 27482877c..02b92bea3 100644
--- a/src/libutil/fstring.h
+++ b/src/libutil/fstring.h
@@ -1,123 +1,96 @@
/*
- * Functions for handling with fixed size strings
+ * Copyright (c) 2009-2015, Vsevolod Stakhov
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR ''AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+
#ifndef FSTRING_H
#define FSTRING_H
#include "config.h"
#include "mem_pool.h"
-#define update_buf_size(x) (x)->free = (x)->buf->size - \
- ((x)->pos - (x)->buf->begin); (x)->buf->len = (x)->pos - (x)->buf->begin
+/**
+ * Fixed strings library
+ * These strings are NOT null-terminated for speed
+ */
typedef struct f_str_s {
- gchar *begin;
- size_t len;
- size_t size;
+ gsize len;
+ gsize allocated;
+ gchar str[];
} rspamd_fstring_t;
-typedef struct f_str_buf_s {
- rspamd_fstring_t *buf;
- gchar *pos;
- size_t free;
-} rspamd_fstring_buf_t;
-
-typedef struct f_tok_s {
- rspamd_fstring_t word;
- size_t pos;
-} rspamd_fstring_token_t;
+typedef struct f_str_tok {
+ gsize len;
+ const gchar *begin;
+} rspamd_ftok_t;
-/*
- * Search first occurence of character in string
+/**
+ * Create new fixed length string
*/
-ssize_t rspamd_fstrchr (rspamd_fstring_t *src, gchar c);
+rspamd_fstring_t* rspamd_fstring_new (void);
-/*
- * Search last occurence of character in string
+/**
+ * Create new fixed length string with preallocated size
*/
-ssize_t rspamd_fstrrchr (rspamd_fstring_t *src, gchar c);
+rspamd_fstring_t *rspamd_fstring_sized_new (gsize initial_size);
-/*
- * Search for pattern in orig
+/**
+ * Create new fixed length string and initialize it with the initial data
*/
-ssize_t rspamd_fstrstr (rspamd_fstring_t *orig, rspamd_fstring_t *pattern);
+rspamd_fstring_t *rspamd_fstring_new_init (const gchar *init, gsize len);
-/*
- * Search for pattern in orig ignoring case
+/**
+ * Free fixed length string
*/
-ssize_t rspamd_fstrstri (rspamd_fstring_t *orig, rspamd_fstring_t *pattern);
+void rspamd_fstring_free (rspamd_fstring_t *str);
-/*
- * Split string by tokens
- * word contains parsed word
+/**
+ * Append data to a fixed length string
*/
-gint rspamd_fstrtok (rspamd_fstring_t *text, const gchar *sep, rspamd_fstring_token_t *state);
+rspamd_fstring_t* rspamd_fstring_append (rspamd_fstring_t *str,
+ const char *in, gsize len) G_GNUC_WARN_UNUSED_RESULT;
-/*
- * Copy one string into other
- */
-size_t rspamd_fstrcpy (rspamd_fstring_t *dest, rspamd_fstring_t *src);
-/*
- * Concatenate two strings
+/**
+ * Erase `len` characters at postion `pos`
*/
-size_t rspamd_fstrcat (rspamd_fstring_t *dest, rspamd_fstring_t *src);
+void rspamd_fstring_erase (rspamd_fstring_t *str, gsize pos, gsize len);
-/*
- * Push one character to fstr
- */
-gint rspamd_fstrappend_c (rspamd_fstring_t *dest, gchar c);
-
-/*
- * Push one character to fstr
+/**
+ * Convert fixed string to a zero terminated string. This string should be
+ * freed by a caller
*/
-gint rspamd_fstrappend_u (rspamd_fstring_t *dest, gunichar c);
-
-/*
- * Allocate memory for f_str_t
- */
-rspamd_fstring_t * rspamd_fstralloc (rspamd_mempool_t *pool, size_t len);
-
-/*
- * Allocate memory for f_str_t from temporary pool
- */
-rspamd_fstring_t * rspamd_fstralloc_tmp (rspamd_mempool_t *pool, size_t len);
-
-/*
- * Truncate string to its len
- */
-rspamd_fstring_t * rspamd_fstrtruncate (rspamd_mempool_t *pool, rspamd_fstring_t *orig);
-
-/*
- * Enlarge string to new size
- */
-rspamd_fstring_t * rspamd_fstrgrow (rspamd_mempool_t *pool, rspamd_fstring_t *orig, size_t newlen);
-
-/*
- * Return specified character
- */
-#define fstridx(str, pos) *((str)->begin + (pos))
-
-/*
- * Return fast hash value for fixed string
- */
-guint32 rspamd_fstrhash (rspamd_fstring_t *str);
+char * rspamd_fstring_cstr (const rspamd_fstring_t *str);
/*
* Return fast hash value for fixed string converted to lowercase
*/
-guint32 rspamd_fstrhash_lc (rspamd_fstring_t *str, gboolean is_utf);
-/*
- * Make copy of string to 0-terminated string
- */
-gchar * rspamd_fstr_c_str (rspamd_fstring_t *str, rspamd_mempool_t *pool);
+guint32 rspamd_fstrhash_lc (const rspamd_ftok_t *str, gboolean is_utf);
-/*
- * Strip fstr string from space symbols
+/**
+ * Return true if two strings are equal
*/
-void rspamd_fstrstrip (rspamd_fstring_t *str);
-
gboolean rspamd_fstring_equal (const rspamd_fstring_t *s1,
const rspamd_fstring_t *s2);
diff --git a/src/libutil/mem_pool.c b/src/libutil/mem_pool.c
index ea5fa0bd8..849e70c03 100644
--- a/src/libutil/mem_pool.c
+++ b/src/libutil/mem_pool.c
@@ -26,8 +26,6 @@
#include "mem_pool.h"
#include "fstring.h"
#include "logger.h"
-#include "util.h"
-#include "rspamd.h"
#include "utlist.h"
#include "ottery.h"
@@ -424,11 +422,25 @@ rspamd_mempool_fstrdup (rspamd_mempool_t * pool, const struct f_str_s *src)
}
newstr = rspamd_mempool_alloc (pool, src->len + 1);
- memcpy (newstr, src->begin, src->len);
+ memcpy (newstr, src->str, src->len);
newstr[src->len] = '\0';
return newstr;
}
+gchar *
+rspamd_mempool_ftokdup (rspamd_mempool_t *pool, const rspamd_ftok_t *src)
+{
+ gchar *newstr;
+
+ if (src == NULL) {
+ return NULL;
+ }
+
+ newstr = rspamd_mempool_alloc (pool, src->len + 1);
+ memcpy (newstr, src->begin, src->len);
+ newstr[src->len] = '\0';
+ return newstr;
+}
gchar *
rspamd_mempool_strdup_shared (rspamd_mempool_t * pool, const gchar *src)
diff --git a/src/libutil/mem_pool.h b/src/libutil/mem_pool.h
index 3b0e97666..21ddc9d90 100644
--- a/src/libutil/mem_pool.h
+++ b/src/libutil/mem_pool.h
@@ -179,6 +179,17 @@ gchar * rspamd_mempool_strdup (rspamd_mempool_t * pool, const gchar *src);
gchar * rspamd_mempool_fstrdup (rspamd_mempool_t * pool,
const struct f_str_s *src);
+struct f_str_tok;
+
+/**
+ * Make a copy of fixed string token in pool as null terminated string
+ * @param pool memory pool object
+ * @param src source string
+ * @return pointer to newly created string that is copy of src
+ */
+gchar * rspamd_mempool_ftokdup (rspamd_mempool_t *pool,
+ const struct f_str_tok *src);
+
/**
* Allocate piece of shared memory
* @param pool memory pool object
@@ -201,7 +212,7 @@ void rspamd_mempool_lock_shared (rspamd_mempool_t *pool, void *pointer);
* @param pool memory pool object
* @param pointer pointer of shared memory object that is to be unlocked (the whole page that contains that object is locked)
*/
-void rspamd_mempool_lock_shared (rspamd_mempool_t *pool, void *pointer);
+void rspamd_mempool_unlock_shared (rspamd_mempool_t *pool, void *pointer);
/**
* Add destructor callback to pool
diff --git a/src/libutil/printf.c b/src/libutil/printf.c
index 328173bd0..345682f28 100644
--- a/src/libutil/printf.c
+++ b/src/libutil/printf.c
@@ -219,6 +219,18 @@ rspamd_printf_append_gstring (const gchar *buf, glong buflen, gpointer ud)
return buflen;
}
+static glong
+rspamd_printf_append_fstring (const gchar *buf, glong buflen, gpointer ud)
+{
+ rspamd_fstring_t **dst = ud;
+
+ if (buflen > 0) {
+ *dst = rspamd_fstring_append (*dst, buf, buflen);
+ }
+
+ return buflen;
+}
+
glong
rspamd_fprintf (FILE *f, const gchar *fmt, ...)
{
@@ -307,6 +319,25 @@ rspamd_vprintf_gstring (GString *s, const gchar *fmt, va_list args)
return rspamd_vprintf_common (rspamd_printf_append_gstring, s, fmt, args);
}
+glong
+rspamd_printf_fstring (rspamd_fstring_t **s, const gchar *fmt, ...)
+{
+ va_list args;
+ glong r;
+
+ va_start (args, fmt);
+ r = rspamd_vprintf_fstring (s, fmt, args);
+ va_end (args);
+
+ return r;
+}
+
+glong
+rspamd_vprintf_fstring (rspamd_fstring_t **s, const gchar *fmt, va_list args)
+{
+ return rspamd_vprintf_common (rspamd_printf_append_fstring, s, fmt, args);
+}
+
#define RSPAMD_PRINTF_APPEND(buf, len) \
do { \
RSPAMD_PRINTF_APPEND_BUF(buf, len); \
@@ -338,6 +369,7 @@ rspamd_vprintf_common (rspamd_printf_append_func func,
guint64 ui64;
guint width, sign, hex, humanize, bytes, frac_width, i;
rspamd_fstring_t *v;
+ rspamd_ftok_t *tok;
GString *gs;
GError *err;
gboolean bv;
@@ -453,10 +485,15 @@ rspamd_vprintf_common (rspamd_printf_append_func func,
case 'V':
v = va_arg (args, rspamd_fstring_t *);
- RSPAMD_PRINTF_APPEND (v->begin, v->len);
+ RSPAMD_PRINTF_APPEND (v->str, v->len);
continue;
+ case 'T':
+ tok = va_arg (args, rspamd_ftok_t *);
+ RSPAMD_PRINTF_APPEND (tok->begin, tok->len);
+ continue;
+
case 'v':
gs = va_arg (args, GString *);
RSPAMD_PRINTF_APPEND (gs->str, gs->len);
@@ -523,7 +560,7 @@ rspamd_vprintf_common (rspamd_printf_append_func func,
sign = 1;
break;
- case 'T':
+ case 't':
i64 = (gint64) va_arg (args, time_t);
sign = 1;
break;
diff --git a/src/libutil/printf.h b/src/libutil/printf.h
index d0db483d9..ea73cf0a0 100644
--- a/src/libutil/printf.h
+++ b/src/libutil/printf.h
@@ -26,6 +26,7 @@
#define PRINTF_H_
#include "config.h"
+#include "fstring.h"
/*
* supported formats:
@@ -44,7 +45,8 @@
* %P pid_t
* %r rlim_t
* %p void *
- * %V f_str_t *
+ * %V rspamd_fstring_t *
+ * %T rspamd_ftok_t
* %v GString *
* %s null-terminated string
* %xs hex encoded string
@@ -52,6 +54,7 @@
* %Z '\0'
* %N '\n'
* %c gchar
+ * %t time_t
* %e GError *
* %% %
*
@@ -76,6 +79,9 @@ gchar * rspamd_vsnprintf (gchar *buf, glong max, const gchar *fmt,
glong rspamd_printf_gstring (GString *s, const gchar *fmt, ...);
glong rspamd_vprintf_gstring (GString *s, const gchar *fmt, va_list args);
+glong rspamd_printf_fstring (rspamd_fstring_t **s, const gchar *fmt, ...);
+glong rspamd_vprintf_fstring (rspamd_fstring_t **s, const gchar *fmt, va_list args);
+
glong rspamd_vprintf_common (rspamd_printf_append_func func,
gpointer apd,
const gchar *fmt,
diff --git a/src/libutil/shingles.c b/src/libutil/shingles.c
index 776ecfa96..e3bcc0f10 100644
--- a/src/libutil/shingles.c
+++ b/src/libutil/shingles.c
@@ -41,7 +41,7 @@ rspamd_shingles_generate (GArray *input,
guchar shabuf[BLAKE2B_OUTBYTES], *out_key;
const guchar *cur_key;
GString *row;
- rspamd_fstring_t *word;
+ rspamd_ftok_t *word;
blake2b_state bs;
guint64 val;
gint i, j, beg = 0;
@@ -84,7 +84,7 @@ rspamd_shingles_generate (GArray *input,
for (i = 0; i <= (gint)input->len; i ++) {
if (i - beg >= SHINGLES_WINDOW || i == (gint)input->len) {
for (j = beg; j < i; j ++) {
- word = &g_array_index (input, rspamd_fstring_t, j);
+ word = &g_array_index (input, rspamd_ftok_t, j);
g_string_append_len (row, word->begin, word->len);
}
beg++;
diff --git a/src/libutil/str_util.c b/src/libutil/str_util.c
index 6465208f9..d92ceb1ad 100644
--- a/src/libutil/str_util.c
+++ b/src/libutil/str_util.c
@@ -215,9 +215,10 @@ rspamd_str_equal (gconstpointer v, gconstpointer v2)
}
gboolean
-rspamd_fstring_icase_equal (gconstpointer v, gconstpointer v2)
+rspamd_ftok_icase_equal (gconstpointer v, gconstpointer v2)
{
- const rspamd_fstring_t *f1 = v, *f2 = v2;
+ const rspamd_ftok_t *f1 = v, *f2 = v2;
+
if (f1->len == f2->len &&
g_ascii_strncasecmp (f1->begin, f2->begin, f1->len) == 0) {
return TRUE;
@@ -228,9 +229,9 @@ rspamd_fstring_icase_equal (gconstpointer v, gconstpointer v2)
guint
-rspamd_fstring_icase_hash (gconstpointer key)
+rspamd_ftok_icase_hash (gconstpointer key)
{
- const rspamd_fstring_t *f = key;
+ const rspamd_ftok_t *f = key;
return rspamd_icase_hash (f->begin, f->len);
}
diff --git a/src/libutil/str_util.h b/src/libutil/str_util.h
index b6c8b2981..fdadc4811 100644
--- a/src/libutil/str_util.h
+++ b/src/libutil/str_util.h
@@ -53,8 +53,8 @@ gboolean rspamd_str_equal (gconstpointer v, gconstpointer v2);
/*
* Hash table utility functions for hashing fixed strings
*/
-guint rspamd_fstring_icase_hash (gconstpointer key);
-gboolean rspamd_fstring_icase_equal (gconstpointer v, gconstpointer v2);
+guint rspamd_ftok_icase_hash (gconstpointer key);
+gboolean rspamd_ftok_icase_equal (gconstpointer v, gconstpointer v2);
guint rspamd_gstring_icase_hash (gconstpointer key);
gboolean rspamd_gstring_icase_equal (gconstpointer v, gconstpointer v2);
diff --git a/src/lua/lua_buffer.c b/src/lua/lua_buffer.c
index 7a23a9579..021b13a0d 100644
--- a/src/lua/lua_buffer.c
+++ b/src/lua/lua_buffer.c
@@ -79,7 +79,7 @@ lua_check_event_base (lua_State *L)
/* Dispatcher callbacks */
static gboolean
-lua_io_read_cb (rspamd_fstring_t * in, void *arg)
+lua_io_read_cb (rspamd_ftok_t * in, void *arg)
{
struct lua_dispatcher_cbdata *cbdata = arg;
gboolean res;
diff --git a/src/lua/lua_rsa.c b/src/lua/lua_rsa.c
index 394332fd0..a85d0db71 100644
--- a/src/lua/lua_rsa.c
+++ b/src/lua/lua_rsa.c
@@ -298,16 +298,13 @@ lua_rsa_signature_load (lua_State *L)
sig = g_malloc (sizeof (rspamd_fstring_t));
if (fstat (fd, &st) == -1 ||
(data =
- mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, fd,
- 0)) == MAP_FAILED) {
+ mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0))
+ == MAP_FAILED) {
msg_err ("cannot mmap file %s: %s", filename, strerror (errno));
lua_pushnil (L);
}
else {
- sig->size = st.st_size;
- sig->len = sig->size;
- sig->begin = g_malloc (sig->len);
- memcpy (sig->begin, data, sig->len);
+ sig = rspamd_fstring_new_init (data, st.st_size);
psig = lua_newuserdata (L, sizeof (rspamd_fstring_t *));
rspamd_lua_setclass (L, "rspamd{rsa_signature}", -1);
*psig = sig;
@@ -352,7 +349,7 @@ lua_rsa_signature_save (lua_State *L)
lua_pushboolean (L, FALSE);
}
else {
- while (write (fd, sig->begin, sig->len) == -1) {
+ while (write (fd, sig->str, sig->len) == -1) {
if (errno == EINTR) {
continue;
}
@@ -378,14 +375,11 @@ lua_rsa_signature_create (lua_State *L)
{
rspamd_fstring_t *sig, **psig;
const gchar *data;
+ gsize dlen;
- data = luaL_checkstring (L, 1);
+ data = luaL_checklstring (L, 1, &dlen);
if (data != NULL) {
- sig = g_malloc (sizeof (rspamd_fstring_t));
- sig->len = strlen (data);
- sig->size = sig->len;
- sig->begin = g_malloc (sig->len);
- memcpy (sig->begin, data, sig->len);
+ sig = rspamd_fstring_new_init (data, dlen);
psig = lua_newuserdata (L, sizeof (rspamd_fstring_t *));
rspamd_lua_setclass (L, "rspamd{rsa_signature}", -1);
*psig = sig;
@@ -399,12 +393,7 @@ lua_rsa_signature_gc (lua_State *L)
{
rspamd_fstring_t *sig = lua_check_rsa_sign (L, 1);
- if (sig != NULL) {
- if (sig->begin != NULL) {
- g_free (sig->begin);
- }
- g_free (sig);
- }
+ rspamd_fstring_free (sig);
return 0;
}
@@ -435,7 +424,7 @@ lua_rsa_verify_memory (lua_State *L)
if (rsa != NULL && signature != NULL && data != NULL) {
data_sig = g_compute_checksum_for_string (G_CHECKSUM_SHA256, data, -1);
ret = RSA_verify (NID_sha1, data_sig, strlen (data_sig),
- signature->begin, signature->len, rsa);
+ signature->str, signature->len, rsa);
if (ret == 0) {
msg_info ("cannot check rsa signature for data: %s",
ERR_error_string (ERR_get_error (), NULL));
@@ -496,7 +485,7 @@ lua_rsa_verify_file (lua_State *L)
data,
st.st_size);
ret = RSA_verify (NID_sha1, data_sig, strlen (data_sig),
- signature->begin, signature->len, rsa);
+ signature->str, signature->len, rsa);
if (ret == 0) {
msg_info ("cannot check rsa signature for file: %s, %s",
filename, ERR_error_string (ERR_get_error (), NULL));
@@ -534,26 +523,22 @@ lua_rsa_sign_memory (lua_State *L)
RSA *rsa;
rspamd_fstring_t *signature, **psig;
const gchar *data;
- gchar *data_sig;
+ guchar *data_sig;
gint ret;
rsa = lua_check_rsa_privkey (L, 1);
data = luaL_checkstring (L, 2);
if (rsa != NULL && data != NULL) {
- signature = g_malloc (sizeof (rspamd_fstring_t));
- signature->len = RSA_size (rsa);
- signature->size = signature->len;
- signature->begin = g_malloc (signature->len);
+ signature = rspamd_fstring_sized_new (RSA_size (rsa));
data_sig = g_compute_checksum_for_string (G_CHECKSUM_SHA256, data, -1);
ret = RSA_sign (NID_sha1, data_sig, strlen (data_sig),
- signature->begin, (guint *)&signature->len, rsa);
+ signature->str, (guint *)&signature->len, rsa);
if (ret == 0) {
msg_info ("cannot make a signature for data: %s",
ERR_error_string (ERR_get_error (), NULL));
lua_pushnil (L);
- g_free (signature->begin);
- g_free (signature);
+ rspamd_fstring_free (signature);
}
else {
psig = lua_newuserdata (L, sizeof (rspamd_fstring_t *));
@@ -607,21 +592,17 @@ lua_rsa_sign_file (lua_State *L)
lua_pushnil (L);
}
else {
- signature = g_malloc (sizeof (rspamd_fstring_t));
- signature->len = RSA_size (rsa);
- signature->size = signature->len;
- signature->begin = g_malloc (signature->len);
+ signature = rspamd_fstring_sized_new (RSA_size (rsa));
data_sig = g_compute_checksum_for_string (G_CHECKSUM_SHA256,
data,
st.st_size);
ret = RSA_sign (NID_sha1, data_sig, strlen (data_sig),
- signature->begin, (guint *)&signature->len, rsa);
+ signature->str, (guint *)&signature->len, rsa);
if (ret == 0) {
msg_info ("cannot make a signature for data: %s",
ERR_error_string (ERR_get_error (), NULL));
lua_pushnil (L);
- g_free (signature->begin);
- g_free (signature);
+ rspamd_fstring_free (signature);
}
else {
psig = lua_newuserdata (L, sizeof (rspamd_fstring_t *));
diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c
index d52eeb166..4ef772a5c 100644
--- a/src/lua/lua_task.c
+++ b/src/lua/lua_task.c
@@ -638,8 +638,8 @@ lua_task_create_from_buffer (lua_State *L)
ptask = lua_newuserdata (L, sizeof (gpointer));
rspamd_lua_setclass (L, "rspamd{task}", -1);
*ptask = task;
- task->msg.start = rspamd_mempool_alloc (task->task_pool, len + 1);
- memcpy ((gpointer)task->msg.start, data, len);
+ task->msg.begin = rspamd_mempool_alloc (task->task_pool, len);
+ memcpy ((gpointer)task->msg.begin, data, len);
task->msg.len = len;
}
return 1;
@@ -883,7 +883,7 @@ lua_task_get_content (lua_State * L)
t = lua_newuserdata (L, sizeof (*t));
rspamd_lua_setclass (L, "rspamd{text}", -1);
t->len = task->msg.len;
- t->start = task->msg.start;
+ t->start = task->msg.begin;
t->own = FALSE;
return 1;
diff --git a/src/lua/lua_trie.c b/src/lua/lua_trie.c
index bceda4502..b0b1551e3 100644
--- a/src/lua/lua_trie.c
+++ b/src/lua/lua_trie.c
@@ -303,7 +303,7 @@ lua_trie_search_rawmsg (lua_State *L)
gboolean found = FALSE;
if (trie) {
- text = task->msg.start;
+ text = task->msg.begin;
len = task->msg.len;
if (lua_trie_search_str (L, trie, text, len, &state) != 0) {
diff --git a/src/lua/lua_util.c b/src/lua/lua_util.c
index f9f71c532..3a7d00211 100644
--- a/src/lua/lua_util.c
+++ b/src/lua/lua_util.c
@@ -244,8 +244,8 @@ lua_util_process_message (lua_State *L)
task = rspamd_task_new (NULL);
task->cfg = cfg;
task->ev_base = base;
- task->msg.start = rspamd_mempool_alloc (task->task_pool, mlen + 1);
- rspamd_strlcpy ((gpointer)task->msg.start, message, mlen + 1);
+ task->msg.begin = rspamd_mempool_alloc (task->task_pool, mlen);
+ rspamd_strlcpy ((gpointer)task->msg.begin, message, mlen);
task->msg.len = mlen;
task->fin_callback = lua_util_task_fin;
task->fin_arg = &res;
@@ -397,7 +397,7 @@ lua_util_tokenize_text (lua_State *L)
struct rspamd_lua_text *t;
struct process_exception *ex;
GArray *res;
- rspamd_fstring_t *w;
+ rspamd_ftok_t *w;
gboolean compat = FALSE, check_sig = FALSE;
if (lua_type (L, 1) == LUA_TSTRING) {
@@ -465,7 +465,7 @@ lua_util_tokenize_text (lua_State *L)
lua_newtable (L);
for (i = 0; i < res->len; i ++) {
- w = &g_array_index (res, rspamd_fstring_t, i);
+ w = &g_array_index (res, rspamd_ftok_t, i);
lua_pushlstring (L, w->begin, w->len);
lua_rawseti (L, -2, i + 1);
}
diff --git a/src/plugins/fuzzy_check.c b/src/plugins/fuzzy_check.c
index 8b5c2ee58..bc4822b17 100644
--- a/src/plugins/fuzzy_check.c
+++ b/src/plugins/fuzzy_check.c
@@ -621,7 +621,7 @@ fuzzy_cmd_from_text_part (struct fuzzy_rule *rule,
struct rspamd_shingle *sh;
guint i;
blake2b_state st;
- rspamd_fstring_t *word;
+ rspamd_ftok_t *word;
GArray *words;
struct fuzzy_cmd_io *io;
struct rspamd_http_keypair *lk, *rk;
@@ -645,7 +645,7 @@ fuzzy_cmd_from_text_part (struct fuzzy_rule *rule,
words = fuzzy_preprocess_words (part, pool);
for (i = 0; i < words->len; i ++) {
- word = &g_array_index (words, rspamd_fstring_t, i);
+ word = &g_array_index (words, rspamd_ftok_t, i);
blake2b_update (&st, word->begin, word->len);
}
blake2b_final (&st, shcmd->basic.digest, sizeof (shcmd->basic.digest));
@@ -1466,7 +1466,7 @@ fuzzy_process_handler (struct rspamd_http_connection_entry *conn_ent,
/* Allocate message from string */
/* XXX: what about encrypted messsages ? */
- task->msg.start = msg->body->str;
+ task->msg.begin = msg->body->str;
task->msg.len = msg->body->len;
saved = rspamd_mempool_alloc0 (task->task_pool, sizeof (gint));
diff --git a/src/plugins/surbl.c b/src/plugins/surbl.c
index 882eed2d4..0c1d6887f 100644
--- a/src/plugins/surbl.c
+++ b/src/plugins/surbl.c
@@ -91,8 +91,7 @@ exception_insert (gpointer st, gconstpointer key, gpointer value)
GHashTable **t = st;
gint level = 0;
const gchar *p = key;
- rspamd_fstring_t *val;
-
+ rspamd_ftok_t *val;
while (*p) {
if (*p == '.') {
@@ -107,12 +106,12 @@ exception_insert (gpointer st, gconstpointer key, gpointer value)
return;
}
- val = g_malloc (sizeof (rspamd_fstring_t));
- val->begin = (gchar *)key;
+ val = g_malloc (sizeof (rspamd_ftok_t));
+ val->begin = key;
val->len = strlen (key);
if (t[level] == NULL) {
- t[level] = g_hash_table_new_full (rspamd_fstring_icase_hash,
- rspamd_fstring_icase_equal,
+ t[level] = g_hash_table_new_full (rspamd_ftok_icase_hash,
+ rspamd_ftok_icase_equal,
g_free,
NULL);
}
@@ -654,7 +653,7 @@ surbl_module_reconfig (struct rspamd_config *cfg)
static gchar *
format_surbl_request (rspamd_mempool_t * pool,
- rspamd_fstring_t * hostname,
+ rspamd_ftok_t * hostname,
struct suffix_item *suffix,
gboolean append_suffix,
GError ** err,
@@ -663,12 +662,12 @@ format_surbl_request (rspamd_mempool_t * pool,
struct rspamd_url *url)
{
GHashTable *t;
- gchar *result = NULL, *dots[MAX_LEVELS],
- num_buf[sizeof("18446744073709551616")], *p;
+ gchar *result = NULL, num_buf[sizeof("18446744073709551616")];
+ const gchar *p, *dots[MAX_LEVELS];
gint len, slen, r, i, dots_num = 0, level = MAX_LEVELS;
gboolean is_numeric = TRUE, found_exception = FALSE;
guint64 ip_num;
- rspamd_fstring_t f;
+ rspamd_ftok_t f;
if (G_LIKELY (suffix != NULL)) {
slen = strlen (suffix->suffix);
@@ -773,7 +772,7 @@ format_surbl_request (rspamd_mempool_t * pool,
if (level == 0) {
r = rspamd_snprintf (result,
len,
- "%V",
+ "%T",
hostname);
}
else {
@@ -792,7 +791,7 @@ format_surbl_request (rspamd_mempool_t * pool,
else {
r = rspamd_snprintf (result,
len,
- "%V",
+ "%T",
hostname);
}
}
@@ -852,7 +851,7 @@ make_surbl_requests (struct rspamd_url *url, struct rspamd_task *task,
struct suffix_item *suffix, gboolean forced, GHashTable *tree)
{
gchar *surbl_req;
- rspamd_fstring_t f;
+ rspamd_ftok_t f;
GError *err = NULL;
struct dns_param *param;
diff --git a/src/smtp_proxy.c b/src/smtp_proxy.c
index b931a7890..43119afa2 100644
--- a/src/smtp_proxy.c
+++ b/src/smtp_proxy.c
@@ -734,9 +734,9 @@ smtp_dns_cb (struct rdns_reply *reply, void *arg)
}
static void
-proxy_parse_smtp_input (rspamd_fstring_t *line, struct smtp_proxy_session *session)
+proxy_parse_smtp_input (rspamd_ftok_t *line, struct smtp_proxy_session *session)
{
- gchar *p, *c, *end;
+ const gchar *p, *c, *end;
gsize len;
p = line->begin;
@@ -788,10 +788,10 @@ proxy_parse_smtp_input (rspamd_fstring_t *line, struct smtp_proxy_session *sessi
* Callback that is called when there is data to read in buffer
*/
static gboolean
-smtp_proxy_read_socket (rspamd_fstring_t * in, void *arg)
+smtp_proxy_read_socket (rspamd_ftok_t * in, void *arg)
{
struct smtp_proxy_session *session = arg;
- gchar *p;
+ const gchar *p;
if (session->state != SMTP_PROXY_STATE_REJECT_EMULATE) {
/* This can be called only if client is using invalid pipelining */
diff --git a/test/rspamd_shingles_test.c b/test/rspamd_shingles_test.c
index 433fe8c67..3a1dd8ba2 100644
--- a/test/rspamd_shingles_test.c
+++ b/test/rspamd_shingles_test.c
@@ -42,16 +42,18 @@ generate_fuzzy_words (gsize cnt, gsize max_len)
{
GArray *res;
gsize i, wlen;
- rspamd_fstring_t w;
+ rspamd_ftok_t w;
+ char *t;
- res = g_array_sized_new (FALSE, FALSE, sizeof (rspamd_fstring_t), cnt);
+ res = g_array_sized_new (FALSE, FALSE, sizeof (rspamd_ftok_t), cnt);
for (i = 0; i < cnt; i ++) {
wlen = ottery_rand_range (max_len) + 1;
- w.len = w.size = wlen;
- w.begin = g_malloc (wlen);
- generate_random_string (w.begin, wlen);
+ w.len = wlen;
+ t = g_malloc (wlen);
+ generate_random_string (t, wlen);
+ w.begin = t;
g_array_append_val (res, w);
}
@@ -62,12 +64,12 @@ static void
permute_vector (GArray *in, gdouble prob)
{
gsize i, total = 0;
- rspamd_fstring_t *w;
+ rspamd_ftok_t *w;
for (i = 0; i < in->len; i ++) {
if (ottery_rand_unsigned () <= G_MAXUINT * prob) {
- w = &g_array_index (in, rspamd_fstring_t, i);
- generate_random_string (w->begin, w->len);
+ w = &g_array_index (in, rspamd_ftok_t, i);
+ generate_random_string ((gchar *)w->begin, w->len);
total ++;
}
}
@@ -78,11 +80,11 @@ static void
free_fuzzy_words (GArray *ar)
{
gsize i;
- rspamd_fstring_t *w;
+ rspamd_ftok_t *w;
for (i = 0; i < ar->len; i ++) {
- w = &g_array_index (ar, rspamd_fstring_t, i);
- g_free (w->begin);
+ w = &g_array_index (ar, rspamd_ftok_t, i);
+ g_free ((gpointer)w->begin);
}
}