summaryrefslogtreecommitdiffstats
path: root/src/ragel
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2017-06-27 08:37:50 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2017-06-27 08:37:50 +0100
commita310f8defd90479ca09274fab1958addb4fb95ae (patch)
tree25b45790f829755a76c5f3af337bc96c01a37e9a /src/ragel
parent146886df6d250a376b92d1bb615cb93679a7d6e8 (diff)
downloadrspamd-a310f8defd90479ca09274fab1958addb4fb95ae.tar.gz
rspamd-a310f8defd90479ca09274fab1958addb4fb95ae.zip
[CritFix] Switch from ragel to C for Content-Type parsing
Diffstat (limited to 'src/ragel')
-rw-r--r--src/ragel/content_type.rl7
-rw-r--r--src/ragel/content_type_parser.rl58
2 files changed, 41 insertions, 24 deletions
diff --git a/src/ragel/content_type.rl b/src/ragel/content_type.rl
index 6f65a7d0f..29889208f 100644
--- a/src/ragel/content_type.rl
+++ b/src/ragel/content_type.rl
@@ -9,12 +9,11 @@
comment = "(" (FWS? ccontent)* FWS? ")";
CFWS = ((FWS? comment)+ FWS?) | FWS;
qcontent = qtextSMTP | quoted_pairSMTP;
- quoted_string = CFWS?
- (DQUOTE
+ quoted_string = (DQUOTE
(((FWS? qcontent)* FWS?) >Quoted_Str_Start %Quoted_Str_End)
- DQUOTE) CFWS?;
+ DQUOTE);
token = 0x21..0x27 | 0x2a..0x2b | 0x2c..0x2e | 0x30..0x39 | 0x41..0x5a | 0x5e..0x7e;
- value = (quoted_string | (token | 0x3d)+) >Param_Value_Start %Param_Value_End;
+ value = (quoted_string | (token)+) >Param_Value_Start %Param_Value_End;
attribute = (token+) >Param_Name_Start %Param_Name_End;
parameter = CFWS? attribute FWS? "=" FWS? value CFWS?;
diff --git a/src/ragel/content_type_parser.rl b/src/ragel/content_type_parser.rl
index eca3da3f8..f248e0116 100644
--- a/src/ragel/content_type_parser.rl
+++ b/src/ragel/content_type_parser.rl
@@ -42,6 +42,7 @@
}
action Param_Name_Start {
+ printf("name start: %s\n", p);
qstart = NULL;
qend = NULL;
pname_start = p;
@@ -50,25 +51,32 @@
action Param_Name_End {
+ printf("name end: %s\n", p);
if (qstart) {
pname_start = qstart;
}
- if (qend && qend >= qstart) {
+ if (qstart && qend && qend >= qstart) {
pname_end = qend;
}
else if (p >= pname_start) {
pname_end = p;
}
- qstart = NULL;
- qend = NULL;
+
+ if (qstart && qend) {
+ qstart = NULL;
+ qend = NULL;
+ }
}
action Param_Value_Start {
- qstart = NULL;
- qend = NULL;
+ printf("value start: %s\n", p);
+ if (qend) {
+ qstart = NULL;
+ qend = NULL;
+ }
- if (pname_end) {
+ if (pname_end && !pvalue_start) {
pvalue_start = p;
pvalue_end = NULL;
}
@@ -76,30 +84,40 @@
action Param_Value_End {
- if (pname_end) {
+ printf("value end: %s\n", p);
+ if (pname_end && pname_start) {
if (qstart) {
pvalue_start = qstart;
+
+ if (!qend) {
+ pvalue_end = NULL;
+ }
}
+
if (qend && qend >= qstart) {
- pvalue_end = qend;
+ if (qstart) {
+ pvalue_end = qend;
+ }
+ else {
+ pvalue_end = NULL;
+ }
}
- else if (p >= pvalue_start) {
+ else if (!qstart && p >= pvalue_start) {
pvalue_end = p;
}
- qstart = NULL;
- qend = NULL;
- if (pvalue_end && pvalue_end > pvalue_start && pname_end > pname_start) {
- rspamd_content_type_add_param (pool, ct, pname_start, pname_end, pvalue_start, pvalue_end);
+ if (pname_start && pvalue_start && pvalue_end && pvalue_end > pvalue_start
+ && pname_end > pname_start) {
+ rspamd_content_type_add_param (pool, ct, pname_start, pname_end,
+ pvalue_start, pvalue_end);
+ pname_start = NULL;
+ pname_end = NULL;
+ pvalue_start = NULL;
+ pvalue_end = NULL;
+ qend = NULL;
+ qstart = NULL;
}
}
-
- pname_start = NULL;
- pname_end = NULL;
- pvalue_start = NULL;
- pvalue_end = NULL;
- qend = NULL;
- qstart = NULL;
}
action Quoted_Str_Start {