Browse Source

Fix skipping directories in uci_list_config_files

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>
Michal 'vorner' Vaner 7 years ago
parent
commit
49ec6efbda
1 changed files with 9 additions and 5 deletions
  1. 9 5
      file.c

+ 9 - 5
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;
 	}