From a652efc7675db8b2c0571899609b42e539162141 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sat, 19 Jan 2008 18:06:06 +0100 Subject: [PATCH 1/1] clean up arg checks --- libuci.c | 4 +++- parse.c | 61 ++++++++++++++++++++++++++++++++++++------------------------- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/libuci.c b/libuci.c index 66b702d..ccf29b7 100644 --- a/libuci.c +++ b/libuci.c @@ -17,9 +17,11 @@ */ #include -#include +#include #include #include +#include + #include "libuci.h" #define DEBUG diff --git a/parse.c b/parse.c index b6ee734..9c9dc59 100644 --- a/parse.c +++ b/parse.c @@ -126,25 +126,47 @@ static char *parse_unquoted(char **str) while (**str && !isspace(**str)) *str += 1; - **str = 0; - *str += 1; + + if (**str) { + **str = 0; + *str += 1; + } return val; } -static char *next_arg(char **str) +static char *next_arg(struct uci_context *ctx, char **str, bool required) { + char *val; skip_whitespace(str); switch (**str) { case '"': - return parse_double_quote(str); + val = parse_double_quote(str); case '\'': - return parse_single_quote(str); + val = parse_single_quote(str); case 0: - return NULL; + val = NULL; default: - return parse_unquoted(str); + val = parse_unquoted(str); + } + + if (required && !val) { + ctx->pctx->byte = *str - ctx->pctx->buf; + UCI_THROW(ctx, UCI_ERR_PARSE); + } + + return val; +} + +static void assert_eol(struct uci_context *ctx, char **str) +{ + char *tmp; + + tmp = next_arg(ctx, str, false); + if (tmp) { + ctx->pctx->byte = tmp - ctx->pctx->buf; + UCI_THROW(ctx, UCI_ERR_PARSE); } } @@ -159,13 +181,10 @@ static void uci_parse_config(struct uci_context *ctx, char **str) UCI_THROW(ctx, UCI_ERR_PARSE); } - type = next_arg(str); - if (!type) { - ctx->pctx->byte = *str - ctx->pctx->buf; - UCI_THROW(ctx, UCI_ERR_PARSE); - } - - name = next_arg(str); + type = next_arg(ctx, str, true); + name = next_arg(ctx, str, false); + assert_eol(ctx, str); + DPRINTF("Section<%s>: %s\n", type, name); } @@ -175,17 +194,9 @@ static void uci_parse_option(struct uci_context *ctx, char **str) *str += strlen(*str) + 1; - name = next_arg(str); - if (!name) { - ctx->pctx->byte = *str - ctx->pctx->buf; - UCI_THROW(ctx, UCI_ERR_PARSE); - } - - value = next_arg(str); - if (!value) { - ctx->pctx->byte = *str - ctx->pctx->buf; - UCI_THROW(ctx, UCI_ERR_PARSE); - } + name = next_arg(ctx, str, true); + value = next_arg(ctx, str, true); + assert_eol(ctx, str); DPRINTF("\tOption: %s=\"%s\"\n", name, value); } -- 2.11.0