add list support
[project/uci.git] / util.c
diff --git a/util.c b/util.c
index a85ec9b6b6fb8bf061f0a594a1199a73fa8b0e4e..dde7bfc96dd15c907bc387eac6faa02ab5d1b4b3 100644 (file)
--- a/util.c
+++ b/util.c
@@ -101,6 +101,17 @@ static inline bool uci_validate_name(const char *str)
        return uci_validate_str(str, true);
 }
 
+bool uci_validate_text(const char *str)
+{
+       while (*str) {
+               if ((*str == '\r') || (*str == '\n') ||
+                       ((*str < 32) && (*str != '\t')))
+                       return false;
+               str++;
+       }
+       return true;
+}
+
 static void uci_alloc_parse_context(struct uci_context *ctx)
 {
        ctx->pctx = (struct uci_parse_context *) uci_malloc(ctx, sizeof(struct uci_parse_context));
@@ -109,6 +120,7 @@ static void uci_alloc_parse_context(struct uci_context *ctx)
 int uci_parse_tuple(struct uci_context *ctx, char *str, char **package, char **section, char **option, char **value)
 {
        char *last = NULL;
+       bool internal = ctx->internal;
 
        UCI_HANDLE_ERR(ctx);
        UCI_ASSERT(ctx, str && package && section && option);
@@ -120,10 +132,13 @@ int uci_parse_tuple(struct uci_context *ctx, char *str, char **package, char **s
        }
 
        *package = strsep(&str, ".");
-       if (!*package || !uci_validate_name(*package))
+       if (!*package || !uci_validate_str(*package, false))
                goto error;
 
        *section = strsep(&str, ".");
+       *option = NULL;
+       if (value)
+               *value = NULL;
        if (!*section)
                goto lastval;
 
@@ -141,10 +156,12 @@ lastval:
                *value = last;
        }
 
-       if (*section && *section[0] && !uci_validate_name(*section))
+       if (*section && *section[0] && !internal && !uci_validate_name(*section))
                goto error;
        if (*option && !uci_validate_name(*option))
                goto error;
+       if (value && *value && !uci_validate_text(*value))
+               goto error;
 
        goto done;