Fix skipping directories in uci_list_config_files
authorMichal 'vorner' Vaner <michal.vaner@nic.cz>
Tue, 22 Nov 2016 15:50:24 +0000 (16:50 +0100)
committerFelix Fietkau <nbd@nbd.name>
Wed, 23 Nov 2016 19:40:26 +0000 (20:40 +0100)
Don't create a hole in the array of configs if there's a directory. Such
a hole would be mistaken for the end of the array.

Signed-off-by: Michal 'vorner' Vaner <michal.vaner@nic.cz>
file.c

diff --git a/file.c b/file.c
index 7e1e4e6f0ddcdbb545c4e83efda52fb33031374a..5a8c6cb51bb143fe23c5e272cc0a0805ff17b0fa 100644 (file)
--- a/file.c
+++ b/file.c
@@ -835,7 +835,7 @@ static char **uci_list_config_files(struct uci_context *ctx)
 {
        char **configs;
        glob_t globbuf;
-       int size, i;
+       int size, i, j, skipped;
        char *buf;
        char *dir;
 
@@ -847,18 +847,22 @@ static char **uci_list_config_files(struct uci_context *ctx)
        }
 
        size = sizeof(char *) * (globbuf.gl_pathc + 1);
+       skipped = 0;
        for(i = 0; i < globbuf.gl_pathc; i++) {
                char *p;
 
                p = get_filename(globbuf.gl_pathv[i]);
-               if (!p)
+               if (!p) {
+                       skipped++;
                        continue;
+               }
 
                size += strlen(p) + 1;
        }
 
-       configs = uci_malloc(ctx, size);
-       buf = (char *) &configs[globbuf.gl_pathc + 1];
+       configs = uci_malloc(ctx, size - skipped);
+       buf = (char *) &configs[globbuf.gl_pathc + 1 - skipped];
+       j = 0;
        for(i = 0; i < globbuf.gl_pathc; i++) {
                char *p;
 
@@ -869,7 +873,7 @@ static char **uci_list_config_files(struct uci_context *ctx)
                if (!uci_validate_package(p))
                        continue;
 
-               configs[i] = buf;
+               configs[j++] = buf;
                strcpy(buf, p);
                buf += strlen(buf) + 1;
        }