}
if (cb->func) {
- cb->func (url, cb->start - text, (m.m_begin + m.m_len) - text,
- cb->funcd);
+ if (!cb->func (url, cb->start - text, (m.m_begin + m.m_len) - text,
+ cb->funcd)) {
+ return FALSE;
+ }
}
}
else if (rc != URI_ERRNO_OK) {
struct rspamd_url_mimepart_cbdata {
struct rspamd_task *task;
struct rspamd_mime_text_part *part;
+ gsize url_len;
};
-static void
+static gboolean
rspamd_url_text_part_callback (struct rspamd_url *url, gsize start_offset,
gsize end_offset, gpointer ud)
{
ex->type = RSPAMD_EXCEPTION_URL;
ex->ptr = url;
+ cbd->url_len += ex->len;
+
+ if (cbd->part->utf_stripped_content &&
+ cbd->url_len > cbd->part->utf_stripped_content->len * 10) {
+ /* Absurdic case, stop here now */
+ msg_err_task ("part has too many URLs, we cannot process more: %z",
+ cbd->url_len);
+
+ return FALSE;
+ }
+
if (url->protocol == PROTOCOL_MAILTO) {
if (url->userlen > 0) {
target_tbl = MESSAGE_FIELD (task, emails);
if (url->querylen > 0) {
if (rspamd_url_find (task->task_pool, url->query, url->querylen,
&url_str, RSPAMD_URL_FIND_ALL, NULL, &prefix_added)) {
-
query_url = rspamd_mempool_alloc0 (task->task_pool,
sizeof (struct rspamd_url));
rc = rspamd_url_parse (query_url,
}
}
}
+
+ return TRUE;
}
void
mcbd.task = task;
mcbd.part = part;
+ mcbd.url_len = 0;
rspamd_url_find_multiple (task->task_pool, part->utf_stripped_content->data,
part->utf_stripped_content->len, how, part->newlines,
}
-void
+gboolean
rspamd_url_task_subject_callback (struct rspamd_url *url, gsize start_offset,
gsize end_offset, gpointer ud)
{
}
}
}
+
+ return TRUE;
}
guint
*/
gboolean rspamd_url_find_tld (const gchar *in, gsize inlen, rspamd_ftok_t *out);
-typedef void (*url_insert_function) (struct rspamd_url *url,
+typedef gboolean (*url_insert_function) (struct rspamd_url *url,
gsize start_offset, gsize end_offset, void *ud);
/**
* @param end_offset
* @param ud
*/
-void rspamd_url_task_subject_callback (struct rspamd_url *url,
+gboolean rspamd_url_task_subject_callback (struct rspamd_url *url,
gsize start_offset,
gsize end_offset, gpointer ud);
return ud ? ((struct rspamd_lua_url *)ud) : NULL;
}
-static void
+static gboolean
lua_url_single_inserter (struct rspamd_url *url, gsize start_offset,
gsize end_offset, gpointer ud)
{
lua_url = lua_newuserdata (L, sizeof (struct rspamd_lua_url));
rspamd_lua_setclass (L, "rspamd{url}", -1);
lua_url->url = url;
+
+ return TRUE;
}
/***
return 0;
}
-static void
+static gboolean
lua_url_table_inserter (struct rspamd_url *url, gsize start_offset,
gsize end_offset, gpointer ud)
{
lua_pushinteger (L, n + 1);
lua_pushlstring (L, url->string, url->urllen);
lua_settable (L, -3);
+
+ return TRUE;
}