summaryrefslogtreecommitdiffstats
path: root/src/libmime
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-05-05 18:55:52 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-05-05 18:55:52 +0100
commite2c6f2bb074092f929540107ff06e1e31bd5be43 (patch)
treea5da4b019012bd567f3fc616c75ddaeffcacb91b /src/libmime
parent726d1ab9f1d8f1d00347dada9c14072e639b444d (diff)
downloadrspamd-e2c6f2bb074092f929540107ff06e1e31bd5be43.tar.gz
rspamd-e2c6f2bb074092f929540107ff06e1e31bd5be43.zip
Fix internal functions arguments parsing.
Diffstat (limited to 'src/libmime')
-rw-r--r--src/libmime/mime_expressions.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/src/libmime/mime_expressions.c b/src/libmime/mime_expressions.c
index 16a3be875..2167f2832 100644
--- a/src/libmime/mime_expressions.c
+++ b/src/libmime/mime_expressions.c
@@ -387,6 +387,7 @@ rspamd_mime_expr_parse_function_atom (const gchar *input)
{
const gchar *obrace, *ebrace, *p, *c;
gchar t, *databuf;
+ guint len;
struct rspamd_function_atom *res;
struct expression_argument arg;
GError *err = NULL;
@@ -423,7 +424,13 @@ rspamd_mime_expr_parse_function_atom (const gchar *input)
}
else if (!g_ascii_isspace (t)) {
state = in_string;
- c = p;
+
+ if (t == '\'' || t == '\"') {
+ c = p + 1;
+ }
+ else {
+ c = p;
+ }
}
p ++;
break;
@@ -433,8 +440,9 @@ rspamd_mime_expr_parse_function_atom (const gchar *input)
prev_state = in_regexp;
}
else if (t == ',' || p == ebrace) {
- databuf = g_malloc (p - c + 1);
- rspamd_strlcpy (databuf, c, p - c + 1);
+ len = p - c + 1;
+ databuf = g_malloc (len);
+ rspamd_strlcpy (databuf, c, len);
arg.type = EXPRESSION_ARGUMENT_REGEXP;
arg.data = rspamd_regexp_cache_create (NULL, databuf, NULL, &err);
@@ -451,6 +459,7 @@ rspamd_mime_expr_parse_function_atom (const gchar *input)
}
g_array_append_val (res->args, arg);
+ state = got_comma;
}
p ++;
break;
@@ -460,11 +469,19 @@ rspamd_mime_expr_parse_function_atom (const gchar *input)
prev_state = in_string;
}
else if (t == ',' || p == ebrace) {
- databuf = g_malloc (p - c + 1);
- rspamd_strlcpy (databuf, c, p - c + 1);
+ if (*(p - 1) == '\'' || *(p - 1) == '\"') {
+ len = p - c;
+ }
+ else {
+ len = p - c + 1;
+ }
+
+ databuf = g_malloc (len);
+ rspamd_strlcpy (databuf, c, len);
arg.type = EXPRESSION_ARGUMENT_NORMAL;
arg.data = databuf;
g_array_append_val (res->args, arg);
+ state = got_comma;
}
p ++;
break;
@@ -2334,7 +2351,7 @@ rspamd_has_content_part_len (struct rspamd_task * task,
return FALSE;
}
- if (args) {
+ if (args->len >= 4) {
arg = &g_array_index (args, struct expression_argument, 3);
g_assert (arg->type == EXPRESSION_ARGUMENT_NORMAL);
max = strtoul (arg->data, NULL, 10);