diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-06-27 08:37:50 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-06-27 08:37:50 +0100 |
commit | a310f8defd90479ca09274fab1958addb4fb95ae (patch) | |
tree | 25b45790f829755a76c5f3af337bc96c01a37e9a /src/ragel | |
parent | 146886df6d250a376b92d1bb615cb93679a7d6e8 (diff) | |
download | rspamd-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.rl | 7 | ||||
-rw-r--r-- | src/ragel/content_type_parser.rl | 58 |
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 { |