Преглед изворни кода

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 пре 16 година
родитељ
комит
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);