diff options
author | bapt <bapt@FreeBSD.org> | 2014-03-22 17:28:14 +0000 |
---|---|---|
committer | bapt <bapt@FreeBSD.org> | 2014-03-22 17:28:14 +0000 |
commit | b471b8e16d6f2c205ae497402bad0a60c9cd6fa8 (patch) | |
tree | aabc973b2e4479277f8fe9aa0e8ed539826fdca3 /contrib/libucl/src/ucl_parser.c | |
parent | 841158cbfbfc6b699dbc10892c6cb878a66a5d7e (diff) | |
parent | 6b4d859b54b28a9d46c317ff21676aa37241f6de (diff) | |
download | FreeBSD-src-b471b8e16d6f2c205ae497402bad0a60c9cd6fa8.zip FreeBSD-src-b471b8e16d6f2c205ae497402bad0a60c9cd6fa8.tar.gz |
Update to 20140321
This brings schema validation
MFC after: 1 week
Diffstat (limited to 'contrib/libucl/src/ucl_parser.c')
-rw-r--r-- | contrib/libucl/src/ucl_parser.c | 85 |
1 files changed, 71 insertions, 14 deletions
diff --git a/contrib/libucl/src/ucl_parser.c b/contrib/libucl/src/ucl_parser.c index 12ebad2..a067286 100644 --- a/contrib/libucl/src/ucl_parser.c +++ b/contrib/libucl/src/ucl_parser.c @@ -544,6 +544,10 @@ ucl_add_parser_stack (ucl_object_t *obj, struct ucl_parser *parser, bool is_arra } st = UCL_ALLOC (sizeof (struct ucl_stack)); + if (st == NULL) { + ucl_set_err (parser->chunks, 0, "cannot allocate memory for an object", &parser->err); + return NULL; + } st->obj = obj; st->level = level; LL_PREPEND (parser->stack, st); @@ -554,12 +558,13 @@ ucl_add_parser_stack (ucl_object_t *obj, struct ucl_parser *parser, bool is_arra int ucl_maybe_parse_number (ucl_object_t *obj, - const char *start, const char *end, const char **pos, bool allow_double, bool number_bytes) + const char *start, const char *end, const char **pos, + bool allow_double, bool number_bytes, bool allow_time) { const char *p = start, *c = start; char *endptr; bool got_dot = false, got_exp = false, need_double = false, - is_date = false, valid_start = false, is_hex = false, + is_time = false, valid_start = false, is_hex = false, is_neg = false; double dv = 0; int64_t lv = 0; @@ -657,7 +662,8 @@ ucl_maybe_parse_number (ucl_object_t *obj, } /* Now check endptr */ - if (endptr == NULL || ucl_lex_is_atom_end (*endptr) || *endptr == '\0') { + if (endptr == NULL || ucl_lex_is_atom_end (*endptr) || *endptr == '\0' || + ucl_test_character (*endptr, UCL_CHARACTER_WHITESPACE_UNSAFE)) { p = endptr; goto set_obj; } @@ -678,7 +684,7 @@ ucl_maybe_parse_number (ucl_object_t *obj, need_double = true; dv = lv; } - is_date = true; + is_time = true; if (p[0] == 'm' || p[0] == 'M') { dv /= 1000.; } @@ -708,7 +714,7 @@ ucl_maybe_parse_number (ucl_object_t *obj, p ++; goto set_obj; } - else if (end - p >= 3) { + else if (allow_time && end - p >= 3) { if (tolower (p[0]) == 'm' && tolower (p[1]) == 'i' && tolower (p[2]) == 'n') { @@ -717,7 +723,7 @@ ucl_maybe_parse_number (ucl_object_t *obj, need_double = true; dv = lv; } - is_date = true; + is_time = true; dv *= 60.; p += 3; goto set_obj; @@ -737,13 +743,14 @@ ucl_maybe_parse_number (ucl_object_t *obj, break; case 'S': case 's': - if (p == end - 1 || ucl_lex_is_atom_end (p[1])) { + if (allow_time && + (p == end - 1 || ucl_lex_is_atom_end (p[1]))) { if (!need_double) { need_double = true; dv = lv; } p ++; - is_date = true; + is_time = true; goto set_obj; } break; @@ -755,12 +762,13 @@ ucl_maybe_parse_number (ucl_object_t *obj, case 'W': case 'Y': case 'y': - if (p == end - 1 || ucl_lex_is_atom_end (p[1])) { + if (allow_time && + (p == end - 1 || ucl_lex_is_atom_end (p[1]))) { if (!need_double) { need_double = true; dv = lv; } - is_date = true; + is_time = true; dv *= ucl_lex_time_multiplier (*p); p ++; goto set_obj; @@ -773,8 +781,8 @@ ucl_maybe_parse_number (ucl_object_t *obj, return EINVAL; set_obj: - if (allow_double && (need_double || is_date)) { - if (!is_date) { + if (allow_double && (need_double || is_time)) { + if (!is_time) { obj->type = UCL_FLOAT; } else { @@ -803,7 +811,8 @@ ucl_lex_number (struct ucl_parser *parser, const unsigned char *pos; int ret; - ret = ucl_maybe_parse_number (obj, chunk->pos, chunk->end, (const char **)&pos, true, false); + ret = ucl_maybe_parse_number (obj, chunk->pos, chunk->end, (const char **)&pos, + true, false, ((parser->flags & UCL_PARSER_NO_TIME) == 0)); if (ret == 0) { chunk->remain -= pos - chunk->pos; @@ -1308,6 +1317,9 @@ ucl_parse_value (struct ucl_parser *parser, struct ucl_chunk *chunk) obj = ucl_get_value_object (parser); /* We have a new object */ obj = ucl_add_parser_stack (obj, parser, false, parser->stack->level); + if (obj == NULL) { + return false; + } ucl_chunk_skipc (chunk, p); return true; @@ -1316,6 +1328,9 @@ ucl_parse_value (struct ucl_parser *parser, struct ucl_chunk *chunk) obj = ucl_get_value_object (parser); /* We have a new array */ obj = ucl_add_parser_stack (obj, parser, true, parser->stack->level); + if (obj == NULL) { + return false; + } ucl_chunk_skipc (chunk, p); return true; @@ -1608,6 +1623,9 @@ ucl_state_machine (struct ucl_parser *parser) else { obj = ucl_add_parser_stack (NULL, parser, false, 0); } + if (obj == NULL) { + return false; + } parser->top_obj = obj; parser->cur_obj = obj; parser->state = UCL_STATE_INIT; @@ -1673,7 +1691,11 @@ ucl_state_machine (struct ucl_parser *parser) else if (parser->state != UCL_STATE_MACRO_NAME) { if (next_key && parser->stack->obj->type == UCL_OBJECT) { /* Parse more keys and nest objects accordingly */ - obj = ucl_add_parser_stack (parser->cur_obj, parser, false, parser->stack->level + 1); + obj = ucl_add_parser_stack (parser->cur_obj, parser, false, + parser->stack->level + 1); + if (obj == NULL) { + return false; + } } else { parser->state = UCL_STATE_VALUE; @@ -1787,6 +1809,9 @@ ucl_parser_new (int flags) struct ucl_parser *new; new = UCL_ALLOC (sizeof (struct ucl_parser)); + if (new == NULL) { + return NULL; + } memset (new, 0, sizeof (struct ucl_parser)); ucl_parser_register_macro (new, "include", ucl_include_handler, new); @@ -1808,7 +1833,13 @@ ucl_parser_register_macro (struct ucl_parser *parser, const char *macro, { struct ucl_macro *new; + if (macro == NULL || handler == NULL) { + return; + } new = UCL_ALLOC (sizeof (struct ucl_macro)); + if (new == NULL) { + return; + } memset (new, 0, sizeof (struct ucl_macro)); new->handler = handler; new->name = strdup (macro); @@ -1851,6 +1882,9 @@ ucl_parser_register_variable (struct ucl_parser *parser, const char *var, else { if (new == NULL) { new = UCL_ALLOC (sizeof (struct ucl_variable)); + if (new == NULL) { + return; + } memset (new, 0, sizeof (struct ucl_variable)); new->var = strdup (var); new->var_len = strlen (var); @@ -1873,8 +1907,16 @@ ucl_parser_add_chunk (struct ucl_parser *parser, const unsigned char *data, { struct ucl_chunk *chunk; + if (data == NULL || len == 0) { + ucl_create_err (&parser->err, "invalid chunk added"); + return false; + } if (parser->state != UCL_STATE_ERROR) { chunk = UCL_ALLOC (sizeof (struct ucl_chunk)); + if (chunk == NULL) { + ucl_create_err (&parser->err, "cannot allocate chunk structure"); + return false; + } chunk->begin = data; chunk->remain = len; chunk->pos = chunk->begin; @@ -1895,3 +1937,18 @@ ucl_parser_add_chunk (struct ucl_parser *parser, const unsigned char *data, return false; } + +bool +ucl_parser_add_string (struct ucl_parser *parser, const char *data, + size_t len) +{ + if (data == NULL) { + ucl_create_err (&parser->err, "invalid string added"); + return false; + } + if (len == 0) { + len = strlen (data); + } + + return ucl_parser_add_chunk (parser, (const unsigned char *)data, len); +} |