RCL_CHARACTER_VALUE_END, 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_WHITESPACE|RCL_CHARACTER_VALUE_END,
-RCL_CHARACTER_WHITESPACE, RCL_CHARACTER_WHITESPACE,
-RCL_CHARACTER_WHITESPACE|RCL_CHARACTER_VALUE_END, RCL_CHARACTER_DENIED,
+RCL_CHARACTER_WHITESPACE|RCL_CHARACTER_WHITESPACE_UNSAFE,
+RCL_CHARACTER_WHITESPACE_UNSAFE|RCL_CHARACTER_VALUE_END,
+RCL_CHARACTER_WHITESPACE_UNSAFE, RCL_CHARACTER_WHITESPACE_UNSAFE,
+RCL_CHARACTER_WHITESPACE_UNSAFE|RCL_CHARACTER_VALUE_END, 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_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_WHITESPACE|RCL_CHARACTER_WHITESPACE_UNSAFE|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_KEY_START|RCL_CHARACTER_KEY|RCL_CHARACTER_VALUE_STR
};
-
-
#endif /* RCL_CHARTABLE_H_ */
/* We are now at the end of the key, need to parse the rest */
while (p < chunk->end) {
- if (g_ascii_isspace (*p)) {
+ if (rcl_test_character (*p, RCL_CHARACTER_WHITESPACE)) {
rspamd_cl_chunk_skipc (chunk, *p);
p ++;
}
/* Create a new object */
nobj = rspamd_cl_object_new ();
nobj->key = g_malloc (end - c + 1);
+ if (nobj->key == NULL) {
+ rspamd_cl_set_err (chunk, RSPAMD_CL_EINTERNAL, "cannot allocate memory for a key", err);
+ return FALSE;
+ }
if (parser->flags & RSPAMD_CL_FLAG_KEY_LOWERCASE) {
rspamd_strlcpy_tolower (nobj->key, c, end - c + 1);
}
struct rspamd_cl_stack *st;
rspamd_cl_object_t *obj = NULL;
guint stripped_spaces;
+ gint str_len;
p = chunk->pos;
return FALSE;
}
obj->value.sv = g_malloc (chunk->pos - c - 1);
+ if (obj->value.sv == NULL) {
+ rspamd_cl_set_err (chunk, RSPAMD_CL_EINTERNAL, "cannot allocate memory for a string", err);
+ return FALSE;
+ }
rspamd_strlcpy (obj->value.sv, c + 1, chunk->pos - c - 1);
rspamd_cl_unescape_json_string (obj->value.sv);
obj->type = RSPAMD_CL_STRING;
break;
default:
/* Skip any spaces and comments */
- if (g_ascii_isspace (*p) ||
+ if (rcl_test_character (*p, RCL_CHARACTER_WHITESPACE) ||
rspamd_cl_lex_is_comment (p[0], p[1])) {
- while (p < chunk->end && g_ascii_isspace (*p)) {
+ while (p < chunk->end && rcl_test_character (*p, RCL_CHARACTER_WHITESPACE)) {
rspamd_cl_chunk_skipc (chunk, *p);
p ++;
}
if (!rspamd_cl_maybe_parse_boolean (obj, c, chunk->pos - c)) {
/* Cut trailing spaces */
stripped_spaces = 0;
- while (g_ascii_isspace (*(chunk->pos - 1 - stripped_spaces))) {
+ while (rcl_test_character (*(chunk->pos - 1 - stripped_spaces),
+ RCL_CHARACTER_WHITESPACE)) {
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);
+ str_len = chunk->pos - c + 1 - stripped_spaces;
+ if (str_len <= 0) {
+ rspamd_cl_set_err (chunk, RSPAMD_CL_ESYNTAX, "string value must not be empty", err);
+ return FALSE;
+ }
+ obj->value.sv = g_malloc (str_len);
+ if (obj->value.sv == NULL) {
+ rspamd_cl_set_err (chunk, RSPAMD_CL_EINTERNAL, "cannot allocate memory for a string", err);
+ return FALSE;
+ }
+ rspamd_strlcpy (obj->value.sv, c, str_len);
obj->type = RSPAMD_CL_STRING;
}
parser->state = RSPAMD_RCL_STATE_AFTER_VALUE;
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);
- rspamd_cl_unescape_json_string (obj->value.sv);
+ /* Cut trailing spaces */
+ stripped_spaces = 0;
+ while (rcl_test_character (*(chunk->pos - 1 - stripped_spaces),
+ RCL_CHARACTER_WHITESPACE)) {
+ stripped_spaces ++;
+ }
+ str_len = chunk->pos - c + 1 - stripped_spaces;
+ if (str_len <= 0) {
+ rspamd_cl_set_err (chunk, RSPAMD_CL_ESYNTAX, "string value must not be empty", err);
+ return FALSE;
+ }
+ obj->value.sv = g_malloc (str_len);
+ if (obj->value.sv == NULL) {
+ rspamd_cl_set_err (chunk, RSPAMD_CL_EINTERNAL, "cannot allocate memory for a string", err);
+ return FALSE;
+ }
+ rspamd_strlcpy (obj->value.sv, c, str_len);
obj->type = RSPAMD_CL_STRING;
}
parser->state = RSPAMD_RCL_STATE_AFTER_VALUE;
p = chunk->pos;
while (p < chunk->end) {
- if (*p == ' ' || *p == '\t') {
+ if (rcl_test_character (*p, RCL_CHARACTER_WHITESPACE)) {
/* Skip whitespaces */
rspamd_cl_chunk_skipc (chunk, *p);
p ++;
p ++;
/* Skip spaces at the beginning */
while (p < chunk->end) {
- if (g_ascii_isspace (*p)) {
+ if (rcl_test_character (*p, RCL_CHARACTER_WHITESPACE_UNSAFE)) {
rspamd_cl_chunk_skipc (chunk, *p);
p ++;
}
/* We are at the end of a macro */
/* Skip ';' and space characters and return to previous state */
while (p < chunk->end) {
- if (!g_ascii_isspace (*p) && *p != ';') {
+ if (!rcl_test_character (*p, RCL_CHARACTER_WHITESPACE_UNSAFE) && *p != ';') {
break;
}
rspamd_cl_chunk_skipc (chunk, *p);
break;
case RSPAMD_RCL_STATE_KEY:
/* Skip any spaces */
- while (p < chunk->end && g_ascii_isspace (*p)) {
+ while (p < chunk->end && rcl_test_character (*p, RCL_CHARACTER_WHITESPACE_UNSAFE)) {
rspamd_cl_chunk_skipc (chunk, *p);
p ++;
}
p = chunk->pos;
break;
case RSPAMD_RCL_STATE_MACRO_NAME:
- if (!g_ascii_isspace (*p)) {
+ if (!rcl_test_character (*p, RCL_CHARACTER_WHITESPACE_UNSAFE)) {
rspamd_cl_chunk_skipc (chunk, *p);
p ++;
}
}
/* Now we need to skip all spaces */
while (p < chunk->end) {
- if (!g_ascii_isspace (*p)) {
+ if (!rcl_test_character (*p, RCL_CHARACTER_WHITESPACE_UNSAFE)) {
if (rspamd_cl_lex_is_comment (p[0], p[1])) {
/* Skip comment */
if (!rspamd_cl_skip_comments (parser, err)) {