summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2013-10-11 15:16:07 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2013-10-11 15:16:07 +0100
commit03a70b9d49723c72525a0ab8f2494095027a95a6 (patch)
treea7522d7bd08fb603ae029da8bce0dc63adb5f088 /src
parent18a92d54fe3f3802ee7019d8fc201a4c8fc10e6c (diff)
downloadrspamd-03a70b9d49723c72525a0ab8f2494095027a95a6.tar.gz
rspamd-03a70b9d49723c72525a0ab8f2494095027a95a6.zip
Fix rcl parser.
Diffstat (limited to 'src')
-rw-r--r--src/rcl/rcl_chartable.h38
-rw-r--r--src/rcl/rcl_parser.c27
2 files changed, 41 insertions, 24 deletions
diff --git a/src/rcl/rcl_chartable.h b/src/rcl/rcl_chartable.h
index aae5c2c5d..50eca9c0c 100644
--- a/src/rcl/rcl_chartable.h
+++ b/src/rcl/rcl_chartable.h
@@ -39,13 +39,17 @@ RCL_CHARACTER_DENIED, RCL_CHARACTER_DENIED, RCL_CHARACTER_DENIED,
RCL_CHARACTER_DENIED, RCL_CHARACTER_DENIED, RCL_CHARACTER_DENIED,
RCL_CHARACTER_DENIED, RCL_CHARACTER_DENIED, RCL_CHARACTER_DENIED,
RCL_CHARACTER_DENIED, RCL_CHARACTER_DENIED,
-RCL_CHARACTER_WHITESPACE|RCL_CHARACTER_VALUE_STR, RCL_CHARACTER_VALUE_STR,
-RCL_CHARACTER_VALUE_STR, RCL_CHARACTER_VALUE_END, RCL_CHARACTER_VALUE_STR,
-RCL_CHARACTER_VALUE_STR, RCL_CHARACTER_VALUE_STR, RCL_CHARACTER_VALUE_STR,
-RCL_CHARACTER_VALUE_STR, RCL_CHARACTER_VALUE_STR, RCL_CHARACTER_VALUE_STR,
-RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT, RCL_CHARACTER_VALUE_STR,
-RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT_START|RCL_CHARACTER_VALUE_DIGIT,
-RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT, RCL_CHARACTER_VALUE_END,
+RCL_CHARACTER_WHITESPACE|RCL_CHARACTER_VALUE_STR /* */,
+RCL_CHARACTER_VALUE_STR /* ! */, RCL_CHARACTER_VALUE_STR /* " */,
+RCL_CHARACTER_VALUE_END /* # */, RCL_CHARACTER_VALUE_STR /* $ */,
+RCL_CHARACTER_VALUE_STR /* % */, RCL_CHARACTER_VALUE_STR /* & */,
+RCL_CHARACTER_VALUE_STR /* ' */, RCL_CHARACTER_VALUE_STR /* ( */,
+RCL_CHARACTER_VALUE_STR /* ) */, RCL_CHARACTER_VALUE_STR /* * */,
+RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT /* + */,
+RCL_CHARACTER_VALUE_END /* , */,
+RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT_START|RCL_CHARACTER_VALUE_DIGIT /* - */,
+RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT /* . */,
+RCL_CHARACTER_VALUE_STR /* / */,
RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT_START|RCL_CHARACTER_VALUE_DIGIT /* 0 */,
RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT_START|RCL_CHARACTER_VALUE_DIGIT /* 1 */,
RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT_START|RCL_CHARACTER_VALUE_DIGIT /* 2 */,
@@ -56,9 +60,10 @@ RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT_START|RCL_CH
RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT_START|RCL_CHARACTER_VALUE_DIGIT /* 7 */,
RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT_START|RCL_CHARACTER_VALUE_DIGIT /* 8 */,
RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT_START|RCL_CHARACTER_VALUE_DIGIT /* 9 */,
-RCL_CHARACTER_VALUE_STR, RCL_CHARACTER_VALUE_END, RCL_CHARACTER_VALUE_STR,
-RCL_CHARACTER_VALUE_STR, RCL_CHARACTER_VALUE_STR, RCL_CHARACTER_VALUE_STR,
-RCL_CHARACTER_VALUE_STR,
+RCL_CHARACTER_VALUE_STR /* : */, RCL_CHARACTER_VALUE_END /* ; */,
+RCL_CHARACTER_VALUE_STR /* < */, RCL_CHARACTER_VALUE_STR /* = */,
+RCL_CHARACTER_VALUE_STR /* > */, RCL_CHARACTER_VALUE_STR /* ? */,
+RCL_CHARACTER_VALUE_STR /* @ */,
RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT /* A */,
RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT /* B */,
RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT /* C */,
@@ -85,9 +90,10 @@ RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_
RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT /* X */,
RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT /* Y */,
RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT /* Z */,
-RCL_CHARACTER_VALUE_END, RCL_CHARACTER_VALUE_STR, RCL_CHARACTER_VALUE_STR,
-RCL_CHARACTER_VALUE_STR, RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR,
-RCL_CHARACTER_VALUE_STR,
+RCL_CHARACTER_VALUE_STR /* [ */, RCL_CHARACTER_VALUE_STR /* \ */,
+RCL_CHARACTER_VALUE_END /* ] */, RCL_CHARACTER_VALUE_STR /* ^ */,
+RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR /* _ */,
+RCL_CHARACTER_VALUE_STR /* ` */,
RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT /* a */,
RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT /* b */,
RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT /* c */,
@@ -114,8 +120,9 @@ RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_
RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT /* x */,
RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT /* y */,
RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR|RCL_CHARACTER_VALUE_DIGIT /* z */,
-RCL_CHARACTER_VALUE_END, RCL_CHARACTER_VALUE_STR, RCL_CHARACTER_VALUE_STR,
-RCL_CHARACTER_VALUE_STR, RCL_CHARACTER_DENIED,
+RCL_CHARACTER_VALUE_STR /* { */, RCL_CHARACTER_VALUE_STR /* | */,
+RCL_CHARACTER_VALUE_END /* } */, RCL_CHARACTER_VALUE_STR /* ~ */,
+RCL_CHARACTER_DENIED,
RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR,
RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR,
RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR,
@@ -246,4 +253,5 @@ RCL_CHARACTER_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR
};
+
#endif /* RCL_CHARTABLE_H_ */
diff --git a/src/rcl/rcl_parser.c b/src/rcl/rcl_parser.c
index 13bf25c71..1b09fe283 100644
--- a/src/rcl/rcl_parser.c
+++ b/src/rcl/rcl_parser.c
@@ -76,32 +76,35 @@ rspamd_cl_skip_comments (struct rspamd_cl_parser *parser, GError **err)
p = chunk->pos;
+start:
if (*p == '#') {
if (parser->state != RSPAMD_RCL_STATE_SCOMMENT &&
parser->state != RSPAMD_RCL_STATE_MCOMMENT) {
while (p < chunk->end) {
if (*p == '\n') {
rspamd_cl_chunk_skipc (chunk, *++p);
- break;
+ /* Check comments again */
+ goto start;
}
rspamd_cl_chunk_skipc (chunk, *++p);
}
}
}
else if (*p == '/' && chunk->remain >= 2) {
- rspamd_cl_chunk_skipc (chunk, *++p);
- if (*p == '/' && parser->state != RSPAMD_RCL_STATE_SCOMMENT &&
+ if (p[1] == '/' && parser->state != RSPAMD_RCL_STATE_SCOMMENT &&
parser->state != RSPAMD_RCL_STATE_MCOMMENT) {
+ rspamd_cl_chunk_skipc (chunk, *++p);
chunk->pos = p;
while (p < chunk->end) {
if (*p == '\n') {
rspamd_cl_chunk_skipc (chunk, *++p);
- break;
+ goto start;
}
rspamd_cl_chunk_skipc (chunk, *++p);
}
}
- else if (*p == '*') {
+ else if (p[1] == '*') {
+ rspamd_cl_chunk_skipc (chunk, *++p);
comments_nested ++;
rspamd_cl_chunk_skipc (chunk, *++p);
@@ -112,7 +115,7 @@ rspamd_cl_skip_comments (struct rspamd_cl_parser *parser, GError **err)
comments_nested --;
if (comments_nested == 0) {
rspamd_cl_chunk_skipc (chunk, *++p);
- break;
+ goto start;
}
}
rspamd_cl_chunk_skipc (chunk, *++p);
@@ -693,7 +696,7 @@ rspamd_cl_parse_string_value (struct rspamd_cl_parser *parser,
p = chunk->pos;
while (p < chunk->end) {
- if (rspamd_cl_lex_is_atom_end (*p)) {
+ if (rspamd_cl_lex_is_atom_end (*p) || rspamd_cl_lex_is_comment (p[0], p[1])) {
break;
}
rspamd_cl_chunk_skipc (chunk, *p);
@@ -775,6 +778,7 @@ rspamd_cl_parse_value (struct rspamd_cl_parser *parser, struct rspamd_cl_chunk *
const guchar *p, *c;
struct rspamd_cl_stack *st;
rspamd_cl_object_t *obj = NULL;
+ guint stripped_spaces;
p = chunk->pos;
@@ -860,8 +864,13 @@ rspamd_cl_parse_value (struct rspamd_cl_parser *parser, struct rspamd_cl_chunk *
return FALSE;
}
if (!rspamd_cl_maybe_parse_boolean (obj, c, chunk->pos - c)) {
- obj->value.sv = g_malloc (chunk->pos - c + 1);
- rspamd_strlcpy (obj->value.sv, c, chunk->pos - c + 1);
+ /* Cut trailing spaces */
+ stripped_spaces = 0;
+ while (g_ascii_isspace (*(chunk->pos - 1 - stripped_spaces))) {
+ stripped_spaces ++;
+ }
+ obj->value.sv = g_malloc (chunk->pos - c + 1 - stripped_spaces);
+ rspamd_strlcpy (obj->value.sv, c, chunk->pos - c + 1 - stripped_spaces);
rspamd_cl_unescape_json_string (obj->value.sv);
obj->type = RSPAMD_CL_STRING;
}