some more input validation
authorFelix Fietkau <nbd@openwrt.org>
Wed, 30 Jul 2008 19:37:24 +0000 (21:37 +0200)
committerFelix Fietkau <nbd@openwrt.org>
Wed, 30 Jul 2008 19:53:30 +0000 (21:53 +0200)
file.c
util.c

diff --git a/file.c b/file.c
index c513c87a1676b4aba003d1e93accb08f52465b0b..19c6b07d6eb04b58e546b672fc6c9c119fdf5ef6 100644 (file)
--- a/file.c
+++ b/file.c
@@ -481,6 +481,9 @@ static char **uci_list_config_files(struct uci_context *ctx)
                if (!p)
                        continue;
 
+               if (!uci_validate_name(p))
+                       continue;
+
                configs[i] = buf;
                strcpy(buf, p);
                buf += strlen(buf) + 1;
diff --git a/util.c b/util.c
index 8542359da59fdb29234d47916540e6f4043606b6..3358cdf22edf5e78eb3b271ec3c1e7395437f641 100644 (file)
--- a/util.c
+++ b/util.c
@@ -101,6 +101,16 @@ static inline bool uci_validate_name(const char *str)
        return uci_validate_str(str, true);
 }
 
+static inline bool uci_validate_text(const char *str)
+{
+       while (*str) {
+               if ((*str == '\r') || (*str == '\n') ||
+                       ((*str < 32) && (*str != '\t')))
+                       return false;
+       }
+       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));
@@ -124,6 +134,8 @@ int uci_parse_tuple(struct uci_context *ctx, char *str, char **package, char **s
                goto error;
 
        *section = strsep(&str, ".");
+       *option = NULL;
+       *value = NULL;
        if (!*section)
                goto lastval;
 
@@ -145,6 +157,8 @@ lastval:
                goto error;
        if (*option && !uci_validate_name(*option))
                goto error;
+       if (*value && !uci_validate_text(*value))
+               goto error;
 
        goto done;