ソースを参照

libcompat: Do not preallocate list before the loop in scandir

Let the realloc in the loop take care of it once it's needed, this way
we get rid of an additional point of failure.
Guillem Jover 17 年 前
親
コミット
5ad592f7ef
共有1 個のファイルを変更した、6 個の追加 と 7 個の削除を含む
  1. 6 7
      lib/compat/scandir.c

+ 6 - 7
lib/compat/scandir.c

@@ -57,12 +57,8 @@ scandir(const char *dir, struct dirent ***namelist,
 	if (!d)
 		return -1;
 
-	used = 0;
-	avail = 20;
-
-	list = malloc(avail * sizeof(struct dirent *));
-	if (!list)
-		return cleanup(d, list, used);
+	list = NULL;
+	used = avail = 0;
 
 	while ((e = readdir(d)) != NULL) {
 		if (filter != NULL && !filter(e))
@@ -71,7 +67,10 @@ scandir(const char *dir, struct dirent ***namelist,
 		if (used >= avail - 1) {
 			struct dirent **newlist;
 
-			avail += avail;
+			if (avail)
+				avail *= 2;
+			else
+				avail = 20;
 			newlist = realloc(list, avail * sizeof(struct dirent *));
 			if (!newlist)
 				return cleanup(d, list, used);