ext4_utils: Fix a looping bug and memory leak

Test: built without seeing the compiler warnings.
Change-Id: Ia277667b62323852f493a24b53ba3a34222c4f0e
diff --git a/ext4_utils/make_ext4fs.c b/ext4_utils/make_ext4fs.c
index 58069f3..2eeddb5 100644
--- a/ext4_utils/make_ext4fs.c
+++ b/ext4_utils/make_ext4fs.c
@@ -157,7 +157,7 @@
 	struct dirent **namelist = NULL;
 	struct stat stat;
 	int ret;
-	int i;
+	int i, j;
 	u32 inode;
 	u32 entry_inode;
 	u32 dirs = 0;
@@ -194,21 +194,21 @@
 	if (dentries == NULL)
 		critical_error_errno("malloc");
 
-	for (i = 0; i < entries; i++) {
-		dentries[i].filename = strdup(namelist[i]->d_name);
+	for (i = j = 0; i < entries; i++, j++) {
+		dentries[i].filename = strdup(namelist[j]->d_name);
 		if (dentries[i].filename == NULL)
 			critical_error_errno("strdup");
 
-		asprintf(&dentries[i].path, "%s%s", dir_path, namelist[i]->d_name);
-		asprintf(&dentries[i].full_path, "%s%s", full_path, namelist[i]->d_name);
+		asprintf(&dentries[i].path, "%s%s", dir_path, namelist[j]->d_name);
+		asprintf(&dentries[i].full_path, "%s%s", full_path, namelist[j]->d_name);
 
-		free(namelist[i]);
+		free(namelist[j]);
 
 		ret = lstat(dentries[i].full_path, &stat);
 		if (ret < 0) {
 			error_errno("lstat");
+			free(dentries[i].filename);
 			i--;
-			entries--;
 			continue;
 		}
 
@@ -265,10 +265,11 @@
 			readlink(dentries[i].full_path, dentries[i].link, info.block_size - 1);
 		} else {
 			error("unknown file type on %s", dentries[i].path);
+			free(dentries[i].filename);
 			i--;
-			entries--;
 		}
 	}
+	entries -= j - i;
 	free(namelist);
 
 	if (needs_lost_and_found) {
@@ -761,6 +762,7 @@
 
 	if (info.len <= 0) {
 		fprintf(stderr, "filesystem size too small\n");
+		free(mountpoint);
 		return EXIT_FAILURE;
 	}